Создай свою собственную игру на ZX Spectrum. Часть 5

У нас уже готова для вас глава 5 семинара “Создай свою собственную игру на Спектруме”. Сегодня мы закончим графическую часть и начнем работать, кроме прочего, над стартовой и финальной заставкой игры. Как обычно, надеемся, что вам понравится, и вы найдете, что вынести для себя из этого урока.

Глава 5: Завершение графики (пока что)

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

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

Чего нам не хватает?

Осталось нарисовать уже не так много. В этой главе мы объясним две вещи: сначала, как менять дополнительные спрайты (взрыв и пуля). Затем посмотрим, как создавать, конвертировать, сжимать и включать части игры, стартовый и финальный экраны.

Дополнительные спрайты

В принципе, мы не планировали разговаривать в этом семинаре/обучении на тему замены дополнительных спрайтов по очень простой причине: с тех пор, как мы создали взрыв для Cheril Perils и пулю для Zombie Calavera, мы их не поменяли ни на пиксель.  Да, нам хватило наглости создать все последующие игры со взрывами и пулями, не изменив эту графику. Но раз уж мы заметили в ваших рядах интерес к гиперкастомизации, займем-ка мы несколько параграфов объяснениями, как их поменять. Но предупреждаем: придется хорошенько выпачкать себе руки, занимаясь этой грязной работой.

piojo-3932[1]

Это Пи-глаз (у него 3,14 глаз)

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

Итак. Чтобы поменять эту графику, что мы должны сделать, так это заменить ту, что прописали в файле Чурреры \dev\extrasprites.h. Для начала откроем архив в нашем не самом примитивном текстовом редакторе  и глянем, что там есть. В этом архиве  колбаски цифр используются для определения трех видов графики для спрайтов (и их масок): числа 17, 18 и 19. Число 17 как раз и соответствует взрыву. Число 18 – свободный спрайт, который использует мотор, когда не хватает одного из трех врагов, которые умещаются на экране, или для вспышек и других вещей, которые я сейчас не помню. Здесь мы, конечно, ничего менять не будем. Число 19 – спрайт пули, и он самый маленький (увидишь, что есть более маленькие цифры).

Изменение взрыва

Взрыв – это спрайт размером 16 х 16 (осторожно, пестиньо! (очередной подвид чуррос)). По правилам построения splib2, чтобы определить спрайт 16 х 16, отправляем его в верхнем левом угле размером 24 х 24. Именно поэтому splib2 работает с символами, и квадрат 24 х 24 на языке Си всегда может вместить целиком спрайт размером 16 х 16. Не волнуйся, если это выглядит, как китайская грамота,  понимать это необязательно (но если тебе любопытно, у нас всегда можно спросить). Мы говорим об этом, только чтобы ты сориентировался и знал, что мы собираемся менять. В архиве ты увидишь 3 колбаски чоризо из 24 строчек цифровых пар, каждая из них под этикеткой ._sprite_17_X, где х – это a, b или с. Это 3 колонки из 24 строчек по 8 пикселей, которые составляют наш спрайт, и как раз те данные,  которые мы должны заменить. Размести их в архиве.

Следующий шаг – создать свободный тайлсет (архив png 256 x 32) и нарисовать первую клетку взрыва и его маску. Вот так:

nueva-explosion-4223[1]

 

 

code-seleccion-4557[1]

Когда все сделано, сохраняем архив как \gfx\extra.png и кодируем его, используя sprcnv, как объясняли в прошлой главе, но в этот раз, указывая extra.h в качестве исходного архива:

..\utils\sprncv.exe extra.png extra.h

Всё это нам создает архив extra.h в \gfx. Открываем этот архив в текстовом редакторе.

Этот архив содержит определения 16 спрайтов. Нам нужен только самый первый из этих спрайтов, чтобы его вырезать и вставить в extrasprites.h, заменив на 17. Вот что делаем: выделяем 3 колонки спрайта 1 (выделенные этикетками ._sprite_1_X, где х – это a, b или с) и копируем их в буфер обмена.

Теперь переходим к extrasprites.h, удаляем три колонки  ._sprite_17_X, вставляем три колонки  ._sprite_1_X из буфера обмена, и теперь, спокойненько меняем все этикетки  ._sprite_1_X на  ._sprite_17_X.

Отлично! Делай это оооооочень медленно. Проверь, что сделал все правильно, переименовал корректно все этикетки.

Изменение выстрела

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

Так же как и с графикой 16 х 16, определяем его в больший квадрат 24 х 24 для позиционирования на экране, определяем ячейку 8 х 8 в квадрат 16 х 16 или, что то же самое, в две колонки из 8 х 16 пикселей.

В архиве extrasprites.h находятся колбаски чоризо под этикетками ._sprite_19_a и ._sprite_19_b.

Чтобы быстрее дошло – у пуль нет масок. Это значит, что графика определяется первой величиной в восьми первых линиях. Как видим ниже, эти значения 0, 0, 24, 60, 60, 24, 0, 0.

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

00000000
00000000
00011000
00111100
00111100
00011000
00000000
00000000

Мы его поменяем, например, на звёздочку ниндзя (друзья, немножко воображения!):

00000000
00010000
00011000
00100110
01100100
00011000
00001000
00000000

 

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

code-estrella-ninja-4732[1]

Блин, чувак, какой бардак!

Да, старайся ничего не менять. Уже жалеешь, что спросил? Скорее всего, ты сейчас уже думаешь, что взрыв и пуля в изначальной версии в итоге не так уж и плохи.

Фиксированные окна

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

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

Но не волнуйся, мы все объясним.

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

 

Начальное окно

