Воскресенье, 06-07-2008, 11:45 Приветствую Вас Гость, пожалуйста зарегистрируйтесь!


Всё для Warcraft 3

Главная | Форум | Регистрация | Вход | RSS | MAP
[ Файлы | Статьи | Обои ]
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из1
Модератор форума: BL-AF, Эллесар 
Форум о Warcraft 3 » Раздел для картостроителей » JASS » Триггеры в JASS (Анализ.)
Триггеры в JASS
VedunДата: Четверг, 19-04-2007, 23:03 | Сообщение # 1
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

JASS – триггеры в виде кода.
Недавно я подумал, что уже довольно давно не писал статей и решил написать статью на тему триггеры в понимании JASS.

Собственно, вот то, что из этого вышло.

Итак, триггер. Вспомним, из чего он состоит.


  • События.
  • Условия.
  • Действия.

И начнём мы с общего анализа триггера в текстовом виде. Для примера создадим триггер с названием Sample. Добавим в него событие Игрок красный выигрывает (Игрок - Victory). Теперь – условие: Игрока красного контролирует человек (Player Controller Comparison). Ну и в качестве действия выведем на экран строку: «Вы выиграли!!!» (действие Игра – Text Message). Теперь у нас есть триггер. Переведя его в текст, мы получим это:
Code
function Trig_Sample_Conditions takes nothing returns boolean <br />      if ( not ( GetPlayerController(Player(0)) == MAP_CONTROL_USER ) ) then <br />          return false <br />      endif <br />      return true <br /> endfunction <p> function Trig_Sample_Actions takes nothing returns nothing <br />      call DisplayTextToForce( GetPlayersAll(), "Вы выиграли!!!" ) <br /> endfunction <p> //======================================================== <br /> function InitTrig_Sample takes nothing returns nothing <br />      set gg_trg_Sample = CreateTrigger(  ) <br />      call TriggerRegisterPlayerEventVictory( gg_trg_Sample, Player(0) ) <br />      call TriggerAddCondition( gg_trg_Sample, Condition( function Trig_Sample_Conditions ) ) <br />      call TriggerAddAction( gg_trg_Sample, function Trig_Sample_Actions ) <br /> endfunction

У нас есть три функции. Начать стоит с самой последней (InitTrig_Sample). Как видно, её название состоит из приставки InitTrig_ и названия триггера. InitTrig – инициализация триггера. В этой функции триггер регистрируется в игре. Это происходит в первой троке:
Code
set gg_trg_Sample = CreateTrigger(  )

gg_trg_Sample – это что то вроде глобальной переменной (ubg_), но используется она только для триггеров. То есть создаётся новый триггер, который записывается в переменную.
Следующая строка – регистрация события. Собственно, чтобы добавить событие, нужно вызвать соответствующую функцию (в нашем случае TriggerRegisterPlayerEventVictory) и передать в неё все параметры (gg_trg_Sample, Player(0)).

*Примечание.
Событие Map initialization – особый случай и о нём мы поговорим позднее.

Далее идёт добавление условия:
Code
call TriggerAddCondition( gg_trg_Sample, Condition( function Trig_Sample_Conditions ) )

Здесь принцип несколько другой, чем для добавления событий. Функция добавления условий одна (TriggerAddCondition). В неё мы передаём триггер и функцию с условиями. Теперь посмотрим на саму функцию с условиями.
Там всё чрезвычайно запутанно. Но ведь в этом и цель ВЕ – запутать всех и вся =). В конце концов весь этот код можно свести к одной строчке:
Code
return GetPlayerController(Player(0)) == MAP_CONTROL_USER

*Примечание.
Добавлять условия в функцию InitTrig_*** ВЕ будет только тогда, когда эти условия добавлены именно в блок с условиями триггера. Если же, например, мы использовали действие if / then / else, то функция с условиями создастся, но в функцию инициализации триггера она не добавится. В триггере можно создавать сколько угодно отдельных функций, которые не должны нигде указываться.

Добавлено (19-04-2007, 11:03 Pm)
---------------------------------------------

С условиями разобрались. Посмотрим теперь на действие. Собственно, здесь всё аналогично условию (за исключением названия функции =). Так что объяснять всё подробно нет смысла.

Вот вкратце об устройстве триггеров. Теперь немного поговорим об оптимизации. Я уже немного говорил об этом (условие), но теперь стоит сказать зачем это вообще надо.
Ну, первый факт, это конечно удобство. Ведь если каждое условие будет создавать новую функцию, в которой будут тонны ненужных операторов… Всё это в конце концов приведёт к хронической головной боли. Далее. Лишняя нагрузка – лишний геморрой. Да и к тому же гораздо проще разобраться в триггере (постороннему человеку) когда он решит поподробней рассмотреть наработку =).
Но вот хуже всего в ВЕ реализованы циклы, которые перебирают всех юнитов в определённой области. Предположим, мы хотим убить всех юнитов на карте. Опущу подробности такого сложного триггера =) и приведу его сразу на JASS:
Code
function Trig_KillAllUnit_Func001A takes nothing returns nothing <br />      // Здесь действия цикла <br />      call KillUnit( GetEnumUnit() ) <br /> endfunction <p> function Trig_KillAllUnit_Actions takes nothing returns nothing <br />      // Здесь действия функции <br />      call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_KillAllUnit_Func001A ) <br /> endfunction

К сожалению, объединить данную конструкцию в одну функцию нельзя. Но можно сделать её несколь-ко красивее. Например, так:
Code
function KILL takes nothing returns nothing <br />      call KillUnit(GetEnumUnit()) <br /> endfunction <p> function Trig_KillAllUnit_Actions takes nothing returns nothing <br />      call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function KILL ) <br /> endfunction

