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

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

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

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


Многие native функции объявляются в common.j, common.ai и Blizzard.j. Этот раздел расскажет про некоторые, пожалуй самые основные, функции.
Прим. переводчика: сюда я прикреплю файл, который содержит весь API Browser, предлагаемый автором сего текста. Хоть он сделан "элементарно", но все же может помочь... Я хочу сделать прогу для работы с JASS, где будет, конечно, "база" со всеми функциями. Посмотрим, что из этого получится

Учтите, что следующие функции, которые прописаны в common.j работают не корректно в AI-скриптах:
native функции, которые возвращают string.
native функции, которые как аргументы берут вызовы как аргументы (т.е., code, trigger, boolexpr и т.д.), например, триггеры или нумераторы (ForGroup и т.д.).
ExecuteFunc

Эти функции нормально работают в скриптах карт. Также прошу учесть, что native функции, объявленные в common.ai не доступны в скриптах карт.


Потоки

Обычно только один поток содзается для AI. Новый потоки в AI скрипте можно создать с помощью функции, объявленной в common.ai:
code:
native StartThread takes code func returns nothing


Вызывая эту функцию оператором call StartThread(function my_func) создает новый поток, который начинает работать с функции my_func.

У каждего игрока есть 6 "слотов" для потоков. Включая главный поток (его нельзя завершить!), так что у вас есть только 5 дополнительных слотов. Если вы заполнили все слоты (создавли 6 потоков), то дальнейший вызов функции StartThread() игнорируется для этого игрока. Такие слоты не рециркулируются (т.е., завершить поток, а потом начать в этом же слоте другой не выйдет). Как только вы создали пять потоков, все слоты заняты и вы не можете создавать потоки для этого игрока.

Когда поток выходит (он выходит временно!), поток его иницилировавший продолжает работать.

Поток может выйти следующими способами:
Существует лимит на выполнение операций. Когда поток доходит до лимита, он автоматически уходит "отдыхать" (sleep; wait и т.п.) на 1 секунду.
Когда поток вызывает функцию Sleep(N), он начнет работать заново через N секунд.

Прим. переводчика: судя по тому, что тут рассказали, можно сказать что в AI может работать только один поток в одно время... Я сомневаюсь. Вообще, я не совсем понял что написал автор, очень странным текстом было написано. Нигде не было написано что, что когда создается поток, то поток его создающий зависает. А потом написано, что когда новый поток выходит, то его создавший продолжает (resumes)... Или я слово yields не правильно понял

Поток может завершиться (совсем) следующими способами:
Не было главной функции (т.е., она была null).
Когда главная функция потока выходит (returns).
Если была попытка использовать переменную, которая не была объявленна до того как её использовали (все переменные могут быть использованы только после того, как их объявят).
Если была попытка что-либо поделить на ноль.

Ни в коем случае нельзя завершать главные поток (тот что использует первый слот и инициализируется игрой). Используйте SleepForever() в конце функции main чтобы она не вышла.

У потоков в AI скрипте один и тот же глобальные статус, поэтому если поменять глобальную переменную в одном потоке, то это будет видно в других (в одном и том же скрипте, конечно). Вы не можете создавать потоки в скрипте карты.
Прим. переводчика: последняя строчка меня убила... Конечно, нельзя создавать потоки "во всей их красе", но этол же не значит что их вообще нельзя создавать... Эхх, текст старый, еще с 1.07... Хотя, если не изменяет память, там тоже можно было создавать потоки. Короче, вообще весь этот "кусок" текста про потоки очень странный o_O


Триггеры

Триггер, используемый в скрипте карты, - функция обратного вызова. То есть, он "ждет" какого-то события, и исполняется когда оно происходит. Триггеры не работают в AI скриптах. Тип переменной триггера это, соответственно, trigger, он потомок типа handle.

Новые триггеры создаются следующей функцией (в common.j):
code:
native CreateTrigger takes nothing returns trigger


На самом деле триггер еще содержит условия и действия. Условие, это один или несколько boolexpr. Этот handle-подобный тип, который содержит функцию, которая возвращает бул. То есть, не какое-то проверочное выражение, которое вернет бул, а именно функцию! Условие boolexpr можно создать следующей функцией. Функция-аргумент должна вернуть бул, значит должна быть объявлена как takes nothing returns boolean. Функция создания условия возвращает тип conditionfunc, который является потомком boolexpr.
code:
native Condition takes code func returns conditionfunc


А в триггер условие добавляется следующим образом:
code:
native TriggerAddCondition takes trigger whichTrigger,
boolexpr condition returns triggercondition


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

Действия это просто функции, которые выполняются когда происходит условие. Они должны быть объявлены как takes nothing returns nothing.
code:
native TriggerAddAction takes trigger whichTrigger,
code actionFunc returns triggeraction


Опять же, возвращается ссылка на функию-действие, чтобы обратиться к ней позже.

Как только триггер был создал, его надо "прицепить" к событию. Для этого есть специальная функция в common.j:
code:
native TriggerRegister[какое именно событие]Event
takes trigger whichTrigger,
... returns event


В common.j есть еще множество функций, которые помогут вам организовать свои триггеры.
Прим. переводчика: хоть и JassEditor немногу глючит, там есть список и поиск функций (колонка справо). Удобно.


Межскриптовые коммуникации

Во время игры, у вас есть несколько независимых скриптов которые выполняются одновременно; один для карты, другой для AI... Глобальные переменные у них не общие. Так что, создавая переменную в одном AI скрипте (одного игрока), не повлияет на другой AI скрипт (для другово игрока).
Прим. переводчика: не перепутайте с потоками! У всех потоков для одного игрока переменные общие.

Скрипт карты и AI скрипт могут между собой связываться используя команды. Команда это пара integer'ов - command и data. Чтобы отослать команду, используйте следующею функцию (объявленную в common.j):
code:
native CommandAI takes player num, integer command,
integer data returns nothing

У каждего игрока естьстек (что-то типа "очереди") в которую и засылаются новые команды. Чтобы узнать сколько команд ожидают выполнения, используйте следующею функцию (объявлена в common.ai):
code:
native CommandsWaiting takes nothing returns integer


Чтобы посмотреть на самую верхнею (последнею добавленную), используйте эти функции:
code:
native GetLastCommand takes nothing returns integer
native GetLastData takes nothing returns integer


Соответственно они возвращают последние command или data. Эти функции только возвращают последнию команду, они её не убирают. Чтобы убрать команду, используйте:
code:
native PopLastCommand takes nothing returns nothing


Не забывайте что добавляете команду вы наверх (стека), и удаляйте тоже сверху. То есть, последнею в стеке команду.

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

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

Основы 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, время: 03:36.

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