Записи участника (Ty3uK) - Форум


Правила форума ·

  • Страница 10 из 10
  • «
  • 1
  • 2
  • 8
  • 9
  • 10
Результаты поиска

Ty3uK

#138 | Тема: Учимся рационально Enum'ить декорации
Всем доброго утра/дня/вечера/ночи. Недавно я учил свои заклинания корректно работать с окружающим миром, и конечно же встал вопрос: а как же можно делать выборку дектораций без локальных ректов? Напомню, что основополагающая функция выбора дектораций - это функция
[jass]native EnumDestructablesInRect takes rect r, boolexpr filter, code actionFunc returns nothing[/jass]
она собирает декорации в определенном ректе. Все сразу же подумали "ну а что такого-то в локальных ректах? создаем, удаляем, эка невидаль". Ан нет, мои друзья, ректы сильно грузят процессор (доходит до такого, что спелл без утечек начинает лагать как первый опыт гуишника по созданию "ультрамегагиперкрутого заклинания"). Я нашел выход (возможно, их может быть и несколько, мне пришел в голову только один). О нем ниже.

Итак, какой же способ я придумал? А все очень просто - мы выбираем все декорации на карте с помощью статичного глобального ректа bj_mapInitialPlayableArea, высчитываем расстояние между взятой декорацией и точкой, от которой идет отсчет, и, если она удовлетворяет нашим требованиям - мы производим с ней действия. Немного полистав учебник геометрии и вспомнив из векторной геометрии, как можно вычислить расстояние между координатами, я написал такую функцию:

которая возвращает нам расстояние между координатами. Итак, ядро у нас есть, давайте накинем на него "мяска". Полный листинг своего спелла я приводить не буду (вы можете увидеть его в моей карте Simple Shooter под названием MK209), приведу лишь необходимую часть кода:

Итак, что мы сделали? Занесли кастера в переменную, выбрали все декорации на карте и после сравнения расстояния убили все декорации в радиусе 300. от юнита. "Систему" можно совершенствовать как угодно (например, через сравнение GetDestructableTypeId() сравнивать тип декорации и уничтожать только деревья), все ограничено только вашей фантазией. К... Кхм... "Статье" я приложил карту-пример. Спасибо всем за внимание, до новых встреч smile

Maxim Karelov aka Ty3uK © 2012
Сообщение отредактировал Ty3uK - Чт, 15.03.12, 12:40
Аниме - такая вещь, которая балансирует на грани "надоевшего" и "нового" из-за Наруто в основном. © [DUOS]
GUI Must Die v1.1 | Arena Multiboard

Ty3uK

#141 | Тема: Шапка.
Есть предложение сделать информер в шапке с возможностью скрытия (он будет уезжать в верх и скрываться по нажатию на кнопку)
Аниме - такая вещь, которая балансирует на грани "надоевшего" и "нового" из-за Наруто в основном. © [DUOS]
GUI Must Die v1.1 | Arena Multiboard

Ty3uK

#142 | Тема: JASP
JASP - небольшой препроцессор скрипта, который запускается перед парсерами cJass и vJass. Пока что возможностей мало, но и самой программе отроду всего 4 дня. Ниже о возможностях.

Возможности

Возможностей пока очень мало, а именно - две. Первая - упрощенное объявление локальных переменных внутри кода. Рассмотрим пример:

[jass]function Test takes nothing returns nothing
new timer t;
endfunction[/jass]
мы объявляем новый локальный таймер короткой коммандой. После парсинга это ожидаемо првератится в
[jass]function Test takes nothing returns nothing
local timer t = CreateTimer()
endfunction[/jass]
Внимание! знак ; (точка с запятой) обязателен в коне строки, иначе парсер не поймет код.
На данный момент возможно объявление следующих типов подобным образом:
[jass]new timer
new group
new force
new region
new trigger
new dialog
new leaderboard
new multiboard
new quest
new texttag
new camerasetup
new hashtable[/jass]
Так же возможно объявление нескольких переменных на одной строке.
[jass]new timer t; new group g; new hashtble h;[/jass]
превратится в
[jass]local timer t = CreateTimer()
local group g = CreateGroup()
local hashtable h = InitHashtable()[/jass]
Вторая возможность - использование блока совместимости кода. Например, вы пользуетесь cJass и при помощи библиотеки cj_typesEx объявили переменную
[jass]timer t = new timer;[/jass]
Вместе с JASP получится кракозябра. Дабы не переписывать весь код был введен блок "непарсинга":
[jass]$JASP_NOPARSE_BEGIN
timer t = new timer;
$JASP_NOPARSE_END$[/jass]
превратится без изменений в
[jass]timer t = new timer;[/jass]
Пока что у этого блока есть один недостаток: парсер считывает его даже при закомментировании, поэтому не стоит делать так
[jass]//$JASP_NOPARSE_BEGIN
timer t = new timer;
//$JASP_NOPARSE_END$[/jass]
ибо это засчитается как "непарс" блок.



Что планируется дальше

Дальше думаю запилить объявление единичной глобалки в коде функции и адаптацию блока for / endfor (vJass) под cJass парсер, т.к. они конфликтуют (за идею спасибо SirNikolas'y). Пример преобразования глобалок:
[jass]global region r[/jass]уйдет в главный блок глобалок
Сообщение отредактировал Ty3uK - Пн, 02.04.12, 15:05
Аниме - такая вещь, которая балансирует на грани "надоевшего" и "нового" из-за Наруто в основном. © [DUOS]
GUI Must Die v1.1 | Arena Multiboard

Ty3uK

#145 | Тема: JASP
Даст, когда я добавлю больше возможностей. И, бтв, в JASP уже есть кое-что от паскаля- директивы flush, free и repeat until

Добавлено (09.04.12, 08:04)
---------------------------------------------
А я пока и не говорю за новые возможности. Я стараюсь максимально упростить написание кода. Пока что

Аниме - такая вещь, которая балансирует на грани "надоевшего" и "нового" из-за Наруто в основном. © [DUOS]
GUI Must Die v1.1 | Arena Multiboard
  • Страница 10 из 10
  • «
  • 1
  • 2
  • 8
  • 9
  • 10
Поиск: