Раздел:
1 месяц

функции

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

создание триггера на джасс

возьмём спелл back step который сделал Karp1989 и попробуем сделать его на джасс
самым первым делом напишем в нестандартный код :
include "cj_types.j"
потом создадим триггер new back step,выделим его,нажмём правка-конвертировать в текст
вместо привычных нам событие,условие,действие появится джасс код
выделите этот код и удалите его,теперь мы получили пустой триггер в котором можем писать свой код
сначала напишите:
library backstep initializer init{



}
library значит библиотека,в ней могут находится переменные и функции
backstep название нашей библиотеки
initializer init определяет какая функция будет вызываться во время загрузки карты и производить инициализацию триггера(в данном случае это функция init)
{ открывающая фигурная скобка означает начало библиотеки/функции/структуры/много другого
} означает конец библиотеки/функции/структуры/много другого
на строчках между library backstep initializer init{ и } мы будем писать наши события,условия и действия
в джасс триггер начинается не с события а с условия или действия,мы начнём с условия
условие это функция которая нечего не берёт и возвращает bool
вот как она выглядит в данном случае:
    private bool cond(){ // private означает что функция используется только в пределе этой библиотеки,bool это тип который функция возвращает,cond название функции,() в этих скобках указываются переменные которая берёт функция,в данном случае она нечего не берёт,{ открываем функцию
        return GetSpellAbilityId()=='A000' // GetSpellAbilityId() это функция которая нечего не берёт и возвращает равкод применённого спела,== это знак равенства,'A000' это равкод нашего спела,return это вернуть значение,в результате эта строка проверяет равен ли равкод нашего спела равкоду спела который применили и если равен то возвращает true(запускает действие) а если не равен возвращает false(не запускает действие)
    } // закрываем функцию
обратите внимание на знак
 //
он означает комментарии и то что написано после него не учитывается варкрафтом(там может быть хоть описание,хоть неработающий код,хоть анекдот)
далее надо сделать действие
действие нечего не берёт и не чего не возвращает
    private void act(){ // void означает ничего 
     unit a=GetTriggerUnit() // unit тип локальной переменной,a название локальной переменной,GetTriggerUnit() функция которая возвращает триггерного юнита(в данном случае того кто применил способность)
      DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",a,"overhead"))//DestroyEffect функция которая удаляет ефект чтобы он не занимал место в памяти(после удаления ефект всеравно проигрывает свою анимацию 1 раз),AddSpecialEffectTarget создаёт ефект и прикрепляет его к цели,в данном случае целью является юнит a
      TerrainDeformCrater(GetUnitX(a),GetUnitY(a),512,64,1500,false)//TerrainDeformCrater создаёт кратер,GetUnitX берёт юнита,возвращает координату x этого юнита,GetUnitY тоже самое что и GetUnitX но возвращает координату y
      SetUnitX(a,GetSpellTargetX())//SetUnitX ,берёт юнита и координату x,и перемещает юнита на эту координату,GetSpellTargetX() возвращает x точки в которую был применён спел
      SetUnitY(a,GetSpellTargetY())// тоже самое что и предыдущая строчка но с координатой у
      DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",a,"overhead"))
      a=null// обнуляем переменную чтобы в случае смерти юнита небыло утечек
    }
и наконец инициализация в которой мы создаём триггер и прикрепляем к нему событие,условие и действие
    private void init(){
     trigger trg=CreateTrigger()//trigger тип переменной,CreateTrigger() функция которая нечего не берёт и возвращает триггер
      TriggerRegisterAnyUnitEventBJ(trg,EVENT_PLAYER_UNIT_SPELL_EFFECT)// добавляем к триггеру событие связаное со всеми юнитами на карте,EVENT_PLAYER_UNIT_SPELL_EFFECT означает что событие сработает когда юнит применит способность
      TriggerAddCondition(trg,function cond)// добавляем условие к триггеру
      TriggerAddAction(trg,function act)// добавляем действие к триггеру
    }
прикрепляю карту где будет этот триггер и триггер на гуи(1 из них надо выключать чтобы способность не сработала дважды,по умолчанию выключен триггер на гуи)
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
11 лет назад
0
Стратег, ок
все у кого проблемы замените свою либу на эту
0
17
11 лет назад
0
Все заменил библиотеку и заработало.
0
28
11 лет назад
0
2 урок готов
0
15
10 лет назад
0
Отличная статья. Хоть что-то по cJass'у появилось.
0
21
10 лет назад
0
Audes, оперативно же вы нашли
Чтобы оставить комментарий, пожалуйста, войдите на сайт.