Сейчас программа выглядит уже так. И это уже практически полноценная игра (точнее, движок).

- dizzy_1.png (25.89 KiB) Просмотров: 7461
Диззи уже может погибнуть.

Принцип работы движка следующий. Весь мир разбит на тайлы 16x16. Тайлы могут иметь имена. Всё взаимодействие описывается через эти самые имена тайлов. Сценарии игры лежат в папке ScreenPlay в обычном текстовом виде. При запуске игра сканирует этот каталог и все сценарии (они могут называться как угодно) добавляет в условия игры.
Возможны сейчас следующие условия:
1) Пересечение тайла с Диззи: IfDizzyIntersection("CAT") - данное условие сработает при столкновении с тайлом с именем "CAT".
2) Пересечение тайлов между собой. IfIntersection("FIRE_LEFT","FIRE_LEFT_BORDER") - данное условие сработает при столкновении тайла "FIRE_LEFT" с тайлом с именем "FIRE_LEFT_BORDER" (это движущийся влево огонь и граница его перемещения).
3) Взятие тайлов в инвентарь (да, Диззи нужно отдельно разрешать что-то брать - могут быть неберущиеся предметы, как это было с мечом в камне из Диззи-4 - взять его можно только используя "липкие руки"): IfPickUp("RING") данное условие сработает при попытке взять тайл "RING".
4) Срабатывание таймера: IfTimer("WAIT CAT") - данное условие сработает для тайла "WAIT CAT "при срабатывании таймера.
5) Использование тайлов между собой: IfUse("BOTTLE WATER","CAT") - данное условие сработает при взаимодействии тайла с именем "BOTTLE WATER" на тайле "CAT".
На данный момент это все возможные условия. Потом, может быть, появятся новые.
Когда условие сработало, выполняются какие-то действия (Action). Для некоторых условий действия только для одного тайла, а для других нужно описывать действие для двух тайлов ( скажем, при столкновении нужно задать каждому столкнувшемуся, что произойдёт с ним)
Этих действий много. Сейчас они такие:
1) ActionMessage(20,100,"СООБЩЕНИЕ") - будет выведено сообщение в заданнх координатах. Да, экран в Диззи 320x240, растянутый до 640x480 для PC.
2) ActionChangeName("BOTTLE OF WATER") - поменять тайлу имя на заданное. Зачем нужно? Бежал у вас огонь до границы влево и теперь должен бежать в право. Как это сделать? Поменять ему имя. И для другого имени сделать уже условие контроля правой границы и условие таймера с событием изменения координаты в другую сторону.
3) ActionChangeDescription("БУТЫЛКА ВОДЫ") - заменяет описание предмета, которое выводится в инвентаре. Была у вас бутылка пустая, а стала с водой. Имя вы поменяли. А теперь надо описание для инвентаря поменять.
4) ActionChangeGlobalName("BOTTLE OF WATER") - поменять имя для ВСЕХ тайлов с таким же именем на карте. Зачем нужно? Если картинка состоит из ряда тайлов (скажем, фигура Волшебника), то изменяет его состояние все его тайлы, а не только та часть, с которой вы взаимодействовали.
5) ActionChangeGlobalDescription("БУТЫЛКА ВОДЫ") - так же меняет глобально все описания.
6) ActionChangePosition(100,100) - задать тайлу позицию в числах. Неудобно для использования. Не гибко.
7) ActionCopyPosition("RING","RING_POS") - перенести позицию первого тайла на место второго. Например, когда кот вам даёт кольцо, он переносит кольцо из некой области карты (вам не видимой - вы там не будете гулять) в заданную позицию.

ActionPickUp() - добавляет тайл в список возможных для взятия в инвентарь.
9) ActionSingle() - однократное действие. Зачем нужно? Диззи коснулся тайла воды. Должен терять энергию. Но вот беда, коснулся он нескольких тайлов воды. Совершенно незачем для каждого тайла отнимать у Диззи энергию. Вот это действие и выполнит для данного события действия стоящие следом ровно один раз.
10) ActionSetAnimationStep(1) - устанавливает шаг анимации (анимация обычно в этом случае есть, но остановлена в редакторе). Позволяет менять картинку одного тайла на другой. Была бутылка без воды, стала с водой.
11) ActionMove(1,0) - изменяет координату тайла на заданные приращения по X и по Y. Именно с помощью этого действия и движется, например, тайл огня.
12) ActionSetEnabled(true) - задаёт разрешён тайл или нет. Если нет, он удаляется с игрового поля. Так можно избавляться от ненужных предметов и персонажей.
13) ActionEnergyUpdate(-1) - изменяет энергию Диззи.
14) ActionAddScore(100) - изменяет очки Диззи. Кстати, можно и уменьшать.
15) ActionAddLife() - добавляет Диззи жизнь.
16) ActionAddItem() - увеличивает счётчик найденных предметов на 1 (в Диззи-6 Диззи собирал вишенки, например).
Начало и конец блоков действий описывают:
ActionBegin
ActionEnd
и
ActionFirstBegin
ActionFirstEnd
ActionSecondBegin
ActionSecondEnd.
Есть ещё команды, выполняемые до начала игры и к действиям и условиям не относящиеся:
1) SetDescription("BOTTLE WATER","БУТЫЛКА ВОДЫ")- задать описание.
2) CopyPosition("FIRE","FIRE_POS") - перенести тайл в позицию другого тайла.
3) SetDizzyPosition("DIZZY_START_POSITION") - перенести Диззи в позицию тайла. Позволяет задать место старта.
Особый тайл имеет имя "RESPAWN" - его нужно ставить там, где Диззи может погибнуть. Тогда Диззи возродится у ближайшего такого тайла.
Пример сценария:
IfUse("BOTTLE WATER","WAIT CAT")
ActionFirstBegin
ActionChangeGlobalDescription("ПУСТАЯ БУТЫЛКА")
ActionChangeGlobalName("BOTTLE")
ActionSetAnimationStep(0)
ActionFirstEnd
ActionSecondBegin
ActionSingle()
ActionChangeGlobalName("LUCKY CAT")
ActionCopyPosition("RING","RING_POS")
ActionMessage(30,100,"ДИЗЗИ ДАЛ БУТЫЛКУ ВОДЫ КОТЁНКУ...")
ActionMessage(40,80,"БУЛЬК-БУЛЬК!\СПАСИБО! ЗА ЭТО Я ДАМ ТЕБЕ\КОЛЬЦО. Я ЕГО ГДЕ-ТО СПЁР.")
ActionAddScore(100)
ActionSecondEnd
Или вот:
IfDizzyIntersection("FIRE_LEFT")
ActionBegin
ActionEnergyUpdate(-1)
ActionEnd
Ну вот, вроде бы и весь язык.
