Форум портала о WarCraft Форум портала о WarCraft
порно чат

Вернуться   Форум портала о WarCraft > Вселенная WarCraft > World Editor > Статьи
Регистрация Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Ответ
 
Опции темы Опции просмотра
Старый 24.07.2010, 22:13   #1
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Локальные переменные в Custom Text

Локальные переменные в Custom Text



Что такое глобальные переменные вы уже знаете. Все переменные, которые вы создаете в Trigger Editor – глобальные. На глобальные переменные можно ссылаться из всех триггеров. Глобальные переменные создаются в начале игры и действуют до ее конца.

Что касается локальных переменыых, то это переменные, которые создаются внутри определенного триггер (даже не триггера, а его определенной части). Создаются они в тот момент, когда триггер запускается на исполнение и перестают существовать, когда действие триггера окончено.

Если триггер запущен на исполнение несколько раз, то при каждом запуске создается свою набор локальных переменных, никак не связанный с другими наборами.

В Trigger Editor нет возможности создавать локальные переменные, а жаль.

Поясню на примере.
Допустим, что я захотел создать юнит, который стрелят огнем (огнеметчик). Допустим так же, что я выбрал такой способ: при атаке огнеметчика, создается спецэффект огня на земле. Затем определяется, стоият ли в радиусе поражения какие-нибудь юниты и им наносится повреждние.

Такой триггер не так уж сложно создать. (см триггер из примера, высланного ниже). И все бы хорошо, но… Что если мы захотим сделать два юнита – огнеметчика? Создавать для ниго еще один триггер, новые переменные… А если юнитов-огнеметчиков 10 и более? Если мы хотим, чтоюы этот юнит можно было производить в бараках?

Хотелось бы свести все к одному триггеру, но не получится. Ведь мы создаем спецэффект огонь (special effect) и чтобы его можно было убрать, нужно поместить спецэффект в переменнуюА если в игре несколько огнеметчиков и они атакуют одновременно – в одни и те же переменные будут записаны сначала одни спецэффекты, а затем другие. Но поскольку спецэффекту первого огнеметчика не успели убраться, они так и останутся. Получится эдакий “вечный огонь”. Более того, если наш огнеметчик атакует достаточно быстро, тогда старые спецэффекты опять же не успеют убраться до того, как возникнут новые (огонь то должен погореть пару секунд).

Обычными триггерами эту задачу решить очень сложно (хотя и возможно). Однако с локальными переменными она решается в два счета. Я не буду объяснять, как я научился делать такие вещи – это приходит с опытом, когда вы учитесь программировать.

Нам нужно, чтобы огонь любого огнеметчика в игре погорел пару секунд и потух. При этом мы уже добились этого для одного огнеметчика с помощью стандартных триггеров и глобальных переменных. Переводим наш триггер в custom text. Прежде всего необходимо каждый параметр, имеющий отношение к конкретному случаю использования юнитом огнемета поместить в локальные переменные типа unit.

Например - event response attacking unit и event response attacked unit – именно такие параметры. Ведь если огнемет применит другой юнит, то и значения этих функций будут совершенно другими.

Затем – переменные со спецэффектами. В каждом случае должны создаваться свои спецэффекты с огнем – значит нужны локальные переменные типа special effect.

И последний нужный параметр - угол между атакующим и атакуемым юнитом – в локальную переменную типа real.

Создаются локальные переменные такой командой:

Local <тип переменной> <имя переменной>
Local integer i – создаст переменную i типа integer
Local real r – создаст переменную r типа real
Local effect s – создаст переменную s типа real
Local effect u – создаст переменную u типа unit

Итак, создали переменные, а затем помещаем в них нужные данные:
Set <переменная> = <значение> - помещает в переменную определенное значение. В качестве значения можно использовать функции типа EventResponseAttacking unit.

Заменяем глобальные переменные и функции на локальные.переменные.

Смотрим, что у нас получилось.
При запуске триггера все глобальные параметры записываются в локальные переменные. Действия триггера не изменилось, но (!) если у нас будет несколько юнитов-огнеметчиков, то они никак не будут мешать друг другу. Ведь при каждом запуске триггера будет создан (!) свой набор локальных переменных, которые будут существовать пока идет действие триггера.

