Добавлен , опубликован

Осваиваем jass (0-1)

Содержание:

15. Послесловие

Читатель, ты уже очень многое узнал о jass. Конечно, в jass полно и других важных наработок. Есть команды, позволяющие выводить текст в любом месте экрана. Есть спец. команды, позволяющие производить общие действия для всех игроков на одном только компьютере (например, играть такой-то звук). Есть наработки Vexorian-а, который по сути сделал такую же систему, как SCV ДимонаТ, но раньше. Есть методы, позволяющие упростить работу с группами юнитов. Есть методы создания специальных объектов, которые определяют, что юзер щелкнул мышкой в такую-то точку (на основании этого построен инвентарь ДимонаТ на 80 слотов). Но всему этому обучать я уже не буду, т.к. во-первых, сам многого не знаю, во-вторых, в случае необходимости ты уже сможешь разобраться самостоятельно. Можешь проверить - статьи по jass, которые раньше казались сложными и непонятными, теперь станут доступными, а материал изложенный в них - будет уже знаком.
Владея приемами работы с jass, самое главное для триггерщика - умение правильно ставить и находить решение задач, умение алгоритмизировать задачу, умение мыслить творчески. Про это я уже писал отдельную статью. Дальше, все уже зависит от твоих мозгов и твоего опыта.
Вот, к примеру, как-то раз попросил меня один картостроитель разобраться с тем, как устроено заклинание passive mana shield известного буржуйского автора. Идея в том, что повреждения должны наноситься мане, а когда мана кончится – жизни юнита. Думаю, ты уже догадаешься, как это сделать. Единственный способ, пригодный для этого методами war3 - отлавливать повреждения, полученные юнитом при помощи триггера с событием unit takes damage. Т.е. для каждого юнита с пассивкой, нужно создать такой триггер - это задача решаемая. При нанесении повреждения юниту, возможны разные случаи:
  • маны у юнита больше размера повреждения: в этом случаи мы восстанавливаем юниту жизнь и отнимаем ману.
  • маны у юнита меньше размера повреждения: в этом случае из полученного юнитом повреждения мы должны восстановить число жизни, равное количеству маны, а потом обнуляем ману.
Вроде все хорошо. Все, да не все. Оказывается, что событие unit takes damage срабатывает на какую-то долю секунды раньше, чем юниту наносится повреждение. Из-за этого, если жизнь юнита полная, мы пытаемся добавить жизнь и отнять ману. Но жизнь полная и поэтому добавлять к ней что-то бесполезно. Получается, что жизнь юнита все равно страдает. Мелочь, а не красиво.
Можно конечно сделать паузу 0.1 секунды и уже после этой паузы восстанавливать жизнь юнита. Тогда все работает нормально, но все таки видно, как жизнь юнита колеблется. Опять же, некрасиво.
Картостроитель предложил глянуть работу спела у буржуйского автора - там было столько jass кода, в котором было так лень разбираться, что я на это забил. Стал думать. Есть ли возможность отловить момент, когда у юнита отнимутся жизни? В принципе есть. Существует такое событие, которое срабатывает, когда жизнь юнита станет меньше указанного значения. Этим можно воспользоваться! Просто если жизни у юнита почти полные и нельзя использовать метод добавить жизнь сразу. Вместо этого мы СОЗДАДИМ ТРИГГЕР с событием, которое сработает, когда жизнь текущего юнита станет меньше текущего значения. Это произойдет буквально через миг. И именно в этот момент мы добавим жизни юниту обратно. Проверил – все сработало. А триггерный код получился заметно короче, чем у буржуя.
- спел passive magic shield
Удачных тебе наработок, Читающий ;).
добавлено 08.03.2009 от ADOLF
К сожалению статья, которуя как я надеюсь Вы только что прочитали содержит некоторые неточности, хотя и являеться до сих пор лучшей русскоязычной вводной статьей по Jass. Поэтому я решил просто взять их и описать в отдельной статье - "Осваиваем JASS - исправления и дополнения", с которой я и рекомендую Вам ознакомиться.