Предлагаю вашему вниманию перевод занимательной статьи, на которую я недавно наткнулся. Больше интересного на моем телеграм-канале, подписывайтесь)

Современные технологии позволяют разработчикам-любителям достаточно легко создавать современные игры для ретро-приставок. В прошлом году я выпустил новую игру для моей любимой консоли: Super Nintendo (SNES). Проект дошел до реального физического релиза, с картриджем и картонной коробкой, как в 90-е. В этой статье я представлю вам многочисленные шаги этого невероятного путешествия: разработка игры, преодоление технических проблем, связанных с SNES при программировании, производство новых картриджей SNES, а также создание мануала и коробки.


Игра: Йо-Йо Сюрикэн.

Yo-Yo Shuriken   - это динамичная аркадная игра для одного или двух игроков в Super Nintendo (SNES).

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


Игра вышла на картридже с красивой картонной коробкой и руководством от Catskull Games:

https://catskullgames.com/yo-yo-shuriken

Если вы предпочитаете играть в нее на эмуляторах, ROM -файл доступен здесь:

https://drludos.itch.io/yo-yo-shuriken

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

Разработка игры

Создание Yo-Yo Shuriken было довольно органичным процессом. Я проверял идеи, когда они приходили мне в голову, и пытался их усовершенствовать, пока у меня не получилась «прикольная» игра. Начнем с первоначальной задумки. Долгое время я хотел сделать игру-стрелялку с одной пулей, так, чтобы  она возвращалась к игроку после каждого выстрела. Помимо идеи «единственной пули», я также хотел сделать игру, в которую можно было бы поиграть вместе с другом. С такими задумками я создал игру шаг за шагом. Каждое важное достижение в развитии игры было помечено как новая «версия» и подверглось интенсивному тестированию. Если текущая версия была хорошей, я продолжал добавлять новые функции. Кроме того,прежде чем добавлять что-то новое, я работал над текущими функциями до тех пор, пока игра снова не становилась интересной. Вот краткое изложение основных игровых прототипов со скриншотами. Если вам интересно поиграть в прототипы игры, образ доступен бонусом для тех, кто поддержит меня на Patreon.

1) Cyber ​​Ninja - версия 1

Первое, что нужно сделать при создании игры на платформе, которую вы не знаете, это отобразить что-то на экране! Поэтому я нарисовал спрайт робота-ниндзя и попытался заставить SNES отобразить его на экране. Когда это удалось, я добавил код для перемещения спрайта с помощью D-Pad. А затем я сделал анимацию ходьбы, когда спрайт перемещался. Эти первые шаги могут выглядеть просто. Но помните, что я впервые делал игру для SNES! Так что на самом деле это заняло довольно много времени, так как я изучал, как работает машина, когда  писал игру. Поскольку текущий проект отображал только роботов-ниндзя, я назвал его «Кибер-ниндзя».

2) Cyber ​​Ninja - версия 2

Сам спрайт игрока, ниндзя, появился в этой второй версии. Так что роботы-спрайты, естественно, стали их врагами, поскольку все знают, что ниндзя и роботы ненавидят друг друга! Как гордый ниндзя, игрок может бросить один сюрикен. Сюрикен может застрять на границе экрана, и игрок должен поднять его, чтобы иметь возможность снова стрелять. Враги робота могут бесцельно двигаться по экрану, но столкновение пока не обнаруживается.

3) Yo-Yo Shuriken - версия 1

После нескольких тестов я подумал, что сюрикен может автоматически вернуться к ниндзя, когда игрок нажимает кнопку во второй раз. Мне было очень весело во время тестирования этой механики, поэтому она стала ядром всей игры! Я также изменил название проекта, чтобы отразить эту эволюцию: попрощайтесь с "Cyber ​​Ninja" и добро пожаловать в "Yo-Yo Shuriken"! Действительно, в игре сюрикен движется взад-вперед, как йо-йо.

Я также добавил обнаружение столкновений. Теперь роботы исчезали, когда сюрикен в них попадал. Но и игрок исчезает, если робот ударит. На этом моменте основной игровой процесс, несмотря на в очень базовое состояние всего остального, почти завершен. Поэтому я решил провести «стресс-тест» движка, чтобы посмотреть, как сильно я смогу его нагрузить, пока игра не зависла. Мне удалось дойти до 80 врагов, которые ходили и взаимодействовали на экране. Помните, что SNES может отображать в общей сложности 128 спрайтов, поэтому 80 спрайтов, которые обновляются 60 раз в секунду со столкновениями и анимацией - это своего рода достижение.

4) Yo-Yo Shuriken - версия 2

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

5) Yo-Yo Shuriken - версия 3

Я добавил другой цвет фона и систему для бесконечного появления врагов. В предыдущей версии, когда все 80 роботов были уничтожены, игра была пуста. Теперь генерируется бесконечная армия роботов! Враги могут также преследовать игрока, чтобы заставить его продолжать двигаться. Действительно, в этой пятой версии игра быстро становилась скучной, если игрок оставался статичным.

6) Yo-Yo Shuriken - версия 4

В этой версии я столкнулся с первой большой технической сложностью: показывать спрайты большого взрыва всякий раз, когда умирает робот. Я выбрал довольно маленький спрайт игрока и врага: 16x16 пикселей. Таким образом, я мог бы отображать множество их на экране, сохраняя при этом достаточно свободного места, чтобы игрок мог передвигаться и избегать ударов врагов (разрешение экрана SNES составляет 256x224 пикселей). Однако я решил нарисовать свои взрывы в большем размере: 32x32 пикселей. Super Nintendo способен отображать два разных размера спрайтов одновременно. Разработчик может выбрать «маленький» и «большой» размер спрайта из небольшого списка размеров (8x8, 16x16, 32x32 и 64x64), и консоль использует эту информацию при доступе к видеопамяти для отображения спрайта на экране. Это одна из многих графических функций, облегчающих жизнь разработчикам игр. Но, как и любая техническая функция, она может стать сложной, если вы не знаете, как ее использовать!


В частности, в этом текущем прототипе большая часть спрайтов взрыва не отображалась, что бы я ни пытался сделать. На самом деле проблема оказалась довольно простой: я  не загружал спрайты туда, куда надо - в видеопамять SNES. Таким образом, машина не имела к ним доступа. Я таки нашел решение после нескольких часов изучения великолепной документации , созданной любительским коммьюнити за эти годы. Я благодарю их за усердную работу по созданию и распространению всех этих ценных знаний: без них такие начинающие, как я, не смогли бы создавать игры SNES!

7) Yo-Yo Shuriken - версия 5

В этом прототипе отмечу добавление еще одной ключевой функции: режима совместной игры двух игроков!

Также к бою присоединяются новые виды врагов: оранжевые роботы могут сделать несколько ударов, прежде чем взорваться, а синие роботы могут преследовать игрока где угодно. Еще я добавил монеты, которые вы должны собрать, чтобы набрать очки. Этот механизм значительно улучшает игровой процесс. Действительно, единственный способ набрать очки - это собирать монеты. Убийство роботов само по себе не приносит никакой «награды», это всего лишь способ предотвратить смерть вашего аватара. Роботы выбрасывают монеты, когда умирают. Однако монеты исчезают через несколько секунд, а на экране всегда есть множество роботов, которые убьют вас мгновенно касанием. Таким образом, чтобы заработать очки, игрок должен сильно рисковать и перемещаться среди роботов, в противном случае он не сможет набрать большой счет. Но иногда лучше позволить некоторым монетам исчезнуть, чтобы не потерять жизнь. Это то, что игровые дизайнеры называют выбором “риск/награда”, и это отличный способ сделать игру интереснее. Здесь этот механизм позволяет  Yo-Yo Shuriken плавно наращивать сложность для игроков. Как правило, игрок-новичок стремится оставаться неподвижным и сосредоточится исключительно на уничтожении роботов. Он не наберет очков, но сможет продолжить игру и победить финального босса. Как только игрок станет увереннее, он сможет собирать монеты, чтобы достичь рекорда. И, конечно же, опытные игроки могут попытаться совершить «идеальный забег», собрав все монеты, хотя это означает, что они  безумно рискуют!

8)  Yo-Yo Shuriken - версия 6

По мере того, как продолжалось тестирование, я понял, что игра становится довольно повторяющейся. Я протестировал несколько идей, чтобы решить эту проблему. Единственное, что мне показалось особенно интересным, - это удерживать кнопку выстрела, чтобы «зарядить» сюрикен. Когда вы отпускаете кнопку, она запускает «супер удар», который может пробить нескольких врагов. Этот механизм вносит в игру немного стратегического мышления. Теперь игрок может сделать несколько простых выстрелов, чтобы убить врагов одного за другим. Или можно запустить заряженный удар, чтобы убить сразу нескольких врагов. Но тогда игрок будет уязвим, пока супер-удар заряжается.

9)  Yo-Yo Shuriken - версия 7

Начиная с этого варианта, была задействована вся механика игры, которая определяет основной игровой процесс. Таким образом, проект вступил в самую длинную и утомительную фазу: добавление контента и доведение игры до идеала. Сначала я добавил звуковые эффекты, созданные с помощью BFXR . Я также включил замечательные музыкальные треки, написанные XRACECAR . Я также изменил графический интерфейс игры и переместил его в верхнюю часть экрана.

Что касается графики, я добавил рисунок на игровой фон. Поскольку мои художественные навыки ограничены, мне было трудно найти подходящий фон. Я сделал несколько попыток, включая эту, прежде чем  остановиться на «паркете», чтобы подчеркнуть, что игра происходит внутри додзё (см. следующую версию).

И еще не менее важно то, что я начал создавать разные уровни сложности. Каждый уровень состоит из нескольких волн врагов, с увеличением мощности и численности. Я потратил безумное количество времени на тестирование и балансирование наплыва врагов, чтобы сделать игру интересной. Каждый гейм-дизайнер делает это по-своему. Лично мне в аркадных играх нравится смесь напряженных, сложных моментов с более легкими, чтобы игрок мог восстановиться. Например, если ему удается пройти отрезок игры с быстро движущимися роботами, преследующими его, в то время как додзё уже заполнено медленно движущимися врагами, я вознагражу его более спокойным моментом. Например, 4-5 основных врагов, которые двигаются очень медленно, так что вы можете легко убить их и собрать их монеты.

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

10) Yo-Yo Shuriken - версия 8

В этой версии в бой вступил новый тип врагов: робот со щитом. Их можно ударить только сзади. Механизм "йо-йо сюрикен" становится здесь еще более значимым. Действительно, лучший способ убить щитовых роботов - сначала стрелять вокруг них. Затем вам придется вернуть сюрикен и попытаться подбить их, контролируя траекторию возвратного движения. Я также сделал новые спрайты взрывов, и фоновое изображение выглядит лучше. Я даже добавил непобедимость как бонус  (белая голова ниндзя, замененная звездой в финальной игре).

11) Yo-Yo Shuriken - версия 9

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

На скриншотах вы можете увидеть прототип «змеиного» босса и босса, которого нет в финальной версии: танк. Босс-танк должен быть уничтожен в несколько этапов. У него есть несколько слабых мест (оранжевые шары), которые должны быть поражены один за другим. Как только слабое место уничтожено, оно удаляет часть структуры танков, открывая новые слабые места. Это был сложный босс. Например, одна слабая точка находится в конце туннеля, поэтому она требует очень точного прицеливания.

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

12) Yo-Yo Shuriken - версия 10

Ключевым словом этой окончательной версии было «шлифовка». Я добавил открывающую заставку, введение и завершающую анимацию и заставку с объяснением, как проходит игра. Последний штрих состоял в том, чтобы включить скрытый бонусный режим: режим «двойного ниндзя», где вы можете управлять двумя ниндзя с помощью одного контроллера. Чтобы разблокировать этот режим, вам просто нужно закончить игру один раз (или использовать чит-код!).

Итак, после более года в разработке и 5491 строки кода, Yo-Yo Shuriken был окончательно завершен! ПЗУ игры работает отлично. Она был протестирована на нескольких версиях оригинальной игровой консоли (японский Super Famicom, US Super NES, PAL Super Nintendo); в современных версиях (PAL, модифицированный с помощью набора 50/60 Гц от FFVIMan, Analogue Super NT); и на многих эмуляторах (Higan / BSNES, SNES9X, ZSNES, No $ SNS, RetroArch и т. д.) для различных платформ (ПК, смартфон, PSP, Raspberry Pi и т. д.).

Как только окончательная версия игрового софта была проверена (все ошибки исправлены после фазы расширенного бета-тестирования), можно было начинать аппаратную часть проекта. Другими словами, нам нужно было выпустить игру на реальных картриджах с красивой картонной упаковкой! Но прежде чем исследовать эту часть процесса, я бы хотел рассказать вам больше о разработке этой игры для SNES.

Программирование игры

Создание игр на ретро-платформах сопряжено с множеством технических ограничений. Использование современных инструментов упрощает задачу по сравнению с тем, с чем столкнулись разработчики из 90-х. Но у вас все еще много ограничений, связанных с ограниченными техническими характеристиками оборудования. Как и все другие доморощенные разработчики, я боролся с этими ограничениями при создании Yo-Yo Shuriken. Вот инструменты, которые я использовал, и основные проблемы, с которыми я столкнулся. Я надеюсь, они помогут вам понять, как работает SNES.

Инструменты торговли

Еще в 90-х программисты игр должны были изучать и использовать ассемблер для каждой машины, на которой они работали. SNES был сложной машиной для работы, потому что нужно было выучить не один, а два языка ассемблера: сборка 65816 для процессора и сборка SPC700 для аудиочипа.

Сегодня вы все еще можете использовать ассемблер, и на самом деле это единственный способ получить максимальную мощность от любой ретро машины. Но вы также можете сделать довольно крутые игры на языках более простых для изучения, таких как С или Basic. Для SNES у вас есть только один доступный компилятор C - tcc816. Он далек от совершенства, так как вы должны использовать скрипт на Python для оптимизации / исправления ошибок в коде, который он выводит, но это работает. Талантливый кодер по имени Алекмаул взял этот компилятор и создал полную среду для облегчения создания игр: PVSNESlib.

Я использовал эту библиотеку для создания Yo-Yo Shuriken, поэтому я мог писать на С. Для графики я нарисовал изображения BMP, которые были преобразованы в графический формат SNES. Для аудио фреймворк принимает файлы wav для звуковых эффектов и файлы .it (формат Impulse Tacker) для музыки. Сделать игру на SNES было таки непросто, но PVSNESlib сделал ее «сложной, но интересной задачей»!

Как же работает SNES?

По сравнению с другими машинами, такими как Mega Drive / Genesis или PC-Engine / TurboGrafx16, SNES является довольно сложной машиной с множеством различных графических режимов. Но его общий рабочий процесс на самом деле довольно прост. По сути, SNES может отображать графические данные, используя два канала: «фон» и «спрайты». Фон представляет собой полноэкранное изображение из плиток 8x8. Фон может иметь несколько слоев (от 1 до 4), которые можно прокручивать независимо. Объем видеопамяти ограничен, поэтому обычно для потоковой передачи графических данных из ПЗУ картриджа в видеопамять в реальном времени отображаются бесконечные или большие области прокрутки.

SNES может отображать спрайты разных размеров: 8x8, 16x16, 32x32 и 64x64, и только два из этих размеров могут отображаться одновременно. Чтобы анимировать спрайты, вы должны вручную устанавливать их позицию на экране и изменять графические данные, которые они будут отображать 60 раз в секунду. Для этого, как и в случае с фоном, сначала необходимо скопировать графические данные (то есть часть вашей таблицы) из микросхемы ПЗУ картриджа в видеопамять консоли.

SNES также может воспроизводить аудио, используя специальную микросхему (SPC700).

Ввод легко считывается с  кнопок, которые нажимают игроки на геймпадах SNES. (лучший геймпад из существующих!)

В конце концов, даже если вы используете такой инструмент, как PVSNESLib, вам нужно знать, как работает SNES, чтобы создавать для него реальные игры. Отрадно, что замечательное любительское коммьюнити собрало весьма обширную документацию. Я рекомендую:

PVSNESLib wiki, которая поможет вам в настройке инструментов и создании простых программ SNES:

https://github.com/alekmaul/pvsneslib/wiki

Спецификации NoCash SNES (технические, но подробные)  https://problemkaputt.de/fullsnes.htm

Раздел SNESdev на форуме NESdev: https://forums.nesdev.com/viewforum.php?f=12

Сообщество очень открытое . Они не раз спасли меня , пока я делал Yo-Yo Shuriken!

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

Сколько врагов мы можем отобразить на экране?

В такой игре, как Yo-Yo Shuriken, чем больше спрайтов на экране (врагов, взрывов и т.д.), тем лучше будет игра! Тем не менее, игра не должна лагать, поэтому нужно  найти максимальное количество врагов, с которыми может процессор справится, сохраняя при этом плавное отображение со скоростью 60fps. SNES часто позиционируется как «медленный» по сравнению с Genesis/Mega Drive (кто помнит слоган «Blast Processing»?) - (слоган Sega Genesis в 1993. - прим.пер.). И, в некотором смысле, это правда. Хотя SNES может отображать более красочные изображения и более качественный звук, доступное время процессора обычно меньше, чем у Genesis. Другими словами, Genesis обычно может перемещать больше спрайтов на экране, чем SNES. Лучшим примером этого различия являются Contra III (SNES) и IV (Genesis). А конкретнее, как каждая игра справляется со взрывами:

Взрыв на SNES Contra III (слева) сделан с несколькими спрайтами наряду со специальным графическим эффектом (прозрачность), в то время как Genesis Contra IV (справа) отображает их с безумным количеством спрайтов на экране. Программируя каждую консоль, как положено, непосредственно на ассемблере, вы можете почувствовать эту разницу в вычислительной мощности. Однако при использовании компилятора C, как я это сделал для Yo-Yo Shuriken, разница становится еще более очевидной. Так общее количество врагов, которое я мог отобразить, было ограничено доступным временем процессора. Но задачи процессора не ограничиваются управлением спрайтами. Он также должен обрабатывать анимацию, подгружать графические данные в видеопамять, управлять столкновениями, считывать входы контроллера, запускать звуки и музыку на аудиочипе и пр. Разработка Yo-Yo Shuriken была постоянной борьбой за то, чтобы удержать как можно больше врагов на экране, в то время как все остальные элементы сжирали общее доступное время процессора. Следовательно, мне пришлось уменьшить количество врагов в несколько раз, так как я добавил новые функции в игру.

Поначалу, когда только обычные роботы двигались по прямой без обнаружения столкновений, я мог отобразить на экране 80 врагов (плюс 1 игрок и его сюрикен). Когда я добавил обнаружение столкновений между врагами, игроком и сюрикеном, мне пришлось уменьшить это число до 40 врагов. Добавление второго игрока, взрывов, звуковых эффектов и музыки также заняло большую часть доступного процессорного времени. В конце концов, окончательный вариант игры может отображать до 24 врагов на экране, чтобы поддерживать плавную скорость отображения 60fps. Хотя на бумаге это может звучать мало, когда вы будете играть в игру, вы увидите, что 24 врага более чем достаточно, особенно на продвинутых уровнях игры!

Честно говоря, возможность управлять 38 анимированными спрайтами на экране (24 врага + 2 игрока + 2 сюрикена + 10 взрывов) без замедления по-прежнему внушает уважение. Но за этим достижением есть одна хитрость: не все спрайты обновляются каждый кадр. В действительности, тогда как игрок и сюрикены обновляются с частотой 60 fps, враги и взрывы обновляются только 30 fps, а в некоторых случаях даже 15 fps. Этот трюк программирования был довольно распространенным в 90-х годах. Это позволяет распределять вычисления, связанные со столкновениями, по нескольким кадрам, чтобы отображать больше спрайтов на экране без понижения частоты кадров игры.


LUT заставляет спрайты вращаться!

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

С математической точки зрения вам просто нужно вычислить синус и косинус угла  каждого шара, чтобы перемещать их в круговом движении. На современной платформе такие вычисления производятся  легко и быстро. Но на ретро-платформах это не так-то и просто! На! 8/16-битном процессоре нет внутренних функций для вычисления синуса и косинуса в аппаратном обеспечении. Таким образом, вы должны вычислить их в программном обеспечении, комбинируя множество более сложных вычислений. Это, очевидно, занимает значительное количество времени. SNES не сможет вычислить синус и косинус для 24 врагов со скоростью 60 fps в дополнение ко всему остальному. Поскольку шары движутся медленно, они фактически обновляются только один раз каждые 4 кадра, в результате чего количество вычислений снижается с 24 до 6. Но даже этого  в нашем случае все еще слишком много: процессор не может вычислять 6 синусов и 6 косинусов каждый кадр в дополнение ко всем другим задачам.

С математической точки зрения вам просто нужно вычислить синус и косинус угла  каждого шара, чтобы перемещать их в круговом движении. На современной платформе такие вычисления легко и быстро производятся. Но на ретро-платформах это не так-то и просто! На! 8/16-битном процессоре нет внутренних функций для вычисления синуса и косинуса в аппаратном обеспечении. Таким образом, вы должны вычислить их в программном обеспечении, комбинируя множество более сложных вычислений. Это, очевидно, занимает значительное количество времени. SNES не сможет вычислить синус и косинус для 24 врагов со скоростью 60 fps в дополнение ко всему остальному. Поскольку шары движутся медленно, они фактически обновляются только один раз каждые 4 кадра, в результате чего количество вычислений снижается с 24 до 6. Но даже этого  в нашем случае все еще слишком много: процессор не может вычислять 6 синусов и 6 косинусов каждый кадр в дополнение ко всем другим задачам.

Конечно, для решения этой конкретной проблемы есть хитрость, которая также была очень распространена в 90-х годах. Чтобы уменьшить нагрузку на процессор, вы можете просто использовать «справочную таблицу» вместо выполнения вычислений синуса и косинуса каждый кадр. Проще говоря, я заранее рассчитал значения синуса и косинуса для большого диапазона углов, используя программу для работы с электронными таблицами на моем современном компьютере. Затем я сохранил все эти значения в гигантской таблице в ROM -файл. Таким образом, процессор теперь может считывать значения синуса и косинуса, необходимые для перемещения шариков в ROM -файл, вместо того, чтобы тратить время на их вычисление каждый кадр. Эта гигантская таблица предварительно вычисленных данных называется «Справочной таблицей», или LUT (Look-Up Table- прим.перев.). LUT были очень распространены в играх, созданных до 32-битной эры. И они не ограничиваются синусом и косинусом! Все, что «медленно вычисляется» на ЦП, обычно вычисляется заранее, поэтому результаты могут быть сохранены в LUT: тригонометрия, цветовые эффекты, генерация случайных чисел, эффекты растрового сканирования и др.

Когда появились 32-битные консоли, эта проблема была решена, потому что их процессор имел аппаратную функцию для выполнения моментальных тригонометрических вычислений. Действительно, тригонометрия является неотъемлемой частью любого трехмерного рендеринга. Таким образом, такие машины, как PlayStation и Saturn, должны были делать это быстро и многократно в каждом кадре. Читая это, вы можете задаться вопросом: если это правда, как SNES может рендерить 3D-графику в игре, такой как Starfox?

В этом случае LUT недостаточно: будет слишком много вычислений. Поэтому создатели Starfox просто добавили новый процессор, который может быстро вычислить тригонометрию внутри картриджа: знаменитый чип "Super FX"! SNES не сможет вычислить и отобразить все эти трехмерные объекты без Super FX. Но Starfox не единственная игра, использующая такой чип. Super Mario Kart и Pilotwings используют для этой цели еще один чип - «DPS-1». Как и Super FX, он может просчитывать тригонометрию быстрее, чем процессор SNES. В то время как DPS-1 используется только для расчетов, Super FX гораздо мощнее и может фактически рендерить полигоны в 2D кадровый буфер, как это делают PlayStation и Saturn.

Остерегайтесь VBLANK!

Как только процессор завершил вычисление, он должен сообщить графическому чипу, чтобы он отобразил результат своего вычисления на экране. Так работает любая консоль, независимо от даты ее выпуска. Но у консолей из 8/16-битной эры есть определенное поведение: ЦП может отправлять данные графическому чипу только в течение определенного периода времени: «VBLANK». Но что такое VBLANK?

На стандартном  ЭЛТ телевизоре изображение рисуется электронным лучом, который движется сверху вниз и слева направо. Пока электронный луч движется за экраном, чтобы нарисовать изображение, он рисует «пиксели» определенного цвета, используя инструкции из графического чипа консоли. Без этого графического чипа электронный луч не знал бы, какой цвет рисовать, и поэтому на экране не было бы изображения. Как только электронный луч закончил рисовать изображение, он достигает нижней части экрана. Затем он должен вернуться к верхней части экрана, чтобы начать рисовать новое изображение, используя новые инструкции, отправленные графическим чипом. Период времени, в течение которого электронный луч выключен, чтобы он мог переместиться обратно к верхней части экрана, называется «вертикальным гашением», или VBLANK.

