Изучаем GUI триггеры Часть 6-7-8 - Wc3-Maps Форум













[ Главная · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Strateg, Melissa  
Изучаем GUI триггеры Часть 6-7-8
-
влад10011Дата: Суббота, 28-07-2012, 20:55:22 | Сообщение # 1

загрузка наград ...
Группа: V.I.P.
Сообщений: 1265
Репутация: 1039
Статус: Не на сайте
Циклы, Личный сценарий и Локальные переменные.
Я решил объединить эти части, тк к примеру есть циклы которые повторяются от 1 до 10 к примеру а есть которые выполняются пока не будет выполнено условие 1 вариант можно сделать через триггеры а для 2 понадобиться личный сценарий, а в некоторых местах и локальные переменные.
Для начала разберём простой цикл действий от 1 числа до другого:
к примеру создадим триггер:
Событие периодическое событие каждую 1 сек
Условие -----------------------
Действие Для каждого числа A от 1 до 10 делать действия:
Цикл действий: создать юнит через угол поворота 1 пехотинец для красного игрока в случайной точке зона игровой карты
И так теперь каждую секунду в рандомном месте появятся рандомно 10 юнитов типа пехотинец
Сейчас сделаем подобный триггер:
Событие инициализация карты
Условие -----------------------
Действие Для каждого числа A от 1 до 10 делать действия:
Цикл действий: создать юнит через угол поворота 1 пехотинец для красного игрока в случайной точке зона игровой карты
Ждать 1 сек
И так что мы изменили?
теперь при включении карты каждую секунду(до 10) создаётся пехотинец в рандомном месте.
А так же можно удалять юнитов, создадим переменную массив типа Боевая единица и назовём её u и целочисленную i
Событие инициализация карты
Условие -----------------------
Действие установить переменную i = 0
Для каждого числа A от 1 до 10 делать действия:
Цикл действий: создать юнит через угол поворота 1 пехотинец для красного игрока в случайной точке зона игровой карты
Установить переменную u[i](индекс i) = последний созданный юнит
Установить переменную i = арифметикаi + 1
Ждать 1 сек
И сразу ПОСЛЕ цикла делаем ещё 1 цикл:
Для каждого числа А от 1 до 10 делать действия:
Цикл действий: Боевая Единица- удалить юнита u[целая A] из игры
Установить переменную i = 0
И так что мы сделали?
Мы установили переменную на последнего созданного юнита и заключили его в ячейку в массиве, после ожидания цикла мы сделали точно такой же цикл действий и удалили все 10 юнитов в массиве.
----------------------------------------------------------------------------------------------------------------------------------
Что такое личный сценарий:
Личный сценарий по сути то же самый Jass но в виде 1 строки, он помогает нам не переводить весь код в Jass если таково требуется, а написать пару строк\команд у которых нет аналогов в триггерах к примеру:
loop- начало цикла который будет повторяться пока не выполнятся условия
DoNotSaveReplay()- помогает нам не писать реплей карты
endloop- конец цикла в loop
exitwhen- условие сравнения в loop
local- создание локальной переменной о которых я расскажу вам через некоторое время
call DestroyGroup("имя группы")- удаление локальной или глобальной группы
call RemoveLocation("имя точки")- удаление переменной типа точка локальной или глобальной
И многое другое
-------------------------------------------------------------------------------------------------------------------------
Локальные переменные
Локальные переменные это тоже самые переменные что и глобальные, НО в отличии от глобальных при каждом запуске триггера будут создаваться новые переменные тем самым нам не придётся записывать в массив глобальных переменных большинство объектов.
Локальные переменные объявляются в начале триггера или в начале выбора юнита.
Локальные переменные объявляются вот так:
Code
local "тип переменной" "ваше название переменной"

Сейчас я вам покажу основные типы локальных переменных(их много но я покажу лишь несколько)
unit- Боевая единица
real- реальная
integer- целочисленная
group- группа
effect- спецэффект
player- игрок
location- точка
Сейчас я вам расскажу пример зачем они нужны:
К примеру вам надо создать восклицательный знак над юнитом когда фаербол долетит до него и при этом юзать его будут сразу несколько юнитов а значит наша цель сделать так, чтобы спецэффект убрался не сразу когда пройдёт время а для каждой цели по разному.
И тут встаёт вопрос зачем применять локальные переменные если есть глобальные?
Допустим что при запуске фаербола ждём время пока он долетит(расстояние делить на скорость), накладывать спецэффект и заносить его в переменную потом ждать время и удалить его. НО если в это же время кто-нибудь кинет ещё 1 фаербол?
Будет 2 разных действия, а значит наша переменная с спецэффектом будет перезаписана на другую и получится что 1 из восклицательных знаков НЕ удалятся!!!
Эту проблему легко решить с помощью локальных переменных, ведь как мы знаем для каждого каста триггера создаётся новая локальная переменная
и так вот пример:
Событие юнит применяет способность
Условие сравнение способностей = фаербол
Действие:
Личный сценарий- local unit u создаётся локальная переменная типа юнит и у
local effect e переменная типа эффект
установить переменную типа боевая единица u = юнит-цель заклинания
set udg_u=u ВНИМАНИЕ не путать u и udg_u!
u это локальная переменная а udg_u глобальная тк перед глобальными переменными пишется уродливая приставка udg_"ваша переменная"
set udg_u=u значит что всё что было в глобальной udg_u cтанет в локальной u
Ждать игровое время "как вы уже знаете это расстояние делить на скорость"
Создать спецэффект над юнитом u(глобальная) " ищите восклицательный знак)
set e=GetLastCreatedEffectBJ() мы устанавливаем переменную e как последний созданный спецэффект
Ждать 3-5 сек
call DestroyEffectBJ( e ) удаляем спецэффект e P.S. это стандартная триггерная команда только локальные переменные нельзя юзать в триггерах только в личном сценарии
set u=udg_u то что было в локальной переменной мы возвращаем глобальной
set e=null обнуляем все локальные переменные. Зачем? вы узнаете в следующей статье
set u=null
И так теперь спелл могут юзать хоть сколько юнитов и при этом восклицательный знак уберётся у каждой цели через своё время
------------------------------------------------------------------------------------------------------------------
Циклы типа loop
Циклы типа loop выполняются пока не выполнится условие к примеру пока расстояние до цели не будет меньше 100 или пока 1 число не будет равно другому.
Вот форма юзания loop:
Событие юнит применяет способность
Условие --------------------------------
Действие:
loop начало цикла
"действия"
exitwhen (условия)
endloop конец цикла
Пример:
Событие юнит применяет способность
Условие --------------------------------
Действие:
loop
Установить здоровье юнита (значение)- "применяющий юнит" "Арифметика Здоровье применяющий юнит -- 10
exitwhen R2I(GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellAbilityUnit())) <= 400
endloop
и так что мы с вами сделали:
При касте способности хп юнита будет уменьшаться пока не выполниться условие: здоровье юнита применяющий юнит меньше или равно 400
вот и всё happy
P.S. после loop можно поставить ещё какое-нить действие но оно выполниться только тогда, когда выполниться условие loор
Следующая статья будет называться "Утечки и их устранение"

Добавлено (28/07/2012, 20:55:22)
---------------------------------------------
наконец то дописал Х_Х
cry cry cry


Look at my horse!
 
  • Страница 1 из 1
  • 1
Поиск:
Рейтинг@Mail.ru
Яндекс.Метрика

Copyright © 2010-2017
Вакансии :: Контакты
Мобильная версия сайта
chat