Как сделать игру для денди
Разработка игр под NES на C. Главы 1-3. От введения до Hello World
Впервые я задумался о том, как разрабатывают игры под приставки где-то через 20 минут после того, как в самый первый раз увидел Turbo Pascal. На глаза иногда попадался Subor с клавиатурой, и появилась мысль: «Наверное можно набрать какую-то программу, а потом в нее поиграть». Но интерес быстро затух, потому что абсолютно никакой информации по этой теме тогда не было доступно. Следующий раз эта же идея всплыла, когда увидел вполне играбельные эмуляторы старых консолей. Тогда стало ясно, что вбивать листинг в саму консоль и необязательно. Где-то очень потом появился Хабр с благожелательной аудиторией для таких вещей. В какой-то момент даже начал собирать разрозненную инфу чтобы написать мануал самому, и вот сегодня наткнулся на готовый учебник, который явно надо перевести.
Разработка под старые консоли документирована вдоль и поперек, но именно по NES 99% информации относятся к разработке на Ассемблере. Меня почему-то зарубило, что надо освоить именно работу с С.
следующая >>>
Всем привет.
Меня зовут Дуг. Я пишу игры для NES вот уже год, и решил начать этот блог. Я намерен написать туториал по разработке игр под NES, чтобы вдохновить других людей делать собственные игры.
Особенностью блога будет использование чистого С, так что другие программисты смогут начать писать быстро и не особо вникая в ассемблер для процессора 6502. Насколько мне известно, других туториалов такого формата по компилятору cc65 пока нет, кроме нескольких примеров игр на сайте Shiru.
Также помните, что я не профессионал ни в разработке, ни в ведении блога. Если возникнут вопросы по NES, скорее всего ответы найдутся в Вики.
Я постараюсь максимально упростить обучение, и использовать самые простые примеры. Также рекомендую начать с простейшей идеи игры. Читателю явно захочется сделать новую Зелду, но это не получится. Простейшая игра потребует 2-3 месяца на разработку, Зелда — 2-3 года. Такой проект скорее всего будет заброшен. Ориентируйтесь на Пакман, хотя бы первое время.
Память консоли
Начнем с памяти процессора.
Здесь более подробная информация.
Таблица имен, nametable, связывает тайлы фона и их позицию на экране.
Зеркалирование позволяет управлять горизонтальной или вертикальной прокруткой, но всему свое время.
Еще в PPU есть отдельная область памяти OAM, Object Attribute Memory, размером 256 байт. Доступ к ней реализован через регистры в адресном пространстве процессора, и она позволяет управлять отображением спрайтов.
Другой тип картриджа использует CHR-RAM вместо CHR-ROM. Это позволяет подгрузить часть графики в эту дополнительную оперативную память. Это сложная техника, и в этом туториале не рассматривается.
Теперь можно посмотреть на софт, используемый для разработки.
В этом туториале рассматривается только cc65. Это один из лучших компиляторов для 6502, процессора NES.
Во-вторых, надо создать графику. Я использую YY-CHR
Для предобработки графики нужен любой графический редактор: Photoshop или GIMP, по вкусу.
Код удобно писать в Notepad++. У него есть подсветка сишного синтаксиса и нумерация строк — это облегчает отладку.
А теперь эмулятор. Я использую FCEUX 90% времени, потому что в нем есть крутой дебаггер и инструменты для работы с памятью, просмотрщики спрайтов и все такое. Но он не самый точный в эмуляции. Игры надо будет тестировать где-то еще. Судя по отзывам, самые точные эмуляторы это Nintendulator, Nestopia, и puNES. Еще желательно подгрузить более точную палитру — лежит здесь.
Есть две версии FCEUX — SDL и Win32. Первая работает почти везде, вторая только в Windows. Так вот, отладчик есть только во второй. Так что в случае альтернативной ОС придется воспользоваться виртуалкой или Wine.
И наконец расстановщик тайлов. Мы можем сделать игру без него, но он точно поможет. Я рекомендую NES Screen Tool. Он отлично показывает ограничения консоли по цветам и отлично подходит для одноэкранных игр. Для игр с прокруткой лучше подойдет Tiled map editor.
Как же всем этим пользоваться?
Надо сжать изображение до адекватного размера, например 128 пикселей в ширину. Потом преобразовать в 4 цвета и подправить при необходимости огрехи. Теперь можно копипастить в YY-CHR.
В YY-CHR надо проверить, чтобы цвет был двухбитный.
Палитра сейчас не имеет значения, потому что она все равно задается в другом месте.
Как работает сс65
Все компиляторы для NES работают через консоль, без графического интерфейса. То есть пишем программу в Блокноте, а потом вызываем компилятор с нужными параметрами.
В приставке используется 8-битный процессор MOS 6502. Он не умеет просто обращаться к переменным больше 8 бит. Адресация 16-битная, из математики есть только сложение, вычитание и битовые сдвиги. Так что код придется писать с учетом этих факторов.
Оптимизация жизненно необходима, потому что у 8-битного процессора очень мало ресурсов, и в некоторых случаях надо следить за временем выполнения кода. А обычный код на С этим требованиям не соответствует.
Поддерживается импорт переменных из других файлов. cc65 умеет импортировать переменные и массивы из ассемблерных модулей командой
а если это символ из нулевой страницы памяти, то добавьте директиву
В дальнейшем курсе эти конструкции будут использоваться редко. Единственное исключение — импорт большого бинарного файла. В этом случае оптимально будет завернуть его в ассемблерный файл:
а потом импортировать в С как
Знак _ здесь критичен, потому что при компиляции в ассемблерный код cc65 добавляет _ перед каждым именем переменной. Нам надо этому соответствовать.
Можно вызывать функции, написанные на ассемблере, через __fastcall__. В этом случае аргументы передадутся в функцию через регистры, а не стек — экономит время. В некоторых случаях без ассемблерного кода не обойтись, например при инициализации приставки. В любом случае, чем меньше аргументов передается в функцию, тем лучше. Сравним две функции, причем переменные test и A глобальные:
Еще можно вставлять ассемблерный код прямо в сишный. Я так почти никогда не делаю, но наверное иногда это необходимо. Выглядит примерно так:
Кроме того, я заменил громоздкий код инициализации crt0.s на компактный reset.s, и подправил конфигурацию для всего этого. Эти файлы иногда будут меняться. nes.lib используется стандартный, из состава компилятора. Проект собирается с опцией –add-source, которая не удаляет промежуточные ассемблерные файлы — можно порассматривать сгенерированный код.
Удобней определить переменные в сишном коде, а потом импортировать в ассемблерный через
Но это вопрос вкуса, на мой взгляд, такой код наглядней.
Hello World
Эта программа будет просто печатать текст на экране. Надо помнить, что приставка вообще не знает про кодировку ASCII и работу с текстом в любом виде. Но зато есть возможность вывести картинки размером 8х8 поверх фона.
Так что делаем массив спрайтов-букв, чтобы адреса букв в нем соответсвовали их ASCII-кодам. Потом их можно будет дернуть из кода на С.
Код инициализации приставки пока берем как есть, после его выполнения происходит переход на main().
Нам надо сделать такие операции:
Выключение экрана нужно, потому что работа с видеопамятью вызывает мусор на экране. Надо или выключить экран, или ждать кадровый гасящий импульс (V-Blank). Детально этот вопрос мы рассмотрим в следующий раз.
Код инициализации заполняет память нулями, так что весь экран будет залит нулевым тайлом — в нашем случае, он пустой. А вся палитра заполнена серым цветом.
Дропбокс
Гитхаб
На Гитхабе чуть исправил Makefile, чтобы корректно работал под Windows.
Включение экрана через “PPUMASK = 0x1e” описано в Вики.
Читают сейчас
Редакторский дайджест
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
Похожие публикации
Разработка игр под NES на C. Главы 11-13. Пишем и отлаживаем простой платформер
Разработка игр под NES на C. Главы 7-10. Работа с джойстиком. Коллизии спрайтов
Разработка игр под NES на C. Главы 4-6. Рисуем персонажа
Курсы
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Минуточку внимания
Комментарии 6
Шрифт весьма ущербный, на мой взгяд и вкус. Впрочем 8х8 сложно нормально нарисовать. Интересна была бы работа со шрифтом 8х16, литеры для которого можно выдрать из досовых консольных шрифтов, которых создано огромное множество, либо из *.psf, которые попадаются в Linux (один такой я для себя нарисовал). Или 6х8, чтобы в строку больше букв влезало.
Вторым уроком хочу видеть полноценную реализацию printf(). Третьим уроком — реальзацию примитивного текстового редактора.
Как и nesdoug, начинал с движка shiru и модифицировал его немного под себя.
Хорошо, что вы в своих примерах портируете код под новую версию cc65, буду следить за вашими переводами и добавлять замечания, может напишу от себя статью по темам, которые не раскрыты у nesdoug’а:
Отладка и профилирование под fceux с помощью lua, использование более продвинутого звукового движка от famitraker’а, использование различных блочных систем для экономии памяти и экспорт данных уровней из готовых игр с использованием редактора CadEditor, реальные примеры реализации спецэффектов из игр, реализация систем паролей/использование батарейки, написание своих компрессоров данных, возможно, создание меню для многоигровок.
На глаза иногда попадался Subor с клавиатурой, и появилась мысль: «Наверное можно набрать какую-то программу, а потом в нее поиграть»
У меня он был, и я, бывало, играл в то, что сам написал на G-BASIC. Но у меня не было никакого внешнего носителя, а потому программа каждый раз набиралась ручками с бумаги.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Как сделать игру для денди
Kaillera server:
gs.emu-land.net:27888
Mednafen server:
gs.emu-land.net:4046
Консоли > NES / Famicom / Dendy > История / Описание
Консоли > NES / Famicom / Dendy > История / Описание
Как сделать карманную денди
Глава Nintendo Хироши Ямочо хотел создать приставку, которая превзойдёт все имевшиеся на тот момент консоли. Эта задача была поручена Масаяки Уемура который был должен создать 16-битную машину с дисководом и при этом она должна была стоить не более 75$. К сожалению это осуществлено не было так как цена была бы тогда крайне дорога и поэтому консоль стала 8-битной, а дисковод был выпущен позже.
Famicom был выпущен в Японии в июле 1983 года по цене 100$. Первые игры вышедшие на Famicom были всем нам ныне известные: Donkey Kong, Donkey Kong Jr и Popeye. К концу 1993 года были выпущены улучшенные версии Donkey Kong Jr и Popeye с возможностью игры вдвоём. Также в это время выходит Baseball и главный хит от Nintendo, Mario Bros.
В первый год выпуска Nintendo столкнулась с рядом проблем такими как: невысокая надёжность приставки с многочисленными просчётами и дефектами. Ямочо не хотел чтобы у покупателей сложилось плохое мнение о приставке и поэтому дефектные приставки были отозваны и продажи новых прекращены до устранения неполадок. Позже Famicom был перевыпущен с обновлённой материнской платой.
В 1984 году Nintendo решила завоёвывать рынок в США. Nintendo попросила заняться продвижением на американском рынке своей консоли фирму ATARI, но был получен отказ в связи с тем что ATARI продвигала свою систему. И тогда Nintendo наняла фирму Worlds of Wonder для дистрибьюции своей консоли в США.
Приставка была выпущена на рынок США в июне 1985 в самый неудачный за весь период истории видеоигр момент. В момент краха индустрии видеоигр. Приставка позиционировалась как система развлечений от Nintendo. Продавцы относились к новой приставке с крайним скептицизмом, Nintendo пришлось гарантировать, что они выкупят все непроданные экземпляры приставок и картриджей в случае плохой продажи в магазинах и только на таких условиях она появилась в американских магазинах.
Сама консоль для США также была переделана чтобы как можно меньше походить на игрушку и поэтому она обладает таким внушительным дизайном.
Первая партия консолей появилась в Нью-Йорке и была распродана на удивление быстро, а этого было ни много ни мало 100.000 консолей.
Будучи одной из немногих консолей выживших после краха 1985 года с успешными играми, немудрено что она перешила и более технически совершенные приставки вышедшие позднее такие как: Sega Master System и ATARI 7800. Famicom и NES позже были перепроектированы как AV Famicom и New NES c целью хоть ещё немного выжать из уже устаревающей консоли перед выходом Super Nintendo.
Поскольку NES жила на протяжении огромного количества времени игры под неё постоянно совершенствовались и улучшались, поэтому игры раз от раза становились всё лучше. В итоге за всё время существования консоли было продано порядка 50 миллионов экземпляров самой приставки и 350 миллионов картриджей к ней.
Безусловно что NES одна из самых успешных консолей когда либо появлявшихся в мире.
Техничекие характеристики NES/Famicom
На самом деле как ПЕРЕДЕЛАТЬ фамикомовский картридж, ну да пофиг. Да-да, название специально такое залупил, чтобы все желающие ввязаться в эту срань знали хотя бы как происходит сам процесс. Все претензии пишите в комментарии, а то я эту тягомотину второй раз пересматривать не вынесу просто, лол. P.S. Если кому-то интересно, в следующий раз могу рассказать про то как я делал Гиммика, хех.
Edyard Filippov: Он такой же дешёвый как и твоя ж**а
Unusual Studio: Зачем «Nintendo» изменила распиновку?
как делали игры на dendy
Что бы было сложнее подделать. «Nintendo» активней всех других компаний боролась с пиратством.
Vadim Massachusetts: красава
John Batista: шикарно разбираешься в микросхемах, красавчик)
Alekse Ma: перемычки лучше кидать волоском от многожильного провода под корпусом микрухи до массовой запайки контактов. ТТЛьщик)
Zloi: Очень уважаю таких людей. Однако в данном случае искренне не понимаю зачем тратить столько времени и сил «ради антуража», когда можно накачать эмуляторов и играть во что угодно. Начиная с игр ZX Spectrum и заканчивая SonyPlaystation 2. Возможно, таким вот рукоблудием можно заняться, чтобы потом продавать картриджи по 100 баксов?)))
TheRomixERR: А что делать, если в оригинале есть Nintendo CIC чип? А я хочу слепить картридж с нуля?
ReedMy Flash: Всё прекрасно! А как другие игры заливать?
T O R G O W E E K: а мне нравится этот волшебный дымок, я кайфую ))
Василий Dan Star. Звезда восходящего солнца.: А можно ли мой картридж на денди переделать он у меня на микросхемах четырёх игровка.
Сергей Василич: Очень хорошо, когда есть увлечение. Особенно, когда оно требует мозгов. Во-первых, когда при деле, не забухаешь, к тому же подобное хобби всегда можно обратить в денежку.
format 13: Пояльничек,губочка,отверточка,температурка,фоточка…ты что,няшный пидорочек?
Руслан Рябуха: Добрый день.Очень хорошее видео.Я только начал постигать науку создания катриджей для Дэнди и Сеги.Честно скажу,я полный профан в программировании,пайке плат,микросхемах,но очень загорелся целью постигнуть эту науку.Очень помогло твой видео.Просмотрел раз пять)У меня назрел вопрос.Если есть возможность,помоги.Какие программаторы сейчас можно купить чтоб прошивать чипы для Дэнди и Сеги?.Да,я понимаю,что чипов огромное количесто,как и программаторов,но может есть универсальные,охватывающие большой спектр чипов?Может есть какой-то ресурс или статья в которой это рассказывается.Я сам пытался разобраться,но полностью утоп в этой огромной куче программаторов((И еще вопрос.На одном из сайтов,попал на группу по продаже кариков.Автор-nikita600.Случаем не ты?)
Алексей Радугов: Видео крутое, ничего не понял, ибо не умею паять, но молодец, для меня это магия
Алексей Радугов: На заказ смастеришь катридж? Прям от души будет и чё по ценам сразу, надо просто игрушек 10 на катридж запилить определенных, сам паять не умею, не возьмусь портить) покупать… 250 минимум руб 1 катридж, да не факт, что рабочий… Дорого если честно, хотя на крайняк придется рисковать. Ну а так подумай, может договоримся о катридже, если чё данные ВК дам
Kishvarsho Pallaev: Ты красавчик! Мне бы так научится. Куй с этой терминологией
Секреты Windows Обход вирусов: как праильно паять с канифолью? просто у нас не продают флюса… припаял как богг черепаху. Навыка в пайке 0.0 научите и подскажите. Чинил наушники. припаял ппц как стрёмно… паял в перый раз в жизни с помощью канифоли. Но починил. Но хочу научиться паять чисто
Александр Ровний: Эта робота плюс инструменты и детали стоят своих денег
Clever Fog: Сейчас есть специальная губка для впитывания излишков олова, если я не ошибаюсь. Приятно осознавать что кто-то всё ещё возится с Денди. 8)
Video on this topic
Основные положения Итак.. Вы решили создать игру вашей мечты. Вы собираетесь переплюнуть х3 и даже Элиту. Ну что ж.. Вы не знаете языков программирования. Вы не знакомы с gamedev`ом. Учтите — к вам никто не присоединиться, пока не будет хоть какого-то графического движка или финансирования. В общем случае выход таков — учите языки программирования и графические API, будь то OpenGL или DirectX. До первой игры вам предстоит довольно много пройти. Какой же выбрать язык программирования? Существуют мнения, что качественную программу (игру в частности) можно написать только на Си. Этот миф зародился еще в те времена, когда альтернативе Си не было… К сожалению, этого мнения придерживаются и работодатели – учтите это! На самом деле и Делфи и Бейсик (последних версий – где это уже самостоятельный язык программирования, а не интерпретатор) пригодны к написанию игр. Да, если написать тестовую, консольную программу, которая будет в цикле делать что-то математическое, то скорость будет самой большой у Си… Но, например, Делфи – самый быстрый в ООП программировании, причем, намного быстрее Си. Еще возможно быть лидером и организовать финансирование (скорее из своего кармана, т.к. издатели не пойдут на такой риск — давать деньги фирме без имени… ну или условия будут абсолютно неприемлемые). Вы знаете какой-либо язык программирования. Но не знакомы с особенностями создания игр и работы с графикой. Не важно, какой опыт у вас есть в программировании. Вы не знаете, как создавать игры – значит, вы не знаете основного. Т.е. если вы опытный программист не думайте, что сможете сразу написать игру. Как сделать картридж для Dendy?Я не могу вам объяснить, КАК написать игру – нет универсального способа. Программирование это творчество. Вот основные положения и советы: — Игра состоит из графического, физического, звукового движков (они могут быть слиты в одну целую структуру). И игровой движок, который использует эти движки, при чем они не знают об игре ничего. Т.е. игр может быть много – движок один. — Грубо говоря, движок это менеджер объектов такого плана – источник света, геометрия, система частиц, источник звука, материал и т.п. Он общаться с графическим API (DirectX, OpenGL) – будь то непосредственно с ним или через какой-либо интерфейс (если создается движок, который не зависит от графического API, например, с целью переделать его на игровые приставки). — Игра предоставляет игроку возможность влиять на объекты движка. Игра – менеджер объектов типа (это пример — ведь тут много чего может быть) корабль, планета, станция, ракета. Игровые объекты уже имеют связи с объектами в движке. На самом деле существует огромное количество вариантов архитектуры игр – я привел один из многих. Делайте движок как можно более универсальным, но не забывайте о его специализации – если он строго для космосимов, то не нужно добавлять в него поддержку чего-то абсолютно стороннего. Обязательно попробуйте написать свой движок – это даст вам огромный опыт. — Не делайте лишнюю работу. Например, если у вас есть поддержка конверта из графического пакета Mesh`ей, то не пишите расчетчик нормалей – ведь за вас это сделает графический пакет. Да, можно взять и готовые движки – но всё равно большинство пунктов, которые я перечислил выше, относятся и к готовым движкам. Ведь еще нужно написать игровой движок… Ах да, ну и на последок — не увлекайтесь сидением на профильных форумах (кроме ЕГи ессно) — там обитают одни флудеры — настоящие профессионалы просто работают и помогают новичкам, но никогда не будут обсуждать, например, на каком языке программирования писать. | |||
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |
Famicon — под таким именем Dendy была известна в Японии. Появилась на рынке в 1983 году, а затем, переименованная в NES, вышла в США и Европе. Приставка сразу же стала хитом продаж и сумела завоевать неслыханную популярность на американском и японском рынках. Самыми популярными играми в то время для приставки были игры из серии Super Mario Bros (даже сейчас этот приставочный «сериал» пользуется огромным успехом). «Лицом» компании Nintendo стал Марио — главный герой. По официальным данным было продано более 60млн приставок и игр более чем 500 млн.
Выходу консоли многие критики приписывают возрождение рынка игровой индустрии в связи с компьютерным кризисом на рынке компьютерных игр. Все это связано конечно с тем что было выпущено огромное количество разнообразных игр, которые, конечно, вызвали неподдельный интерес как у инвесторов, так и у потребителей. В начале 90-х годов Денди начала сдавать позиции, отступая перед натиском шестнадцатибитных приставок. SegaMega Drive — основной конкурент Денди в то время. Следующим ударом для консоли стало появление такой мощной игровой системы как SuperNintendo (SNES/Super Famicom). Но, несмотря на это выпуск консоли продолжался и в 1992 году.
Нинтендо выпустила новую партию Денди.
Создание самодельных аксессуаров для Dendy
Это было связано с приходом в негодность более старых версий. С 1993-го года NES появилась и в России, причем это была нелегально произведенная система из Китая. Её распространением занималась фирма Steepler. Прекращение выпуска приставок официально было заявлено на 1995 год. Однако, благодаря компьютерным эмуляторам вся библиотека Денди доступна пользователям и сейчас.