На SNES, когда графический чип посылает инструкции электронному лучу, он не может делать ничего другого. Более того, вы не можете даже изменить видеопамять в это время, так как она содержит изображение для отображения на экране. Действительно, графический чип нужен для управления электронным лучом. Если нам каким-то образом удастся изменить видеопамять, пока графический чип отображает изображение на экране, это приведет к повреждению изображения или чему-то еще похуже. SNES разработан таким образом, что он предотвращает подобные случаи: центральный процессор просто не может получить доступ к видеопамяти, пока графический чип отображает изображение. CPU должен ждать периода VBLANK, чтобы иметь возможность отправлять графические данные нового изображения для отображения на экране в видеопамяти. И этот период времени довольно короткий.


На стандартном  ЭЛТ телевизоре изображение рисуется электронным лучом, который движется сверху вниз и слева направо. Пока электронный луч движется за экраном, чтобы нарисовать изображение, он рисует «пиксели» определенного цвета, используя инструкции из графического чипа консоли. Без этого графического чипа электронный луч не знал бы, какой цвет рисовать, и поэтому на экране не было бы изображения. Как только электронный луч закончил рисовать изображение, он достигает нижней части экрана. Затем он должен вернуться к верхней части экрана, чтобы начать рисовать новое изображение, используя новые инструкции, отправленные графическим чипом. Период времени, в течение которого электронный луч выключен, чтобы он мог переместиться обратно к верхней части экрана, называется «вертикальным гашением», или VBLANK.

На SNES, когда графический чип посылает инструкции электронному лучу, он не может делать ничего другого. Более того, вы не можете даже изменить видеопамять в это время, так как она содержит изображение для отображения на экране. Действительно, графический чип нужен для управления электронным лучом. Если нам каким-то образом удастся изменить видеопамять, пока графический чип отображает изображение на экране, это приведет к повреждению изображения или чему-то еще похуже. SNES разработан таким образом, что он предотвращает подобные случаи: центральный процессор просто не может получить доступ к видеопамяти, пока графический чип отображает изображение. CPU должен ждать периода VBLANK, чтобы иметь возможность отправлять графические данные нового изображения для отображения на экране в видеопамяти. И этот период времени довольно короткий.

Итак, каковы фактические последствия всех этих ограничений, связанных с VBLANK? Проще говоря, это еще одно жесткое ограничение общего времени, доступного разработчику игры для показа своей игры на экране. Прежде всего, чтобы игра не отставала, необходимо выполнить все расчеты игрового процесса (столкновения, движения, анимации и т.д.) между двумя периодами VBLANK. Если для вычисления кода игры требуется больше времени, вы не сможете отобразить полученный кадр вовремя, и, таким образом, игра будет заметно лагать.

Но еще более жестким ограничением является то, что вы можете отправлять крайне мало графических данных в видеопамять во время каждого VBLANK. Действительно, скорость передачи графических данных ограничена так называемой «шиной». «Шина» - это настоящая электронная дорожка, соединяющая все микросхемы. Если вы попытаетесь отправить больше данных, чем возможно передать в течение периода VBLANK, дополнительные данные будут просто обрезаны и не будут отображаться.

Коварный баг: ловушка 50 Гц / 60 Гц!

Я испытал ограничения VBLANK на собственной шкуре при создании Yo-Yo Shuriken. Это стало причиной самой ужасной ошибки, с которой я столкнулся за весь проект. Во время бета-тестирования с использованием эмулятора ZSNES и моей собственную консоли все отображалось нормально. Но когда я тестировал игру на других эмуляторах, которые  известны тем что более точны в реализации, чем ZSNES, а именно на SNES9X и Higan / BSNES, некоторые спрайты не отображались. В частности, взрывы были «разрезаны», как вы можете видеть на изображениях ниже:

SNES и моя консоль (слева) / BSNES-Higan (справа)

В течение нескольких недель я безуспешно пытался решить эту проблему. Наконец-то я смог это исправить благодаря помощи волшебников форума SNESDev.

Сообщество SNESDev помогало мне не раз во время этого проекта, и я не могу выразить всю благодарность за ту помощь, которую они оказали! Они обнаружили, что причиной этой проблемы было просто то, что я посылал слишком много данных на графический чип на каждый кадр. Время, необходимое для передачи всех данных, превышало период VBLANK. Таким образом, анимация взрывов не успела добраться до графического чипа до конца VBLANK и была просто отключена. Но вы можете задаться вопросом: почему эта ошибка возникала только на каком-то точном эмуляторе, а не на реальной консоли?

Вот здесь кроется коварный баг. Как и у всех любителей SNES, живущих в Европе, моя детская приставка работает в телевизионном формате "PAL", работающем на частоте 50 Гц. Другими словами, графический чип консоли отображает новое изображение на экране 50 раз в секунду. В США и Японии телевизионный формат отличается: это «NTSC», работающий на частоте 60 Гц. Таким образом, консоли NTSC отображают новое изображение на экране 60 раз в секунду. Значит ли это, что американские и японские игры работают быстрее европейских? К сожалению, да! (но мы не знали об этом в 90-е годы ...). Спросите любого поклонника файтингов, и он объяснит вам, почему лучше играть в версии NTSC: быстрее, плавнее, без черной рамки и т. Д.

