Юзер
Регистрация: 02.10.2006
Сообщений: 121
Репутация: 34
|
B] Часть третья[/b]
Немного практики
Теперь прочитанный материал неплохо бы закрепить практикой. Целью является создание триггерного заклинания (спелла), которое накладывает на цель сразу 2 заклинания. В нашем, случае это будет Омоложение и Духовное пламя. Для простоты понятия мы не будем создавать кучу действий и объектов. Дайте любому герою способность духовное пламя. Внимание! Предварительно уберите требования и стоимость манны у обоих заклинаний! Создайте новый триггер и назовите его TriggerSpell. Конвертируйте в код и замените полученный код на этот:
Код:
function Trig_TriggerSpell_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'Ainf' ) ) then
return false
endif
return true
endfunction
function Trig_TriggerSpell_Actions takes nothing returns nothing
local unit op=GetTriggerUnit()
local unit fu=CreateUnit(GetOwningPlayer(op),'u000',GetUnitX(op),GetUnitY(op),270)
call UnitApplyTimedLife(fu, 'BTLF', 1.00)
call UnitAddAbility(fu,'Arej')
call IssueTargetOrderById(fu,OrderId("rejuvination"),GetSpellTargetUnit())
set op=null
set fu=null
endfunction
//===========================================================================
function InitTrig_TriggerSpell takes nothing returns nothing
set gg_trg_TriggerSpell = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_TriggerSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_TriggerSpell, Condition( function Trig_TriggerSpell_Conditions ) )
call TriggerAddAction( gg_trg_TriggerSpell, function Trig_TriggerSpell_Actions )
endfunction
Этот код весьма сложен для новичков в JASS. А потому я опишу функции, которые используются в этом коде:
local unit op=GetTriggerUnit() –Локальная переменная, которая хранит ссылку на триггерный юнит (наш герой со способностью Духовный огонь)
local unit fu=CreateUnit(GetOwningPlayer(op),'u000',GetUnitX( op),GetUnitY(op),270 – 1-я часть:Локальная переменная которая хранит ссылку на юнита.2-я часть: создается юнит (1), который относится к игроку - владельцу тригерного юнита, типа ‘u000’ (ID нашего кастера) в точке GetUnitX(op),GetUnitY(op) развернутый на 270 градусов
call UnitApplyTimedLife(fu, 'BTLF', 1.00) – Добавляет таймер кастеру (локальная переменная u), после которого он уничтожится.
call UnitAddAbility(fu,'Arej') – добавляется способность Омоложение (‘ID – Arej’)
call IssueTargetOrderById(fu,OrderId("rejuvination"),Ge tSpellTargetUnit()) – заставляет кастера использовать заклинание Омоложение (ID - Arej) на цель GetSpellTargetUnit() (это цель заклинания Духовное пламя)
function Trig_TriggerSpell_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'Ainf' ) ) then
return false
endif
Это условие, является ли способность, которую используют, духовным пламенем (ID – ‘Ainf’)
call TriggerRegisterAnyUnitEventBJ( gg_trg_TriggerSpell, EVENT_PLAYER_UNIT_SPELL_CAST )
Это событие – юнит начинает применять способность
Я повторяюсь, что для новичка в JASS это не не очень простое триггерное заклинание, но здесь используются только функции из common.j , которые не оставляют утечек в памяти. Также все локальные переменные обнуляются. Если вы не поняли этого триггера, скачайте карту-пример:http://dump.ru/files/f/f8901174473/
ReturnBug
В принципе на этом можно было завершить введение в JASS, но есть ещё 2 интересных вещи…
В JASS нельзя напрямую работать с памятью. Хотя это могло бы пригодиться. Для чего это – речь пойдет дальше. Однако есть такой баг, который позволяет получать ячейку памяти компьютера, в которой хранится объект типа handle (например, юнит)
Код:
function FindHandle takes rect reg returns integer
return reg
return 0
endfunction
Эта функция берет переменную reg типа rect и возвращает переменную типа integer, должна возвращать… Тут 2 return и получается какая-то ерунда. Игра должна вернуть регион reg, как целочисленное число, что невозможно, но тут вступает return bug. И JASS возвращает. Вообщем return bug вам конечно врятли понадобится, если вы не собираетесь создавать каких-то очень сложных систем. Под конец приведу функцию, которые позволяет находить и считывать номер ячейки памяти любого из игровых объектов (handle)
Код:
function H2I takes handle h returns integer
return h
return 0
endfunction
Чтобы присвоить integer переменной эту ячейку нужно сделать следующее:
Код:
set i = H2I(Переменная любого игрового объекта)
Кэш и JASS
Тут я не буду писать ничего насчёт КЭШа, просто скажу зачем он нужен. Кэш позволяет сохранять переменные и боевые единицы и переносить эти данные между картами. В мультиплеере переносить кэш с карты на карту нельзя. Но в мультиплеерных картах можно пользоваться КЭШем (но не переносить). Кэш используют в качестве глобального массива. Однако ячейки КЭШа не могут хранить множество handle типов, а потому используют return bug. Больше не буду ничего говорить насчёт КЭШа, так как его используют в основном в картах типа ДОТЫ и для простых карт он необязателен. Могу лишь дать ссылки на эту тему. Прочитать про КЭШ и JASS можно здесь и здесь…
Хитрости JASS
Приведу 2 очень важные вещи, отличающие простые триггеры и JASS:
Индексация игроков (также как и элементов массива) начинается с 0, это значит, что для того чтобы указать игрока 1, нужно обратиться: Player(0)
Все пути к моделям нужно проставлять через \\ , например:
"Abilities\\Spells\\Human\\ThunderClap\\ThunderCla pCaster.mdl"
Вместо заключения
Прочитав статью полностью и вникнув в нее, вы изучили основы JASS (я надеюсь). Но это лишь основы, для профессионального знания JASS нужно еще много тренироваться. Возможно вам поможет конвертирование простых триггеров в текст. В общем это все. В конечном варианте эта статья занимает около 10 страниц в Ворде и это без картинок! Писать больше не буду так как и так много.
Работаем 2
__________________
Вот так вот...
|