Как уже говорили, речь идет об окне, которое показывает название игры и настройки управления. Выбор управления тоже фиксированный: если игрок нажимает 1, выбирает управление клавиатурой. Если нажимает 2, выбирает Kempston, если 3, то это для игры джойстиком Sinclair (интерфейс 2, порт 1). Что бы это могло значить? Просто рисуем экран, который кроме названия игры, показывает и эти три опции. Например, как-то так:

vacdln-title-4928[1]

Когда нарисуешь свое окно, сохрани его как title.png в директории \gfx.

Окно маркировки игры

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

Зона игры, где, собственно, все и происходит. Как ты уже догадался, это окно должно быть такого же размера, как и другие наши окна. Если помнишь, наши окна размером 15 х 10 тайлов и, следовательно, занимают 240 х 160 пикселей. Ты должен зарезервировать зону этого размера для основной игровой области.

Индикатор жизней/энергии/ жизнеспособность / что-то еще: 2 цифры, нарисованные тем шрифтом, который ты выбрал, когда рисовал тайлы.  Надо его разместить где-то, добавив что-нибудь, означающие графики. Мы обычно рисуем фигурку нашего героя и «Х», как видишь на примерах.

Индикатор ключей (если используешь ключи в игре). Все делается так же, как и для индикатора жизней.

Индикатор объектов (если используешь объекты в игре): и снова то же самое для объектов.

Индикатор убитых врагов (если врагов можно убивать и важно их считать). Точно так же.

Все эти штуки можно разместить где вздумается, главное, чтобы они были вписаны в одну строку. После мы должны определить место каждой из этих штук (в координатах это 0, 31 для Х и 0, 23 для Y), чтобы это место было указано в настройках Чурреры (как мы обсуждали в нескольких главах ранее).

Рассмотрим это на примере. Это окно маркировки игры Lala Prologue. Мы видим различные элементы. В этой игре у нас есть ключи, а еще надо собирать объекты, поэтому нам надо указать оба индикатора, в плюс к индикатору энергии – и вот что мы видим:

lala-marco-5240[1]

Игровая зона, как видим, начинается в координатах x = 1, y = 2, т.е. (1, 2).

Область, которую мы оставили для индикатора энергии, находится на (4, 0).

Индикатор объектов появился на (11, 0).

И, наконец, индикатор ключей – на (18, 0).

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

Когда создашь свое окно, сохрани его как marco.png в директории \gfx.

Совмещенные стартовое окно и окно маркировки игры

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

Что мы и сделаем для нашей игры Dogmole, как видно ниже:

dogmole-title-5424[1]

Как видим, тут и название игры, и настройки управления, о которых мы говорили в части, посвященной начальному окну. Игровая зона, как видно, появилась под зоной, занятой названием и настройками управления:

Игровая зона находится в координатах (1, 0).

Счетчик убитых врагов (колдунов) появился на (12, 21).

Счетчик коробок (или объектов) нарисован на (17, 21).

Счетчик жизней – на (22, 21)

И, наконец, счетчик ключей у нас на (27, 21).

В этом случае совмещенное окно названия / маркировки сохраняется как title.png в \gfx.  Архива marco.png для игр, имеющих совмещенный экран названия / маркировки, у нас не будет, как видим на примере Dogmole.

Финальная заставка

Это окно, которое появляется,  когда игрок успешном завершил игру. Здесь никаких ограничений: рисуй все, что вздумается!  Лучше с юморком, но если тебе нравятся серьезные игры, никто не мешает. Это финальная заставка Dogmole:

dogmole-ending-5559[1]

Дерьмо, задница, проклятье!!!

Когда все сделано, сохраняем его как ending.png в директории gfx.

Конвертация окон в формат Спектрум

Для этого снова воспользуемся  замечательнейшим SevenuP.  Можешь использовать и другие программы, но раз уж у нас уже есть SevenuP, им и воспользуемся, да? Начинаем, запускай SevenuP. Как открыли, нажимаем кнопку I (импортировать). В открывшемся окне выбора архивов ищем наш title.png. SevenuP сохранит архив и переведет его в формат окна Спектрум. Нажимаем S, чтобы сохранить, и отправляем его в \gfx под кличкой title.scr.

Проделываем то же самое с marco.png (если его используем) и ending.png. В конце концов, остаемся с title.scr, marco.scr (если его используем) и ending.scr в \gfx.  Не будь простофилей и не удаляй png, чтобы потом можно было что-то поменять или использовать в другой игре (хе-хе-хе).

Сжатие окон

Как ты возможно уже сообразил, 6912 байта, необходимых на каждый экран, умножить на 3 (или 2) – получится ого-го, и поэтому будем их сжимать. Для этого используем компрессор apack.exe из пакета в библиотеке aplib. Спокойно, мы его включили в папку utils. Открываем наше командное окно, идем в директорию gfx и сжимаем каждый из наших трех (или двух, если не будешь использовать отдельно маркировку игры) файлов scr в архив с тем же названием, но с bin на конце.

..\utils\apack.exe title.scr title.bin

 ..\utils\apack.exe marco.scr marco.bin

 ..\utils\apack.exe ending.scr ending.bin

В итоге получаем три (или два) архива .bin, которые скопируем в папку \dev.

Наблюдаем, как вес архивов стремительно уменьшается. В случае Dogmole, title.bin занимает 1277 байтов, а ending.bin1084 байта. Что значительно меньше,  чем 13824 байта до сжимания.

На этом всё

Что, уже? Это была скучная глава. Знаю. Но, блин, все же нужная. В следующей главе научимся размещать врагов, объекты и ключи на игровой карте. И скоро, очень скоро, сможем в первый раз все собрать вместе, чтобы увидеть, как оно работает.

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

 




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

Отправить ответ

avatar
  Subscribe  
Уведомлять об
Close