Тем не менее, формат PAL имеет одно преимущество перед NTSC. Поскольку телевизоры PAL отображают 50 изображений в секунду вместо 60, электронный луч движется медленнее. Поэтому период VBLANK на консолях PAL длиннее, чем на NTSC. Таким образом, вы можете передавать больше графических данных каждый кадр на консоли PAL по сравнению с моделью NTSC. И это было основной причиной моей ошибки. Когда я тестировал игру на своей детской консоли, работающей на частоте 50 Гц, спрайты взрывов были отлично отображены, потому что период VBLANK был достаточно длинным для правильной передачи всех данных. Однако на BSNES / Higan, чрезвычайно точном эмуляторе, работающем в 60 Гц, спрайты были отключены, поскольку VBLANK короче, и все данные не могли быть переданы вовремя. Тогда почему ZSNES, также работающий на частоте 60 Гц, отображал спрайты без проблем?

Ну, просто потому, что ZSNES - более старый эмулятор, с меньшей точностью, когда дело доходит до воспроизведения всех технических ограничений SNES. Например, ZSNES не мешает вам изменять содержимое видеопамяти вне VBLANK - главное техническое отличие по сравнению с реальной консолью! В конце концов, эта проблема показала мне, насколько важно использовать точные эмуляторы при ведении “кустарных” разработок, и что ничто не может заменить тестирование на реальном оборудовании и на всех версиях оборудования. Поэтому мне пришлось купить дополнительный SNES, работающий в режиме "60 Гц", чтобы иметь возможность более тщательно протестировать игру!

Воплощение в жизнь: изготовление картриджей

Для меня домашний проект не завершен, пока игроки не смогут положить настоящий картридж игры в свою детскую консоль. Но как мы можем создать физический релиз для консоли, которую единственный производитель картриджей, Nintendo, прекратил производство около 20 лет назад?

Ответ прост: вы должны изготовить их самостоятельно! В этой части я сотрудничал с волшебником в электронике по имени Catskull , который уже разрабатывал картриджи для моих игр разработанных  Game Boy. Для этого проекта Catskull разработал новую плату SNES с нуля. Он использовал только новые компоненты, а именно Flash ROM. Все картриджи собраны вручную. Вот деталь полного процесса сборки с фотографиями:

1) Чистая печатная плата

Начнем с самого начала: чистая печатная плата. У Catskull профессионально изготовлены печатные платы. Он получает их «голыми», как показано на рисунке ниже:

2) Нанесение паяльной пасты

Чтобы добавить компоненты (например, электронные микросхемы) на печатную плату, сначала необходимо применить паяльную пасту. Это «клей», который будет связывать микросхемы на печатной плате. Это кропотливая работа. Catskull использует трафарет для нанесения пасты только на требуемые области:

В результате на печатной плате теперь есть паста для всех деталей, на которых будут размещены компоненты:

3) Установка компонентов

Это еще одна кропотливая работа. Все компоненты (микросхемы) должны быть размещены на печатной плате. Catskull собирает 5 плат одновременно (вы поймете почему на следующем шаге). Вот печатные платы без компонентов:

И те же печатные платы со всеми микросхемами, установленными там, где они есть:

4) Запекаем картриджи!

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

5) Прошивка ROM

Теперь, когда электронная схема готова и работает, мы можем записать образ игры на чип памяти. Для этого Catskull использует замечательный INLretro Dumper-Programmer от Infinite NES Lives . Для тех, кто его не знает, Infinite NES Life - еще один волшебник от электроники, создавший множество аппаратных компонентов для NES и SNES. Он опубликовал несколько высококлассных любительских NES игр, спонсирует ежегодный конкурс NESDev и продает печатные платы и тележки NES и SNES для людей, которые хотят создавать любительские игры: http://www.infiniteneslives.com

И Catskull, и я хотели бы поблагодарить Infinite NES Lives за поддержку этого проекта. Прежде всего, он помог Catskull исправить распиновку печатной платы. Затем он добавил поддержку Catskull PCB на своем флешере, чтобы мы могли использовать его для производства нашей игры. И, наконец, что не менее важно, он снабдил нас чипом CIC, необходимым для создания картриджей, которые могут загружаться на оригинальных консолях! Таким образом, благодаря INL, Catskull теперь может легко преобразовать свою собранную вручную печатную плату в работающий игровой картридж SNES с Yo-Yo Shuriken:

6) Установка платы в корпусе

Для завершения сборки картриджа Catskull помещает плату в корпус картриджа. Как вы, возможно, знаете, в коммерческих выпусках SNES 90-х годов было два варианта корпусов. У японских и европейских были закругленные края, в то время как у США они были немного больше и более прямоугольными. Конечно, вы не можете вставить японский / европейский картридж в консоль США, и наоборот.

