Сделал маленькую игру для NES 💻
👁 4
Хотелось попробовать что-то необычное: написать игру для старой доброй Nintendo Entertainment System она же Famicom она же известная нам Dendy. Так появилась Star Courier - небольшая аркада про сбор энергии в космосе.
Управляешь кораблём, собираешь восемь энергетических ячеек и уворачиваешься от патрульных дронов. На всю миссию - три щита. После столкновения корабль ненадолго становится неуязвимым и мигает. Собрал всё - победа. Потерял щиты - можно попробовать снова.
Звучит просто, но на NES даже такая игра даёт повод разобраться, как устроена консоль.
Что под капотом !😈
Игровую логику написал на ассемблере 6502 (процессор Ricoh 2A03 для NES (NTSC) основан на ядре MOS 6502). Здесь приходится самому заниматься вещами, которые современные движки обычно берут на себя: читать контроллер, обновлять спрайты, выводить текст и обращаться к звуковому чипу.
Графику тоже сделал с нуля. Небольшой Python-скрипт собирает пиксельный шрифт, корабль, дронов и энергетические ячейки в формат NES. Даже расположение надписей на экране нужно подготовить заранее.
Особое внимание - работе с видеопамятью. Обновления во время игры выполняются в короткий промежуток между кадрами, когда консоль не рисует изображение. Это быстро приучает думать о том, что и когда делает код.
Звуковые эффекты получились простейшими: один импульсный канал звукового чипа сообщает о подборе энергии и получении урона. Для такой маленькой игры этого достаточно, чтобы действия ощущались живее.
Без забавных ошибок не обошлось !🙂
При проверке экрана заметил надпись SHIELDS33. Оказалось, счётчик щитов обновлял соседнюю позицию: новая цифра попадала на место пробела, а старая оставалась рядом. Ошибка всего на одну клетку - и у игрока уже будто бы 33 щита вместо трёх.
Проверку игровой логики автоматизировал через Lua в эмуляторе FCEUX. Тесты нажимают кнопки, проверяют движение и границы поля. Для проверки столкновений и сбора предметов они устанавливают нужные позиции объектов в памяти. Так удалось проверить победу, поражение, временную неуязвимость и повторный запуск.
Что получилось !📖
На выходе - настоящий .nes ROM размером около 24 КБ (стандартный картридж имеет 32 КБ для кода и 8 КБ для графики): с титульным экраном, игровым полем, звуками и завершённым игровым циклом. Пока проверил его в эмуляторе; до настоящей консоли ещё не добрался. Больше всего мне понравилось, насколько хорошо здесь видна связь между кодом и результатом. Несколько байтов меняют рисунок корабля, одно значение - его скорость, один неверный адрес - артефакт на экране.
1
Supreme Commander Two
Подписаться