Главная » Документация » Использование языка скриптов в играх

RSS

Использование языка скриптов в играх

COG

Остальная часть этой статьи рассматривает проблеме и решения языка , котрые мы использовали в создании 3D игры JEDI KNIGHT: DARK FORCES 2

Язык JEDI KNIGHT, который дизайнеры окрестят COG, мы выбрали весьма похлжим на С. При использовании C как отправной точки, мы удалили большинство ненужных нам ключевых слов и конструкций и даже удалили некоторых довольно важные части языка, имеющие дело с функциональными объявлениями и инструкциями swith, потому что они были значительно более сложны, чтобы анализировать и выполниться чем остальная часть языка. Мы выбрали Язык C как отправную точку из-за множества книг, и учебников которые доступно обучают непрограммистов языку.

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

Энжайн выполняет сценарий с помощью событийного программирования. Например, когда два объекта сталкиваются друг с другом в энжайне физики, любые сценарии COG, связанные с любым объектом получают событие «Touched». Это событие содержит параметры, которые позволяют сценарию идентифицировать, которые объекты включались в случае и тип события, которое произошло. Основанный на этой информации, сценарий может управлять готовым состоянием любым способом, которым пожелает, или может просто игнорировать событие. COG сценарии может также содержать связи, которые дают возможность им обмениваться сообщениями. Эти события составляют первичный интерфейс между энжайном и системой языка.

Имеются дополнительные сообщения, которые поставлены непосредственно сценарию COG через объекты, с которыми сценарий COG связан. Сообщение startup послано каждому сценарию COG в начале уровня, и respawn сообщение послано, когда локальный игрок умирает. Каждый готовый объект также имеет способность установить повторяющееся событие импульса или одноразовое событие таймера, которое будет поставлено в некоторой отметке в будущем. Это позволяет комбинацию управляемого событиями и планируемого выполнения.

Потому что мы удалили стандартный C синтаксис для функциональных объявлений из нашего языка, каждый сценарий организован подлобно большой инструкции switch. Точки входа в код для различных типов событий помечены, используя стандарт C, синтаксисом метки. Также, потому что COG развернул на стандарте C типы переменной с добавлением специфических переменных ресурса (сектор, вещь, звук, и так далее), переменные сценария объявлены в специальном верхнем колонтитуле. Редактор уровня также читает этот верхний колонтитул, так что это может отображать символы проектировщикам и позволять им рассматривать редактирование значения символа.

Событие
Описание
Touched Объект или поверхность с другим объектом. Посылается обоим участникам проверки
на пересечение, может быть восстановлен.
Entered Для секторов, вызвается каждый раз когда новый объект входит в сектор
Damaged Вызванный всякий раз, когда объект был поврежден от оружия или взрывов. Ссылается
к причине повреждения, и тип повреждения обеспечивается заголовком.
Created Вызывается когда был создан новый объект
Killed Вызывается, когда объект должен быть удален из игры
Crossed Вызывается когда объект пересекает поверхность
Arrived Вызвается, когда перемещающийся объект достигает цели
Timer Событие таймера установленное сценарием истекло
Sighted Объект замечен игроком впервые

ТАБЛИЦА 1. Пример событий COG

Модель Выполнения

Каждый сценарий, который существует в уровне, связан с любом числом других объектов в том уровне: стенки, враги, двери, другие сценарии COG, и так далее. COG сценарии выполняются как отдельные виртуальные машины, каждая с собственными переменными, стеком, и указателем выполнения. Из-за этого, COG сценарии защищены от друг друга. Один COG сценарий может только воздействовать на себя и объекты, с которыми он связан. Каждый сценарий это отдельный ресурс, который загружен наряду с готовым уровнем. Одиночный сценарий может быть помещен в уровень много раз имея собственную изолированную среду.

Пример COG сценария показывается в Листинге1. Этот сценарий создает вспыхивающий неоновый знак, который (если поврежден) взорвется. Символы, не отмеченные локальными могут изменяться непосредственно в редакторе уровня. Desc= поле сообщает редактору, какую строку отображать, когда дизайнер редактирует эту переменную.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 00_neosign.cog
#
# if this cog will cycle through frames 0-(lastFrame-1), at framerate fps
# if damaged, it will go to frame lastFrame and stop, create sparks and sound
 
symbols
message startup
message damaged
 
surface sign mask=0x448
float fps=2.0 desc=speed of anim
template sparks=+sparks desc=created when shot
sound exp_sound desc=played when shot
end
code
startup:
// Start the animation looping but skipping the first 2 frames
SurfaceAnim(sign, fps, 0x5);
return;
damaged:
if (GetWallCel(sign) == 0)
return;
StopSurfaceAnim(sign);
if (exp_sound)
PlaySoundPos(exp_sound, SurfaceCenter(sign), 1.0, -1, -1, 0);
SetWallCel(sign, 0);
CreateThing(sparks, GetSourceRef());
return;
end

Контроль доступа

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

Библиотечные функции COG – фактически это только указатели на функции C, которые являются видимыми в сценариях COG как глобальные функции. Когда ядро выполнения сталкивается с обращением к одной из этих функций, то переходит к коду C. Код C затем вызывает функции поддержки языка, чтобы получить параметры из стека и возвратить результаты обращения обратно в сценарий. Так как функции находятся в коде С, они выполняются значительно быстрее чем непосредственно язык сценариев. По этой причине, часто выполняемые задачи написаны на C и вызываются как библиотечные функции. Таблица 2 дает примеры типов функций, содержащихся в библиотеке функций COG.

Функции
Описание
StartAnim Запускает анимацию для поверхности, спрайта, или материала
SectorThrust Устанавливает силу толчка для сектора
SetThingFlags Устанавливает флажки обекта
GetCurSector Находит ссылку на сектор, в котором содержится обект в настоящее время
CreateThing Создает новый обект в мире игры
PlaySoundThing Играет звук, пространственно связанный с позицией обекта
SetTimer Устанавливает событие таймера
PlaySong Играет музыкальный трек с CD
AISetTarget Устанавливае цель нападения для AI объекта
AISetMode Устанавливает режим AI объекта
MoveToFrame Перемещает объект по пути к определенной позиции, используется для перемещающихся
дверей, подъемников, и т.д.

Таблица 2. Пример библиотечных функций GOC

Страницы : 1 2 3 4

Таги: