50
TECHNO BROTHER

Ответ на пост «Сквозь боль и страдания: Я сделал игру для денди»

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

Ответ на пост «Сквозь боль и страдания: Я сделал игру для денди»

Я тоже заказал плату под ROM, буду писать свою игрушку ради фана... Ну и конечно напишу об этом подробную статью, как вы и любите :)

Показать полностью 1
1829

Сквозь боль и страдания: Я сделал игру для денди

Начальная заставка

Начальная заставка

Вступление

Давно, когда я еще учился в школе, зимним вечером, пройдя очередной уровень марио я загорелся идеей - сделать свой платформер для игровой приставки.

Примерно через полгода у меня появился персональный компьютер с операционной системой MS-DOS и средой программирования QBasic:

QBasic

QBasic

Ну вот! Подумал я, настал мой час и сел писать игру в надежде что как-то придумаю как запихнуть эту игру потом в приставку денди.

Наивно, но тогда не было интернета и узнать, как вообще создавать игры и заливать их на картридж было довольно сложно.

Понятное дело, после некоторых попыток у меня толком ничего не вышло.

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

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

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

Железо

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

Готовая приставка

Готовая приставка

Что мы имеем:

CPU - UA6527P/UA6527, Клон популярного в свое время 8-битного процессора 6502.

PPU - 6538/6528, Видеочип, аналог видеокарты.

RAM - 62256, 2 Кбайт оперативной памяти, которые позволяют использовать горизонтальный или вертикальный скролл по очереди, было бы 4 Кб можно было бы в теории и одновременно.

Звук - 2 прямоугольных канала, 1 треугольный, 1 шумовой и цифровой канал. Да-да, примитивная звуковая карта уже в те времена.

Микросхемы приставки

Микросхемы приставки

Разрешение экрана 256х240 и 54 цвета (Есть цвет чернее черного и еще некоторые цвета, которые лучше не использовать для избежания глюков на разных телевизорах).

Приставка Dendy она же NES

Приставка Dendy она же NES

Инструментарий

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

Я решил использовать си для короткого и удобного вида кода, но некоторые вставки ассемблерного кода пришлось писать с нуля (так как скорости процессора в 5,37 МГц всегда не хватало).

Для компиляции кода я использовал компилятор cc65, с опцией --add-source (добавляет ассемблерный код, в котором уже можно найти не очевидные косяки).

Для графики, кроме фотошопа использовал программу YY-CHR:

YY-CHR

YY-CHR

Для распиливания рома на прошивку, программу NRM.

Для статичных фонов есть очень удобная программа NES Screen Tool, которая позволяет нарисовать и выгрузить экран в массив байтов. Бонусом этом массив можно еще сжать RLE сжатием.

Для написания музыки и звуков я использовал FamiTracker и библиотеку FamiTone2.

Для создания уровней Tiled + самописный конвертер в встроенный формат карты.

Для схемы картриджа Sprint layout.

Для отладки лучше всего подходит эмулятор FCEUX:

FCEUX

FCEUX

Код игры

Но самая попаболь проблема, была в том, что я решил делать платформер а не статичную игру.

Сразу загрузить массив байтов на экран нельзя, потому что длинна уровня может быть от 3 до 256 экранов в длину.

Видеочип за один кадр успевает загрузить только 2 ряда блоков по 8 пикселей.

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

Для оптимизации я разработал такую структуру уровня. Где экран разбит на поле 16х16:

const unsigned char LEVEL1[] = {

...

0x75,

2,

ID_OBJECT,

...

};

Первый байт — координаты на экране x = 7, y = 5.

Второй байт — номер экрана уровня.

Третий байт — идентификатор объекта.

Структура объектов в игре

Структура объектов в игре

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

unsigned char COLLISION[64];

Первые 32 байта, это первый экран NAMETABLE, вторые 32 байта для второго экрана NAMETABLE экрана.

Каждый бит, может быть, 0 если игрок может пройти и 1 если стена.

В итоге получаем два поля по 16х16 бит = 32+32 байта.

Картридж

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

Вид игры в эмуляторе

Вид игры в эмуляторе

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

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

Из приставки можно реально выжать намного больше и красивее, но по трудозатратам эта игра будет на уровне современной игры с красивой графикой, стоит ли оно того?

Возможно, кто-то захочет этим заняться, и я поделюсь с ним своими наработками.

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

Схема в Sprint layout

Схема в Sprint layout

Можно было бы, конечно, заказать у китайцев картриджи на каплях или флэш-памяти, но я хотел именно винтажного вида картриджа на DIP микросхемах (такие раньше попадались только в старых или дорогих картриджах)

Сами микросхемы найти не составило проблем, сначала я развел схему под w27c512, но как оказалось более объемная память w27c010 стоит дешевле и найти ее еще проще.

После того как пришли платы, я подготовил прошивку через NRM, прошил микросхемы в программаторе XGECU T48 и впаял их на место.

Готовый картридж для Денди

Готовый картридж для Денди

Распространение

Как продвигать игру, продавать картриджи и как их распространять: большой вопрос.

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

Я крайне доволен своей работой, выпустить игру на физическом носителе для приставки 40-летней давности довольно крутая ачивка для разработчика игр.

И по традиции, страница игры... На авито?:

https://www.avito.ru/novosibirsk/igry_pristavki_i_programmy/igra_dlya_dendi_2025_goda_7772682988

Показать полностью 11
Отличная работа, все прочитано!