Разработка игр для ZX Spectrum сегодня

Всем привет!

Меня зовут Сергей. Эта статья написана по просьбе Yuriy. Он попросил написать о том, как делаются игры на спек в современных реалиях.

Приступим…

Начну с того, что писать для ZX Spectrum’а можно абсолютно различными способами. Начиная с использования ASM на самом старичке и заканчивая языками высокого уровня на Windows, Linux и даже MacOS.

Disclaimer: Описанное мной ниже было использовано для создания трех игр. Две из них были выставлены на конкурсах "Yandex Retro Games Battle 2020" и "Твоя Игра 6". Я делаю так, как удобно мне. Я не призываю использовать исключительно мой подход. Я за то, чтобы росли все цветы.

Летом прошлого года моя мама переезжала на новую квартиру, и в процессе упаковки вещей нашла мой первый компьютер. Это советский клон ZX Spectrum 48K.

Красавчик собственной персоной ZXBITLES
Красавчик собственной персоной ZXBITLES

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

Дорогой читатель может возмутиться: «Позвольте! А где же разработка?». Терпение, господа! Ни одна разработка не может быть завершенной без тестирования на железе.

Подключение спека к телевизору было проблемой еще в 90-е, а сейчас подключить DIN разъём отдельный квест. Следует сказать, что я знаю с какой стороны браться за паяльник, хотя и далёк от схемотехники и радиоэлектроники.

Google указал мне единственно приемлемый для меня путь — GBS8200. Китайская штуковина могёт RGB преобразовывать в VGA.

Свободного пространства в корпусе компьютера было много, и плата конвертера как раз вмещалась. Пришлось навесить три конденсатора и потыкать проводами чтобы понять распиновку DIN разъёма, но результат был достигнут!

В ожидании доставки конвертера я впал в ностальгию и начал интересоваться как обстоят дела в мире спека. Оказалось, что весьма неплохо. Проводятся даже конкурсы для новых игр. Собственно YRGB2019, и предстоящий YRGB2020 и натолкнул меня на идею написать игру, а заодно и закрыть гештальт.

В детстве я баловался созданием своих игрушек (как и все у кого был спек), посему было решено разработать игру, но серьезно, профессионально, если угодно.

ASM был отвергнут мной изначально, по причине его незнания. Поиск привел меня на страницу ZXBasic.

Ну, вот мы и подошли к теме.

ZXBasic это SDK для разработки софта на диалекте FreeBasic с возможностью использования ассемблерных вставок.

В качестве среды разработки может использоваться любой текстовый редактор. Желательно выбрать тот, что имеет возможность подсветки синтаксиса, как, например, Notepad++ или Vim. Однако, в последствии я перекочевал на Visual Studio Code.

Visual Studio Code с загруженным проектом Red Raid: The infiltrating... ZXBITLES
Visual Studio Code с загруженным проектом Red Raid: The infiltrating... ZXBITLES

Для ZXBasic на VSCode есть плагин, который позволяет подсвечивать синтаксис.

Сам плагин ZXBITLES
Сам плагин ZXBITLES

Сборка проекта выполняется с помощью консоли. Последнюю версию компилятора можно взять здесь. Пример команды на компиляцию выглядит так:

C:\Projects\ZXSpectrum\zxbasic\zxbc.exe -O4 -o «C:\Projects\ZXSpectrum\Red Raid The Infiltrating\Red Raid The Infiltrating (Side B)\RRI Side B.tap» -H 128 --org 24576 -t -a -B «C:\Projects\ZXSpectrum\Red Raid The Infiltrating\Red Raid The Infiltrating (Side B)\program.zxbas»

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

cd "C:\Projects\ZXSpectrum\Red Raid The Infiltrating\Red Raid The Infiltrating (Side B)"
copy /b loader.tap + screen.tap + "rri side b.tap" "Red_Raid_Infiltrating_B (EN).tap"

Ну, а далее остается только вызвать собранный тапок в эмуляторе (я использую FUSE), чтобы убедиться, что все работает:

@echo off
if %ERRORLEVEL% ==0 (
"C:\Program Files (x86)\Fuse\fuse.exe" "C:\Projects\ZXSpectrum\Red Raid The Infiltrating\Red Raid The Infiltrating (Side B)\Red_Raid_Infiltrating_B (EN).tap"
) else (
pause
)

У меня есть bat-файл, содержащий вышеперечисленные команды, который все это делает автоматически.

Компиляция проекта с запуском в эмуляторе ZXBITLES
Компиляция проекта с запуском в эмуляторе ZXBITLES

Во время компиляции в консоли будут выведены ошибки и предупреждения, которые помогут при отладке.

Теперь о грустном.

1. Проверки синтаксиса налету нет.

2. Call Stack тоже отсутствует.

Но, ведь это слишком мало, чтобы нас остановить. Верно? Как известно, русский человек любит создавать себе препятствия, а потом с успехом их преодолевать. Тут же они уже имеются, а потому далее все должно пойти проще.

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

Для рисования спрайтов я использую Paint.NET.

Рэд смотрит на Вас с немым вопросом: "Зачем читаете это? Оно вам надо?" ZXBITLES
Рэд смотрит на Вас с немым вопросом: "Зачем читаете это? Оно вам надо?" ZXBITLES

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

Результат конвертации спрайта ZXBITLES
Результат конвертации спрайта ZXBITLES

Со спрайтами разобрались. Надо бы добавить звуков. В случае с 48К воспроизводить музыку во время геймплея геморройно. Дело в том, что проигрыванием звуков занимается процессор, а он там один. Поэтому, или играем музыку или обсчитываем логику игры.

Конечно, можно воспроизводить ноты малой длительности (желательно фиксированные), а в интервалах перемещать спрайты, опрашивать клавиатуру и обсчитывать логику. Надо ли говорить, что музыка с одинаковыми по длительности нотами и фиксированным ритмом выглядит более, чем уныло. Пример тому, любимый буржуями, Manic Miner. Так что подумайте дважды, так ли вы ненавидите человечество, что готовы его истязать подобными трелями.

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

Для написания музыки можно использовать Beepola.

Учусь писать музыку сам, пока выходит не очень ZXBITLES
Учусь писать музыку сам, пока выходит не очень ZXBITLES

Нечто подобное я попробую реализовать в четвертой игре, которая сейчас в разработке.

Спрайты есть, движок есть, музыка для меню есть, в геймплей тоже звуков напихали. Что еще?

Заставка!

Загрузочный экран, пожалуй, одна из тех немногих возможностей, где игроделы могли оторваться по полной! Для создания заставок я использую ZX Paintbrush.

Заставка из третьей игры ZXBITLES
Заставка из третьей игры ZXBITLES

Я предпочитаю рисовать в векторных редакторах (если требуется), потом собирать растровую графику в Paint.NET, а потом сохранять в png-формате и импортировать в ZX Paintbrush. Допиливать уже можно непосредственно в нём.

Для работы с исходниками я использую SVN. Очень удобно, даже в случае индивидуальной разработки.

Готовый тапок обязательно запустите на своем спеке. И если скупая мужская слеза не прокатится по трехдневной щетине или не появится комок в горле, который провалится только после глотка холодного пива в честь завершения проекта, то у Вас нет сердца, но появился новый враг!

Ну, вот собственно и всё!

А всё ли?

Я описал инструменты, которые использую, но достаточно ли этого? Нет!

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

Да! Именно!

Надо сделать так, чтобы далёкий от спека человек сказал: "А на хрена ты под древний комп это сделал? Можно ж под андроид и PC." В этой оценке не будет пренебрежения геймплеем или звуками, будет только непонимание в выборе целевой платформы. Не спорьте с ним. Вы всё сделали правильно. Люди, разбирающиеся в 8-ми битных платформах, поймут и оценят, а Вы закроете свой персональный гештальт.

И пожалуйста, очень прошу, не делайте порты или ремейки!!! Черпайте вдохновение в играх, фильмах и книгах, берите новые механики из современных игр, комбинируйте и реализуйте их на ретроплатформах, но никогда не идите там, где уже прошли толпы.

На этом, пожалуй, все. Написано на одном дыхании в качестве пробы жанра. Если зайдет, то может буду писать что-то типа девлога о новой игре. Только вот как оценить, что это Вам надо? Скажем, если наберет статья 150 лайков, то продолжим. Идёт? :)

Всем удачи и добра.

С уважением, Сергей.

P.S. Не устаю попрошайничать и зазывать новых подписчиков к себе на канал.

P.P.S. Забыл добавить. Для платформеров рекомендую использовать Tiled.

Один из уровней ZXBITLES
Один из уровней ZXBITLES

Тут я рассказываю как с ним работать.

77 показов
5.3K5.3K открытий
33 репоста
83 комментария

Эта статья написана по просьбе Yuriy.Спасибо огромное! Сейчас убегаю на встречу по настолкам, но как вернусь обязательно прочитаю)

Ответить

Чо, проведём перепись аксакалов? Молодёжь молодёжью, да прибудет с ними сила, но кто начинал с ZX именно как первого домашнего компьютера?
Позвольте начать. Я.

Ответить

Первым был павший смертью храбрых клон 48к, даже не вспомню сейчас чьего производства, но вскоре его место занял Scorpion 256 с SMUC и диском на 40Мб, который жив до сих пор 😌

Ответить

У меня был БК. Считается?

Ответить

именно свой домашний тоже был клон Спектрума - Дельта-С. С убитыми прерываниями который

Ответить

10 BEEP 1,0: BEEP 1,2: BEEP .5,3: BEEP .5,2: BEEP 1,0
20 BEEP 1,0: BEEP 1,2: BEEP .5,3: BEEP .5,2: BEEP 1,0
30 BEEP 1,3: BEEP 1,5: BEEP 2,7
...

Ответить