Теперь можно делать сколько угодно огнеметчиков, назначать им любую скорость выстрелов – никаких проблем со спецэффектами не возникнет.

Дополнение от DimonT:
1) Локальные переменные создаются не внутри отдельного триггера, а внутри каждой отдельной функции! То есть, из одной функции триггера невозможен доступ к локальным переменным другой функции (в том числе основной функции триггера - Trigger_xxx_Actions). Вместо этого функциям можно передавать значения (все видели в начале описания функции загадочные слова takes nothing? ну вот, оно и есть, только надо написать, например, takes integer i, чтобы функции можно было передать целое число, к которому внутри функции можно обращаться, как к обычной локальной переменной i). Также стоит отметить, что все глобальные переменные в custom text-е получают имена вида udg_[имя переменной в обычном редакторе].

2) Всякие там attacking unit, triggering unit и т.п. и есть что-то вроде тех самых передаваемых значений, только передаются они всему триггеру. То есть, во-первых, их можно использовать всеми функциями, и во-вторых, все эти значения не могут измениться в процессе выполнения триггера, и неотличимы в этом плане от локальных переменных. Единственное, что следует учесть, это то, что любая (и локальная, и глобальная, и передаваемая) переменная типа unit является лишь указателем (ссылкой) на юнита, параметры которого (например координаты), разумеется, могут как угодно изменяться в процессе выполнения триггера. Поэтому если важен не сам юнит, а какие-либо его параметры на момент срабатывания триггера (в случае с тем же огнеметчиком - координаты атакуемого юнита), то действительно стоит воспользоваться локальными переменными, запись же "local unit u = GetAttacker()" нужна лишь для упрощения записи, чтобы писать "u" вместо "GetAttacker()" в тексте триггера.

Вот список (немного не полный) возможных типов переменных и соответствующие им названия типов в обычном редакторе переменных:

boolean = Boolean
camerasetup = Camera Object
defeatcondition = Defeat Condition
destructable = Destructible
integer = Destuctible Type
dialog = Dialog
button = Dialog Button
gamecache = Game Cache
gamespeed = Game Speed
integer = Integer
item = Item
integer = Item_Type
leaderboard = Leaderboard
player = Player
playercolor = Player Color
force = Player Group
location = Point
quest = Quest
questitem = Quest Requirement
race = Race
real = Real
rect = Region
sound = Sound
effect = Special Effect
string = String
timer = Timer
timerdialog = Timer Window
trigger = Trigger
unit = Unit
group = Unit Group
fogmodifier = Visibility Modifier
weathereffect = Weather Effect

Замечание: переменных Ability, Order, Unit-Type, Item-Type и Tech-Type, присутствующих в обычном редакторе, в текстовых триггерах не существует, значения таких переменных на самом деле хранятся в обычных целочисленых (integer) переменных...

Авторы:
Sergey
DimonT
© WC3.RU, 2002-2010 гг
Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Старый 12.08.2010, 14:38   #2
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Ответ: Локальные переменные в Custom Text

Другие статьи:

Основы JASS.
JASS - Общие понятия.
Синтаксис JASS.
JASS - Библиотечные функции. Часть 1.
JASS - Библиотечные функции. Часть 2.
JASS - Операторы.
JASS - Выражения
JASS - Комментарии.
JASS - Функции
JASS - Типы
JASS - Заключение.
Faq по созданию рельефа.
Зачем так много триггеров?
Немного об оптимизации кода.
Текстовые триггеры
Создаем простейшие карты (карты для melee)
Событие с переменным периодом.
Познаем триггеры (Triggers)
Познаем регионы (locations)
Познаем переменные...
Отлавливаем двойной клик мышью.
Массивы и циклы в обычных и текстовых триггерах
Локальные переменные в Custom Text
Камеры, спецэффекты, карта, цвета, кэш...
Добавление своих функций в триггеры
Добавление своих моделей и др. в карту
Делаем очень большую карту...
Делаем огнемет.
Улучшенная версия огнемета...
Глюки worldeditor'a
Random с задаваемой вероятностью - аура.
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +4, время: 02:30.

Design Developed by CompleteGFX
vBulletin® Version 3.6.7.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot