Создай свою игру на ZX Spectrum. Часть 7c – Ещё немного о новой Чуррере

Эта глава является своеобразным окончанием “описания дополнений” к Чуррере новой версии, в которой вы узнаете ещё больше крутых штук, которые можно реализовать с помощью этого современного игрового движка.

Чуррера 3.99.2

Прежде всего, скачайте соответствующие материалы для этой главы, нажав на ссылку ниже:

http://www.mojontwins.com/churrera/mt-churrera-3.99.2.zip (скачать локально: mt-churrera-3.99.2)

Что, опять? А как же глава со скриптами?

Да, я знаю, что мы вам обещали главу про скрипты и еще кучу вещей, но нам показалось неправильным продолжать развивать Чурреру, не дав вам возможность воспользоваться нашими новшествами. Что это значит? Возможно и ничего, возможно, вам в лучшем случае понадобятся только отдельные из новых функций, которые мы сегодня будем объяснять, но немножко терпения. Глава о скриптах очень важная, и мы не хотим ее делать абы как. Очень скоро мы начнем делать первые наброски. А тем временем, можешь глянуть сюда. Но сначала вернись в прошлую главу, в которой объясняется, как обновить Чурреру твоей игры до новой версии.

Таймеры

Мы добавили в Чурреру таймер, который можно использовать как в автоматическом режиме, так и через скрипт. Таймер задает изначальное значение, ведет обратный отсчет, может заново запускаться, может конфигурироваться, когда каждый из фреймов  заканчивается, и что происходит, когда это случается. В config.h, как обычно:

#define TIMER_ENABLE

Вместе с TIMER_ENABLE включается код, необходимый для управления таймером. Этот код потребует некоторых дополнительных команд, которые определяют его функционирование:

#define TIMER_INITIAL 99
#define TIMER_REFILL 25
#define TIMER_LAPSE 32

TIMER_INITIAL определяет изначальное значение таймера. Иконки дополнительного времени, размещенные под видом тайлов 5-го типа, добавляют дополнительное время, прописанное командой TIMER_REFILL. Максимальное значение таймера, как для начального, так и для дополнительного, равняется 99. Чтобы контролировать интервал между каждым счетным отрезком таймера, прописываем в команде TIMER_LAPSE количество фреймов, которые должны пройти.

#define TIMER_START

Если TIMER_START включен, таймер будет включен с самого начала. К тому же у нас есть дополнительные команды, которые определяют, что произойдёт, когда таймер дойдет до нуля. Достаточно убрать комментарии у тех команд, которые мы будем применять:

#define TIMER_SCRIPT_0

Если мы прописали эту команду, при достижении нуля таймером начнется выполнение серии специальных скриптов, ON_TIMER_OFF. Это идеальное решение – отдать все управление таймером скриптам, как это сделано в Cadàveriön.

//#define TIMER_GAMEOVER_0

Если работает эта команда, когда таймер дойдет до нуля, игра закончится (“GAME OVER”).

//#define TIMER_KILL_0
//#define TIMER_WARP_TO 0
//#define TIMER_WARP_TO_X 1
//#define TIMER_WARP_TO_Y 1

Если работает команда TIMER_KILL_0, то при достижении нуля, будет теряться одна жизнь. Если к тому же прописать TIMER_WARP_TO, то изменится и окно: игрок появится в координатах TIMER_WARP_TO_X и TIMER_WARP_TO_Y. Используй эту опцию, если эти данные будут зафиксированы в течение всей игры. В Cadàveriön, например, мы изменили код, чтобы все управлялось скриптами.

//#define TIMER_AUTO_RESET

Если работает эта опция, то таймер автоматически вернется к максимальному значению по достижении нуля. Если ты предпочитаешь отдать контроль скрипту, лучше оставить у этой опции комментарий.

#define SHOW_TIMER_OVER

Если включена эта опция, при том, что одна из этих команд активирована (TIMER_SCRIPT_0 или TIMER_KILL_0), то когда таймер дойдет до нуля, покажется надпись “TIME’S UP!” («ВРЕМЯ КОНЧИЛОСЬ!»).

Скрипты:

Как мы уже говорили, таймер может управляться через скрипт. Если мы решили обратиться к этой возможности и активируем TIMER_SCRIPT_0, чтобы команда ON_TIMER_OFF выполнялась по достижении таймером нуля, скрипт получает полный контроль, что самое прикольное.

К тому же мы добавляем следующие проверки и команды:

Проверки:

IF TIMER >= x
IF TIMER <= x

Будут выполняться, если значение таймера больше и равно или меньше и рано заданной величине, соответственно

Команда:

SET_TIMER a, b

Она служит, чтобы указать значения TIMER_INITIAL (a) и TIMER_LAPSE (b) в скрипте

Запуск таймера:

TIMER_START

Остановка таймера:

TIMER_STOP

Контроль передвигаемых блоков

Мы улучшили движок, чтобы можно было делать больше разных вещей с тайлом 14 10-го типа (передвигаемый тайл), чем просто сдвигать его, или чтобы он преграждал путь врагам. Теперь мы можем сказать движку, чтобы он запускал команду PRESS_FIRE текущего окна в скрипте сразу после того, как будет сдвинут передвигаемый блок. К тому же, номер тайла, который сдвигается, и финальные координаты сохраняются в трех флагах, которые мы можем конфигурировать, чтобы потом использовать их в скрипте для проведения проверок.

