5. СКРИПТЫ
Язык GS9, хендлеры, кoлбеки, фоновые функции




Скрипты

Прежде, чем заняться практическими уроками, давайте рассмотрим, что же такое скрипты (scripts).

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

Игровые скрипты размещаются в папке DATA/SCRIPTS, и имеют расширение .gs.
Главный игровой скрипт, загружаемый движком, называется dizzy.gs. А уже из него в свою очередь загружаются все остальные скрипты.

На скриптовом языке GS9 написан набор функций, которые иерархически могу вызывать друг друга. На самом базовом уровне находятся так называемые хендлеры (handlers), представляющие из себя набор специальных функций, вызываемых игровым движком при наступлении определенных событий (events). Функции-хендлеры расположены в файле handlers.gs, и каждая из них отвечает за определенное событие. Например, функция HandlerAction отвечает за нажатие кнопки 'использовать' (action key).

Хендлеры - не фоновые функции (not latent), но у них есть возможность запускать другие функции в фоновом режиме.Так же хендлеры могут обмениваться с игровым движком данными через специальные функции ScrGetHandlerData, ScrSetHandlerData.

Кроме того, хендлеры могут вызывать пользовательские функции для обработки событий - так называемые колбеки (callbacks).

Например, при нажатии кнопки 'использовать' на фоне какого-либо игрового персонажа, функция HandlerAction может попытаться вызвать колбэк-функцию с именем, соответствующим типу события для этого персонажа. Если такая функция отсуствует, ничего не происходит и программа идет дальше.

На самом деле, новичку не обязательно вдаваться в такие подробности. Достаточно отредактировать только один файл game.gs, в котором он разместит свои простые обработчики (callback functions) для различных событий, происходящих в игре.

Однако, если вы захотите глубже понять механизм работы обработчиков событий, можно просто проследить откуда вызываются ваши функции. Делается это обычным поиском по имени в скриптовых файлах. Таким образом, вы доберетесь до хендлеров. Это поможет вам лучше понять, как работает система обработки событий в целом, а стало быть, изменить и улучшить её по своему усмотрению.


Фоновые функции

Как уже было упомянуто в описании языка GS9, выполнение фоновых (latent) функций может быть остановлено с помощью команды stop, и продолжено вновь в следующем цикле игры. Таким образом, код сценария может ожидать специфического события, например, нажатия клавиши или ожидания паузы в несколько секунд, не останавливая при этом саму игру. Функция, вызванная фоновой функцией, разумеется, тоже считается фоновой.

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

Будет ошибкой непосредственно вызывать фоновую функцию из обычной. Так же, неправильно запрашивать новое выполнение фоновой функции из уже существующей. И, наконец, будет неверным делать два запроса на выполнение фоновой функции один за другим. Движок выполнит только один из них.

Технически, DizzyAGE использует две виртуальные машины для выполнения скриптов. Первая из них исполняет обычные функции и используется для запуска хендлеров. Хендлеры или функции, вызванные ими, в свою очередь могут давать движку запрос для запуска фоновых функций, если это возможно. Запрошенная фоновая функция запускается на второй виртуальной машине, предназначенной исключительно для фоновых функций, если конечно вторая виртуальная машина в это время не занята. Вот почему только одна фоновая функция может выполняться одновременно.

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




 

Hosted by uCoz