Пишем для NES. Краткая версия.
Изложено в формате 'нет времени объяснять'. Подробное раскрытие каждого небольшого пункта потребует статьи большего объёма, чем этот обзор. Это будет сделано впоследствии, если у читателей обнаружатся конкретные интересы.
Хотите написать игру или демо для NES, Famicom, Денди?
Изучаем. Кладезь актуальной мудрости — NesDev Wiki. Вводные для начинающих — Nerdy Nights на английском, другая на русском. Помним, что старые описания неполны и неточны. Отдельно изучаем 6502. Книг и статей много, поиск начинаем отсюда.
Выбираем между ассемблером и C. Тысяча игр на ассемблере, десятки на C. Код на ассемблере в разы эффективнее, на C пишется в разы быстрее. С ассемлером проще получить помощь зала. Для отчаянных есть экзотика, от BASIC до минимальных Lisp и Python.
Выбираем ассемблер. Три популярных, десятки других. NESASM стар, имеет искусственные ограничения (пришёл с MS-DOS, перепилен с PCE/TG16) и мелкие глюки. Легко освоить, большинство старых уроков под него, выдержит средний проект. Современная альтернатива — ASM6, прост в освоении, но не так популярен. Выбор профессионала — CA65. Мощен и гибок, но сложен в освоении (линкер и конфигурация памяти).
Выбираем компилятор C — CC65. Для работы с железом есть библиотеки neslib и KNES, либо пишем свою. По скорости потолок чистого C — подобие Super Mario Bros. Можно писать частично на C, частично на ассемблере, переписывать фрагменты кода по ходу дела. Очень удобно для прототипирования.
Пишем код. Любимый текстовый редактор, bat или make файлы. Есть развитая IDE для CC65 — NESICIDE, но WIP и почти никем не используется.
Рисуем. Отдельные тайлы редактируем непосредственно в YY-CHR, NES Screen Tool, Tile Layer Pro и других, более сложные изображения импортируем из обычных форматов там же. Для сложных проектов может понадобиться свой велосипед. Без трюков NES не может отобразить полноценную картинку на весь экран, аналога Art Studio не ищите.
Музыка и звуки. Два основных трекера, но нужен проигрыватель, выбирается в зависимости от используемого ассемблера. Пишем в FamiTracker, играем FamiTone или Gradual Games Sound Engine. Пишем в Musetracker, играем MUSE. Штатного плеера FamiTracker хватит для простого демо, но не для игр. По желанию пишем свой плеер, оба трекера имеют текстовый экспорт. Для отчаянных есть древности и экзотика.
Делаем уровни. Готовых решений нет. Набираем вручную, пишем конвертер для универсальных редакторов, изобретаем свой редактор.
Для среднего или большого проекта наверняка понадобятся особые конвертеры и утилиты. Пишем на чём угодно, лишь бы работало. Обычно C++ или Python.
Отлаживаем в эмуляторах. Средства отладки развиты в FCEUX и NintendulatorDX. Высокая точность эмуляции в Nestopia и puNES, но отладчика в них нет. Даже самые точные эмуляторы не показывают всех глюков, проверяем во всех четырёх. Если пишем на C с готовой низкоуровневой библиотекой, на железе наверняка заработает. Выжимаем максимум на ассемблере — обязательно проверяем на железе при помощи Flash-картриджей (EverDrive N8, InviteNES, PowerPak — ищем в интернете) или самодельного картриджа и программатора ПЗУ.
Успехов!
Хотите написать игру или демо для NES, Famicom, Денди?
Изучаем. Кладезь актуальной мудрости — NesDev Wiki. Вводные для начинающих — Nerdy Nights на английском, другая на русском. Помним, что старые описания неполны и неточны. Отдельно изучаем 6502. Книг и статей много, поиск начинаем отсюда.
Выбираем между ассемблером и C. Тысяча игр на ассемблере, десятки на C. Код на ассемблере в разы эффективнее, на C пишется в разы быстрее. С ассемлером проще получить помощь зала. Для отчаянных есть экзотика, от BASIC до минимальных Lisp и Python.
Выбираем ассемблер. Три популярных, десятки других. NESASM стар, имеет искусственные ограничения (пришёл с MS-DOS, перепилен с PCE/TG16) и мелкие глюки. Легко освоить, большинство старых уроков под него, выдержит средний проект. Современная альтернатива — ASM6, прост в освоении, но не так популярен. Выбор профессионала — CA65. Мощен и гибок, но сложен в освоении (линкер и конфигурация памяти).
Выбираем компилятор C — CC65. Для работы с железом есть библиотеки neslib и KNES, либо пишем свою. По скорости потолок чистого C — подобие Super Mario Bros. Можно писать частично на C, частично на ассемблере, переписывать фрагменты кода по ходу дела. Очень удобно для прототипирования.
Пишем код. Любимый текстовый редактор, bat или make файлы. Есть развитая IDE для CC65 — NESICIDE, но WIP и почти никем не используется.
Рисуем. Отдельные тайлы редактируем непосредственно в YY-CHR, NES Screen Tool, Tile Layer Pro и других, более сложные изображения импортируем из обычных форматов там же. Для сложных проектов может понадобиться свой велосипед. Без трюков NES не может отобразить полноценную картинку на весь экран, аналога Art Studio не ищите.
Музыка и звуки. Два основных трекера, но нужен проигрыватель, выбирается в зависимости от используемого ассемблера. Пишем в FamiTracker, играем FamiTone или Gradual Games Sound Engine. Пишем в Musetracker, играем MUSE. Штатного плеера FamiTracker хватит для простого демо, но не для игр. По желанию пишем свой плеер, оба трекера имеют текстовый экспорт. Для отчаянных есть древности и экзотика.
Делаем уровни. Готовых решений нет. Набираем вручную, пишем конвертер для универсальных редакторов, изобретаем свой редактор.
Для среднего или большого проекта наверняка понадобятся особые конвертеры и утилиты. Пишем на чём угодно, лишь бы работало. Обычно C++ или Python.
Отлаживаем в эмуляторах. Средства отладки развиты в FCEUX и NintendulatorDX. Высокая точность эмуляции в Nestopia и puNES, но отладчика в них нет. Даже самые точные эмуляторы не показывают всех глюков, проверяем во всех четырёх. Если пишем на C с готовой низкоуровневой библиотекой, на железе наверняка заработает. Выжимаем максимум на ассемблере — обязательно проверяем на железе при помощи Flash-картриджей (EverDrive N8, InviteNES, PowerPak — ищем в интернете) или самодельного картриджа и программатора ПЗУ.
Успехов!
31 комментарий
Было бы любопытно почитать про чей-то опыт, какие-то советы по трюкам, задействованным в конкретных случаях.
Наглядный пример: battleofthebits.org/arena/Entry/Bo_OM/14745/
Картинка потеряла массу мелких деталей после конверсии. Забиты чуть ли не все спрайты в памяти (учитывая то, что я юзал спрайты 8х8, а не 8х16), а цветность картинки немного потеряла в том, что я использовал спрайты с теми же цветами, что и на заднике.
Если что, бомбу рисовал и потом планировал в GraphicsGale. И потом вручную переносил через редактор Ширу в неймтейбл. Спрайты уже накладывались поверх картинки говнокодом.
Спрайты — 8*8 пикселей каждый?
Еще интересует вопрос — реально ли сделать гигаскрин на NES? Или только с кастомными мапперами? Или вообще никак?
я вчера посмотрел твой редактор и ещё один ипонский. твой довольно специфичен, чисто под платформу;
а ипонский без англ.версии…
По поводу редакторов — именно для работы с графикой лучше этого редактора не найти, там сразу же импорт из готовых .bmp-файлов есть. Ширувский редактор используется в основном для рисования экранов из тайлов.
Или для любого из этих простых для обычных ПК действий нужно сначала рисовать свой ТАЙЛ, а потом печатать его в нужном месте экрана?
Я вспоминаю свой первый опыт ELITE (NES) под каким то древнем эмулятором в 2000-ом году. На стартовом экране при вращении COBRA MK5 изображение рассыпалось на прямоугольные фрагменты (ошибка эмуляции наверное). Из чего я сделал вывод тогда, что на NES все только через одно место — через тайл.
Что гораздо хуже, объём пересылаемых за кадр данных сильно ограничен, на NES это всего-то от силы 300 байт, на 16-битных приставках около 5 килобайт. И внешней видеопамяти у NES не хватит на весь экран, да и основного ОЗУ на буфер кадра тоже не хватит. Поэтому надо было очень сильно извернуться, например один тайл использовать дважды с разными палитрами — получится двухцветная графика, но зато тайлов хватит. Плюс Elite неспроста изначально сделана для PAL-версии приставки — там видеопамять доступна в три с лишним раза дольше, соответственно можно переслать втрое больше графики.
Тем не менее, и в таких ограничениях пытались выжать и векторное 3D (Elite, Battle Zone), и даже с заливкой (Chuck Yeager's Flight Combat, Hard Drivin'). Но кроме Elite, ничего из этого до официального релиза не дошло.
И вот тут возникает вопрос — есть смысл писать на русском введение в программирование на NES по лекалам как я написал про GBA — от скачивания среды и через поэтапную реализацию всех нужных техник для создания игры или что-то такое уже есть? Есть ли на английском даже — и то вопрос?
Вот опять таки посмотрел статьи migera по ссылке из начала статьи — хорошая информация, но опять не про то как сесть и начать программировать конкретный код с конкретными эффектами конкретными инструментами, а больше справочная информация. Мне же хочется написать именно такую статью, что садишься за неё, а через несколько часов встаёшь уже с работающим кодом в работающей среде никуда больше не заглядывая особо.
Залез на гитхаб в проект и посмотрел там на код. Оказалось, что для редактора используется компонента QsciScintilla у которой в документации по методу setUtf8 чёрным по белому написано:
И конечно же оказалось, что нигде в коде инициализации setUtf8( true ) не вызывается.
Вот так да, все годы существования Nesicide автор похоже и не подозревал, что редактор в нём ничего кроме латиницы с некоторой диакритикой не воспринимает принципиально! И никто не пожаловался! =8()
В общем я сказал и автор пообещал исправить в следующих релизах. :)
Может годы назад проект был глючным и не катил, да и сейчас вот глюки есть, но альтернатив я на горизонтах просто не заметил.
Чем больше, тем лучше. Обязательно пишите ещё!