Такая система используется, например,  в скрипте Cadàveriön для проверки, что статуи стоят на пьедесталах.

Вспомним, что у нас было прописано раньше:

#define PLAYER_PUSH_BOXES
#define FIRE_TO_PUSH

Первая команда позволяет активировать передвигаемые тайлы. Вторая вынуждает игрока нажимать FIRE, чтобы сдвинуть блок и, соответственно, не обязательна к применению. Теперь посмотрим на новые команды:

#define ENABLE_PUSHED_SCRIPTING
#define MOVED_TILE_FLAG 1
#define MOVED_X_FLAG 2
#define MOVED_Y_FLAG 3

Если активировать ENABLE_PUSHED_SCRIPTING, перемещаемый тайл и его координаты сохраняются в специальных флагах для команд MOVED_TILE_FLAG, MOVED_X_FLAG и MOVED_Y_FLAG соответственно. В отображаемом коде передвигаемый тайл сохраняется во флаге 1, а его координаты во флагах 2 и 3.

#define PUSHING_ACTION

Если работает эта команда, при передвижении блока выполняются команды PRESS_FIRE AT ANY и PRESS_FIRE текущего окна скрипта. В этом случае выполняется условие “JUST_PUSHED”, и через скрипт можно контролировать, что происходит при передвижении блока.

Мы советуем изучить скрипт Cadàveriön, к тому же он отличный пример использования таймера и контроля передвигаемых блоков, в результате получается очень сложный скрипт, использующий кучу передовых технологий. Точнее, будет использовать, когда мы закончим этот семинар :*)

Проверка выхода с карты

Мы рекомендуем установить границы карты, чтобы игрок не мог сбежать с карты, и чтобы движок не устраивал фокусы, но если твоя карта узкая, возможно, ты захочешь использовать все окно. В этом случае, можешь активировать:

#define PLAYER_CHECK_MAP_BOUNDARIES

Это добавит дополнительные проверки и не позволит игроку исчезнуть с карты. Но! Если можешь избежать использования этой опции, будет лучше: сэкономишь место.

В подарок: кастомизированный тип врага

До сегодняшнего дня мы враги 6-го типа не имели кода, но мы подумали, что нам ничего не стоит добавить хотя бы один, например. Он ведет себя, как летучие мыши из Cheril the Goddess. Чтобы использовать его, отправь его в Разместитель врагов 6-го типа и используй эти команды:

#define ENABLE_CUSTOM_TYPE_6
#define TYPE_6_FIXED_SPRITE 2
#define SIGHT_DISTANCE 96

Первая активирует опцию, вторая определяет, какой спрайт будет использоваться (выбранный спрайт минус 1: то есть, если хочешь третий спрайт врага, то ставь 2. Сорри за мешанину, но зато это экономит память). Третья говорит, за сколько пикселей этот жучок тебя увидит. А когда увидит, будет преследовать. Если не увидит, вернется на свое место (куда ты его поставил в Разместителе).

Это дополнение к тому же использует команды врагов 5-го типа:

#define FANTY_MAX_V 256
#define FANTY_A 12

Здесь определяется ускорение и максимальная скорость твоих представителей 6-го типа. Если будешь использовать и пятый тип тоже и хочешь другие значения, будь мужиком и переделай движок.

Конфигурация клавиатуры / джойстика под две кнопки

Есть игры бокового типа, в которые лучше играется двумя кнопками: одна для прыжка и вторая для выстрелов. Если активируешь эту команду:

#define USE_TWO_BUTTONS
#define FANTY_A 12

Клавиатура по умолчанию будет вот такой, вместо привычной:

A – Влево
D – Вправо
W – Вверх
S – Вниз
N – Прыжок
M – Стрелять

Если выбран джойстик, то FIRE и M стреляют, N прыгает.

Выстрелы вверх и по диагонали для бокового вида

Теперь можно дать игроку возможность стрелять вверх или по диагонали. Чтобы прописать это:

#define CAN_FIRE_UP

Эта конфигурация лучше работает с USE_TWO_BUTTONS: таким образом, отделяем выстрел вверх от прыжка.

Если не нажимаешь вверх, то игрок выстрелит в ту сторону, в которую смотрит. Если нажмешь вверх во время выстрела, игрок выстрелит вверх. Если к тому же нажмешь на кнопку направления, персонаж выстрелит в указанном направлении.

Маски пуль

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

#define MASKED_BULLETS

Вот и всё

С этим багажом теперь мы можем наделать кучу новых игр. Можешь не чесать репу, если это все больше похоже на китайскую грамоту, потому что скоро ты узнаешь про скрипты и всю мооооощь, которую они тебе дают.

 

Перейти к Главе 8

Перейти к Содержанию

 

[ Перевод на русский язык — сайт viva-games.ru. При перепечатке статьи или любой её части ссылка на viva-games.ru обязательна. Оригинал статьи тут. ]




Понравилась публикация? Поделись с друзьями

Поделиться
Subscribe
Уведомлять об
guest
0 комментариев
Inline Feedbacks
View all comments