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

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

Закрытая тема
 
Опции темы Опции просмотра
Старый 14.02.2010, 23:56   #1
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию JASS - Библиотечные функции. Часть 2.

JASS - Библиотечные функции. Часть 2.



Хотя создавать новые структуры данных в JASS не возможно из-за отсуствия указателей первого класса (короче, нету основы объектно-ориентированного программирования), интерфейс нам предлагает нам некое подобие множеств некоторых конкретных handle-подобных типов. Множество юнитов называются группой (group); множество игроков называются стороной (force); также существуют множества destructable'ов (доодады которые можно уничтожить), но такого типа не существует.

Например, чтобы убрать / добавить / стереть кого-нибудь из группы / стороны используйте следующие функции:
code:
// group management native CreateGroup takes nothing returns group
native GroupAddUnit takes group whichGroup, unit whichUnit returns nothing
native GroupRemoveUnit takes group whichGroup, unit whichUnit returns nothing

// force management

native CreateForce takes nothing returns force
native ForceAddPlayer takes force whichForce, player whichPlayer returns nothing
native ForceRemovePlayer takes force whichForce, player whichPlayer returns nothing


Часто используемая схема называется итератором или нумерацией (Прим. переводчика: немного разные понятия: итератор это программа организации циклов, нумерация это просто перечисление). Нумерация это интерфейс, который позволяет вам "вытаскивать" отдельные элементы и оперировать с ними. Проще говоря, "для каждего элемента сделать...". Примерно также как бы вы это сделали с массивом (юнитов / игроков). Вот пример из Java работающий по такому принципе (в C++ это осуществляется примерно также):
code:
// Это типа проверка на существование след. элемента
for (Iterator iter = set.iterator(); iter.hasNext(); ) {
// Достаем следующий элемент итерации
Object element = iter.next();
// Делаем с ним чего нибудь
processElement(element);
}


В JASS не возможно (!) "посмотреть в" group или force, так что было осуществленно что-то похожее на основе обратных вызовов. Чтобы сделать что-то с каждым элементом группы или стороны используйте следующие функции. Функция, которую вы будете писать вместо code callback должны быть объявлены вот так - takes nothing returns nothing:
code:
// For each unit in 'whichGroup' call the 'callback' function
native ForGroup takes group whichGroup, code callback returns nothing

// For each player in 'whichForce' call the 'callback' function
native ForForce takes force whichForce, code callback returns nothing


Подобные функции существуют и для destructable'ов в определенном регионе (точнее, в определенном rect'е). Читайте подраздел Фильтры для подробностей про boolexpr.
Есть только один способ обойти это очевидное ограничение - использовать функции ForstOfGroup() и GroupRemoveUnitSimpe() и оперировать с временной группой. Это будет полезно для AI скриптов где обратный вызов не работает.
code:
// Для каждего destr'а который удовлетворяет filter'у
// вызвать actionfunc.
native EnumDestructablesInRect takes rect r,
boolexpr filter, code actionFunc returns nothing


Внутри вызываемой функции (т.е., actionFunc) вы можете получить тот элемент, над которым выполняется операция:
code:

constant native GetEnumUnit takes nothing returns unit
constant native GetEnumPlayer takes nothing returns player
constant native GetEnumDestructable takes nothing returns destructable


Учтите, что это уже не будет работать в AI скриптах, так что это только для карт. Предположим, если вы хотите убить всех юнитов в группе, то ваша вызываемая (Прим. переводчика: "вызываемая" тут означает ту функцию, которую вы пишете в аргументы ForGroup()) функция будет выглядеть вот так:
code:
function KillGroupCallback takes nothing returns nothing

// Получаем юнита
local unit nextUnit = GetEnumUnit()
// Убиваем
local unit KillUnit(nextUnit)
endfunction


Создав эту функцию, вы можете ею воспользоваться следующим образом:
code:
call ForGroup(groupToKill, function KillGroupCallback)


Еще одно довольно частое действие, это нахождение элементов которые удовлетворяют какому-то условию (сначало рассмотрим такой случай для одного юнита.. Например, надо найти юнита, у которого больше всех жизней. К сожелению, JASS полагается на обратные вызовы чтобы рассмотреть каждый элемент отдельно, так что единственный выход - использование глобальной переменной (Прим. переводчика: использовать кэш я не рекоммендую вообще, особенно в этом случае, так как он будет так тормозить этот цикл, что он займет несколько секунд! Я его не рекоммендую даже для хранения настроек - RS лучше). Вот код для этого примера:
code:
globals
real mostLifeSoFar
unit unitWithMostLifeSoFar
endglobals
function MostLifeCallback takes nothing returns nothing
local unit nextUnit = GetEnumUnit()
local real life = GetUnitState(nextUnit, UNIT_STATE_LIFE)
if life > mostLifeSoFar then
set mostLifeSoFar = life
set unitWithMostLifeSoFar = nextUnit
endif
endfunction


...
// Инициализировать переменные чтобы найти
// юнита с макс. hp в 'myGroup'
set mostLifeSoFar = 0
set unitWithMostLifeSoFar = null

// А теперь проверяем каждего юнита
call FarmGroup(myGroup, function MostLifeCallback)
// Теперь 'unitWithMostLifeSoFar' - тот самый юнит,
// или null если группа была пустой
...

И наконец, знайте что вы можете достичь тоже самое используя массивы. Единственный недостаток в том, что массив занимает больше памяти (подробности в разделе Типы). Да и поток, у вас будут "дырки" в массиве если вы уберёте пару элементов прямо песреди массива, и вы не можете использовать фильтры чтобы создавать массивы (однако, вы можете создать группу, потом нумераторами заполнить массив). Да и потом, вы не можете сделать массив массива (многомерные), а массив групп / сторон вы можете спокойно создавать.

Автор: Raz
© WC3.RU, 2002-2010 гг
Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому !
VAV вне форума  
Старый 14.02.2010, 23:56   #2
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Ответ: JASS - Библиотечные функции. Часть 2.

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

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

Последний раз редактировалось VAV, 12.08.2010 в 14:30.
VAV вне форума  
Закрытая тема


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

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

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


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

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