В такие функции-циклы нельзя передавать параметры. То есть, для передачи данных в них надо использовать переменные (или аналогичные способы передачи данных, о которых я расскажу в следующих статьях).

Теперь отдельный разговор о событии Map Initialization. На самом деле, это даже не событие. Оно никак и нигде не регистрируется. Такие триггеры исполняются во время инициализации потоков игры. Соответственно серьёзные ошибки в таких триггерах могут привести к краху этих самых потоков.

И в конце ещё одно примечание.
Код из действия Custom Script остаётся неизменным при переводе с GUI на JASS.

Вот я и рассказал о триггерах. Если дойдут руки до следующей части о триггерах, опишу их создание динамически (что очень часто бывает чрезвычайно полезным). А пока на этом всё. Жду комментов.



Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

ShtirlizДата: Пятница, 20-04-2007, 13:57 | Сообщение # 2
Группа: Удаленные






Прикольно! Один вопрос: лолго всё это писал? Я даже читать устал! :D :p :D
VedunДата: Пятница, 20-04-2007, 13:59 | Сообщение # 3
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

Писал недолго. Главное желание. =)

Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

ShtirlizДата: Суббота, 21-04-2007, 12:34 | Сообщение # 4
Группа: Удаленные






Vedun, слышь вопросик по jassу такой: Ну допустим я че то в нем сделал а как в мапу это запихать?
VedunДата: Суббота, 21-04-2007, 13:01 | Сообщение # 5
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

Ну для этого есть несколько способов.
1. Запихать в карту через MPQ редактор (самый гемморойный способ). Используется когда надо скрыть код.

2. Самый частый - добавить в нестандартный код карты (Редактор триггеров --- Окно со списком триггеров --- В самом верху будет иконка с названием карты --- Жмёшь туда). Всё, что ты там введёшь будет НАД остальными триггерами (обязательное условие, если ты будешь использовать свои функции везде).

3. Можно запихать прямо в триггеры (если ты внимательно прочитал написанную выше статью). Надо оставить функцию инициализации триггера, но убрать из неё регистрацию действий (опять же читай статью). А свои функции просто записываешь в триггер.


Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

ShtirlizДата: Суббота, 21-04-2007, 22:23 | Сообщение # 6
Группа: Удаленные






Quote
Ну для этого есть несколько способов.
1. Запихать в карту через MPQ редактор (самый гемморойный способ). Используется когда надо скрыть код.
2. Самый частый - добавить в нестандартный код карты (Редактор триггеров --- Окно со списком триггеров --- В самом верху будет иконка с названием карты --- Жмёшь туда). Всё, что ты там введёшь будет НАД остальными триггерами (обязательное условие, если ты будешь использовать свои функции везде).

3. Можно запихать прямо в триггеры (если ты внимательно прочитал написанную выше статью). Надо оставить функцию инициализации триггера, но убрать из неё регистрацию действий (опять же читай статью). А свои функции просто записываешь в триггер.


Спасибо!
VedunДата: Суббота, 21-04-2007, 22:36 | Сообщение # 7
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

Всегда готов

Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

[]rcДата: Воскресенье, 22-04-2007, 19:43 | Сообщение # 8
Генерал-лейтенант
Группа: Проверенные
Сообщений: 721
Репутация: 58 [14%]

Vedun, а ты будешь мапу под замок ставить как Доту?

IMT presents WaCraft 3 New Wars
VedunДата: Воскресенье, 22-04-2007, 19:55 | Сообщение # 9
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

Да. Слишком много моих старых и новых наработок в ней будет. Такое за просто так не раздают. =)

Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

LordickДата: Воскресенье, 12-08-2007, 22:04 | Сообщение # 10
Полковник
Группа: Проверенные
Сообщений: 152
Репутация: 32 [8%]

Vedun а когда будит следующая стотья (хотя из этой я не чеге не понял:-)

Кто раньше встал-тот лучше всех оделся!
ПАРКУР FOREvER
VedunДата: Понедельник, 13-08-2007, 21:54 | Сообщение # 11
Подполковник
Группа: Проверенные
Сообщений: 129
Репутация: 39 [9%]

Lordick, хз. Для статей нужны темы. Хотел написать о мультибоардах, но наткнулся на другую статью (на бру помоему она была), в которой описаны просто все тонкости мультибоарда.

Так что если кому то интересен не отдельный вопрос, а полное описание чего то - пишите здесь. Постараюсь писать новые статьи.

Кст, ещё одна просьба. Оцените плз мои статьи и напишите недодастки и достоинства (чтобы знать что исправить или добавить).

Добавлено (13-08-2007, 9:54 Pm)
---------------------------------------------
Хотя мне пришла идея написать статью о кеше и РБ. Если кому то это надо - напишу.


Я ведь... Сам должен командовать! © Артес

Если кому-то требуется моя помощь - пишите в аську, ибо общаться через ЛС очень сложно.

[]rcДата: Пятница, 12-10-2007, 09:17 | Сообщение # 12
Генерал-лейтенант
Группа: Проверенные
Сообщений: 721
Репутация: 58 [14%]

Уг!
Quote (Vedun)
Хотя мне пришла идея написать статью о кеше и РБ. Если кому то это надо - напишу.

Про кеш буду писать я эгж!
[

IMT presents WaCraft 3 New Wars
MaSerДата: Воскресенье, 14-10-2007, 19:50 | Сообщение # 13
Генерал-майор
Группа: Проверенные
Сообщений: 447
Репутация: 29 [7%]

[]rc, про кешь уже висит моя статья в каталоге... Vedun, а вот про РБ напиши, будет полезно.
Форум о Warcraft 3 » Раздел для картостроителей » JASS » Триггеры в JASS (Анализ.)
Страница 1 из1
Поиск:

Rambler's Top100