Для Yo-Yo Shuriken мы хотели сделать единую всемирную версию. Поэтому нам пришлось использовать корпус, который можно было подключить к обоим вариантам приставки. К счастью, есть люди, которые разработали “универсальные корпусы”, которые можно подключить ко всем моделям консолей. Например, вы можете легко найти такие корпусы в Китае по низкой цене. Но мы хотели более качественных материалов. К радости Catskull удалось найти американского поставщика, который разработал свои собственные универсальные корпусы картриджей SNES, изготовленные из высококачественного пластика. Они, очевидно, стоят дороже, но когда вы их держите в руках,есть приятное “надежное” ощущение, как у оригинальных картриджей. Это оправдывало дополнительные затраты в наших глазах. Кроме того, эти высококачественные оболочки также вносят уникальный штрих в выпуск Yo-Yo Shuriken: они доступны только в красном цвете. Поначалу я был удивлен, но теперь я нахожу это очень круто, так как это намек на ярко-красные глаза многочисленных вражеских роботов в игре! Вот фотографии этих корпусов(спереди / сзади):

Конечно, корпусу картриджа еще нужна этикетка с названием игры, и  мы увидим этот шаг в следующем разделе. В довершение краткого описания процесса сборки печатной платы, вот проблема, с которой столкнулся Catskull при изготовлении первого экземпляра:

«Штука в том, что компоненты печатной платы SNES расположены на обратной стороне (обращены от вас, когда они находятся в консоли). Поэтому, на всех этих фотографиях я работаю над задней частью печатной платы. Первый экземпляр я случайно подключил к консоли задом наперед, потому что у меня его не было в оболочке, и все компоненты на плате сгорели! "

Воплощение в жизнь: изготовление коробок и инструкции.

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

Дизайн обложки

Я далек от искусства. Но одно из удовольствий любительского / доморощенного проекта - как можно больше делать своими силами! Поэтому я полностью принял «любительскую» сторону этого проекта и решил сам рисовать обложку! Я начал с рисования на бумаге.

Затем я отсканировал этот рисунок и перерисовал его на компьютере с помощью программы векторного рисования:

Когда обложка была готова, я использовал ее для оформления картонной коробки, инструкции и этикетки на картридже. Финальная версия всех этих элементов профессионально напечатана в США. Но на этапе проектирования мне пришлось печатать прототипы своими средствами!

Инструкция

Для инструкции я использовал коммерческие выпуски игр 90-х годов в качестве справочного материала, чтобы создать что-то максимально аутентичное. Но мы пошли на компромисс, поскольку хотели создать единую версию для всех стран (без вариантов США / Япония / Европа, как в старые времена). Конечным результатом является сочетание американского и европейского стиля дизайна 90-х годов. Например, в большинстве американских выпусков были черные коробки и инструкции, а в европейских - цветной фон. Вот примеры страниц из инструкции:

Коробка

Для картонной коробки я также использовал сочетание европейского и американского дизайна, того же цвета, что и руководство. Мне пришлось печатать прототипы самому, чтобы быть уверенным, что размер был правильным. Что касается руководства, я мог легко распечатать его на своем собственном принтере. Но для коробки использовалась бумага формата А3. Еще мне нужно было напечатать коробку на картоне, чтобы иметь возможность ее собрать. Поэтому я пошел в местную типографию по соседству, чтобы напечатать коробку на листе картона формата А3. Затем я вернулся домой, чтобы собрать ее. Мне пришлось сделать несколько вариантов, прежде чем получить точный размер оригинальной игры SNES из 90-х, но я наконец сделал это. Вот изображение последнего прототипа коробки:

После того, как опытный образец коробки был закончен и проверен и мной, и Catskull, мы нашли поставщика в США, который мог бы изготовить их, используя профессиональные материалы. Мы были очень рады найти поставщика, который мог бы напечатать коробки на картонном материале, близком к тем, что были в 90-х годах. Если вы откроете коробку Yo-Yo Shuriken, вы увидите, что внутри она серо-коричневого цвета, как в релизах 90-х, а не белого цвета, как в большинстве розничных картонных коробок. Каждая коробка на самом деле печатается и собирается вручную в США нашим поставщиком (мини-предприятие на  двух человек), который отправляет их уже собранными в Catskull. Затем Catskull добавляет инструкцию и картридж, чтобы получить окончательный физический релиз Yo-Yo Shuriken, который вы можете увидеть здесь:

В заключение

В конце концов, все эти шаги кропотливой работы за почти 2 года привели к созданию Yo-Yo Shuriken! Надеюсь, вам понравилось читать эту статью. Для меня это стало настоящим приключением, и я рад поделиться им в Интернете с надеждой, что это вдохновит и вдохновит других разработчиков на создание новых игр SNES!

Если вы хотите играть в Yo-Yo Shuriken на собственной консоли или просто поддерживать мою работу, вы можете купить красивый упакованный картридж непосредственно у Catskul Games:

https://catskullgames.com/yo-yo-shuriken

Если вы предпочитаете играть в нее на эмуляторах, вы можете купить ROM версию здесь:

https://drludos.itch.io/yo-yo-shuriken

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

https://www.patreon.com/drludos

Если вы  хотите просто получать уведомления о моих последних выпусках игр и статей, вы можете подписаться на мою новостную рассылку (я использую ее только для анонса выпусков игр и статей, так что не более одного письма каждые 1-2 месяца максимум).

На моем телеграм-канале есть еще интересное, подписывайтесь)