Pull to refresh

Comments 81

Никогда не поздно написать что-нибудь для Dendy. Я пробовал, очень увлекательно. Даже написал небольшую демку на основе легендарного меню.



Также опубликовал небольшую подборочку со ссылками для начинающих разработчиков под эту приставку :)
Я писал для Nintendo DS, там многое унаследовалось, только фонов стало больше, появились разные видеорежимы, прозрачность и прочее.
Nintendo DS была последней (ну если не считать DSi, конечно) где была еще поддержка тайлов. В 3DS ее окончательно выпилили в пользу 3D ускорителя.
Очень жаль, что сейчас нет доступного способа программировать под 3DS. Было бы интересно поэкспериментировать с 3D-экраном. Правда, такое скорее всего быстро надоело бы. DS успела застать время, когда смартфоны ещё не были так популярны, и под неё было интересно писать не только игры, но и софт. Сейчас же homebrew приложения уже никому не нужны.
ах, ностальгия!
только трушное NitroSDK, без никаких NitroSystem. Любимая платформа, жаль что GBA не застал.

Насчет homebrew — согласен, если бы нинтенды не были такими жадными до лицензий, да вообще пора уж открыть NitroSDK
А я использовал неофициальные devkitARM и libnds. NitroSDK тогда вроде только какими-то окольными путями утёк в сеть и не обновлялся. Помимо этого libnds позволяла использовать некоторые аппаратные фишки, которые на NitroSDK были недоступны.
ну мы были официально лицензированными nintendo разработчиками, потому и девкиты были и даже поддержка.
круче всего было проходить lot-checks, которых у nintendo довольно много, помню эти бессоные ночи.

помню ради интереса смотре devkitARM, но к удобному привыкаешь быстро и дальше «ага как они это реализовали» дело не пошло
Кстати, буду рад, если программисты под NES заметят в статье какие-то неточности, я мог и ошибиться где-то.
Сразу написал в личку, но раз уже спросили здесь, продублирую.
Если вы разобрались с ограничениями фона, со спрайтами всё будет легко. Суть в том, что это движущиеся на экране объекты размером 8x8, 16x16 или 32x32 пикселей. В лучшем случае (зависит от размера) всего их может быть аж 64, но на одной строке может отображаться не более восьми, даже если соответствующая область спрайта прозрачная, поэтому слишком много подвижных объектов не сделаешь.
Небольшое уточнение касательно спрайтов. На самом деле они могут быть только двух размеров: 8×8 или 8×16 пикселей, других размеров попросту нет. Если персонаж требовал 16 пикселей в ширину, он съедал 2 позиции из 8 возможных на строку. Картридж никак не мог снять это ограничение, видеопроцессору он мог дополнительно предоставить только 2 килобайта дополнительной RAM видеопамяти (к двум встроенным) для хранения фонов и 8 килобайт CHR-ROM (два набора тайлов по 256 штук). Если программа выводила больше 8 спрайтов на строку — они не рисовались на экране. Но разработчики применяли простой хак для вывода большего количества спрайтов: по чётным кадрам спрайты выводились в одном порядке, по нечётным — в обратном. В результате если на строке было больше 8 спрайтов, то они начинали мерцать, потому что по чётным кадрам были видны одни, а по нечётным — другие.
Спасибо :) Я на самом деле сначала и написал про 8x8 и 8x16, но потом нашёл весьма противоречивую информацию по этому поводу, посмотрел на спрайт Марио и исправил.
В личку не сразу посмотрел.
Там с этим ещё одно ограничение связано. Дело в том, что размер спрайтов задаётся в регистре с настройками видеорежима. Как следствие, если включить спрайты 8×16, то использовать спрайты 8×8 уже нельзя. И наоборот. Все спрайты на экране должны быть одного размера. Спрайты 8×16, на сколько я знаю, в основном в файтингах использовались, там же персонажи здоровые, поэтому их менее накладно было собирать из спрайтов 8×16.
На счёт этого я в курсе. Не хочу слишком нагружать статью всеми этими фактами, она ориентирована всё-таки на фанатов видеоигр, а не программистов :)
Я вообще сначала писал её для ЖЖ, а потом решил, что она лучше подойдёт на Хабра.
А вот зря! Было бы очень интересно почитать про это! :)
Хорошо, уговорили :) Но в особые подробности вдаваться всё-таки не буду. Например, о том, что изображения для спрайтов 8x16 должны идти в памяти друг за другом. Так при включении режима 8x16 уходит больше ресурсов на каждый спрайт, даже если его видимая область составляет только 8x8.
Хотя опять же могу ошибаться. Надеюсь, меня поправят, если что.
Чем больше подробностей и чем они детальней, тем лучше. Поверхностных обзоров всего и вся и так навалом. А интересных технических топиков днем с огнем, как говорится.
Я понимаю, что это Хабр, и здесь полно айтишников, которым это интересно, и которые будут в это вникать, но мне очень хотелось написать статью доступную для самих игроков, не запугивая их излишне сложной информацией.
И спасибо вам за это. Пост получился достаточно интересным. Но от своего комментария не отступлюсь :)
А мне бы тоже хотелось больше деталей!
Хм, а я еще удивлялся, почему некоторые спрайты в некоторых играх при запуске на эмуляторе мерцают. хотя на телевизоре в детстве я таких проблем не замечал
Хм, странно, а я хорошо помню это мерцание при игре на реальной приставке :) Эмуляторы стараются точно эмулировать все ограничения приставки, потому что часто на эти ограничения опирались программисты. Многие эмуляторы (например, Nestopia) позволяют отключить лимит на количество спрайтов на линии. Но в некоторых играх это приводит к побочным эффектам, когда на экране отображается то, что должно быть невидимым. Например, в игре Felix the Cat когда кот прячется в сумку, он рисуется поверх сумки. Вероятно, программисты выводили 8 пустых спрайтов на тех строках, где тело кота уже не должно быть видимым, поэтому на реальном железе и при точной эмуляции этого ограничения всё ок, а при отключении ограничения — появляется этот баг. Хотя такие хаки использовались нечасто, и многие игры без этого ограничения выглядят приятнее.
А ведь это ещё один интересный приём — обрезать спрайт снизу или сверху путём вывода пустых спрайтов в тех же строках :)
Фон на NES делится на квадраты размером 8 на 8 или 16 на 16 пикселей, которые называются тайлами. Итого таких квадратов 30 (15) в высоту и 32 (16) в ширину. При этом фон мог плавно двигаться горизонтально и/или вертикально.
На самом деле фон всегда составляется из тайлов 8×8 (собственно других размеров тайлов нет). В видеопамять просто последовательно записываются номера тайлов. А вот палитра устанавливается на группы тайлов 16×16 пикселей, то есть конкретному тайлу задать номер палитры нельзя — только четырём смежным.
О, вот это интересно. Спасибо, добавлю это в статью.
Намекаете на пасхалку? :)
больше 20 лет прошло, а грусть всё также нахлынула, как и тогда…
В игры для ZX Spectrum еще больше сил вкладывали — для знакоместа 8х8 только два цвета из 16, но можно было улучшить ситуацию до 2 цветов на 8х1, подменяя аттрибут цвета после того, как телевизор нарисует линию. Скроллинга не было, но был чит со сдвигом начального адреса знакогенератора, что позволяло делать вертикальный скроллинг с небольшими затратами, и горизонтальный с безумными… Еще и адресное пространство кадра было нелинейным. И ведь как-то ж рисовали это всё, и выглядело красиво!
В те времена такое было наверное с каждой платформой :) Это сейчас игры стараются делать мультиплатформенными, никак не привязываясь к фишкам железа.
Эх, настоящая техноромантика :)
Вот так всё и вылилось в целое искусство — демосцену :)
Угу, никаких тебе спрайтов и аппаратных эффектов типа скроллинга. Вообще ничего. Однобитная картинка, раскрашенная двухцветными блоками.

>но можно было улучшить ситуацию до 2 цветов на 8х1, подменяя аттрибут цвета после того, как телевизор нарисует линию
Только слишком это ресурсоёмко, так что в играх почти не использовалось (+ проблемы с таймингами на клонах).

>Еще и адресное пространство кадра было нелинейным.
Ну это для удобства сделано как раз:
LD HL, #4000; адрес экрана
INC L; перешли к следующему блоку пикселей 8×1
INC H; перешли к следующей строке знакоместа (при линейной адресации нужно было бы прибавить 32 (256/8) к HL)

Другое дело, что экран при этом ещё на три блока делится :)
Не такие уж и страшные ограничения. Не NEO-GEO конечно, но жить можно.
Кстати говоря, обновлять экран в подобном древнем железе можно только во время обратного хода луча (VBlank или V/HBlank).

Есть кстати довольно подробное видео про разработку демок под C64:
www.youtube.com/watch?v=So-m4NUzKLw

Вот здесь интересные разборы отрисовки игр на Amiga
www.codetapper.com/amiga/sprite-tricks/
Да, игры обычно ждали VBlank, но не всегда. Пример с Jurassic Park тому исключение.
Нет, не исключение — это просто скроллинг. Тайлмапы и тайлы не тронуты.
А, Вы об этом. Тогда да.
А ещё VBlank обычно использовался для отсчёта времени. Из-за этого игры при запуске на консоли другого региона могли работать с неправильной скоростью из-за разницы в частоте кадров между PAL и NTSC. Увы, у нас на Денди благодаря китайским пиратам такое встречалось очень часто.
Денди имели только PAL (да я и не видел телеприставок с другим стандартом). Поэтому на телеках «Березка», «Радуга» — мы любовались играми в черно-белых тонах, но что интересно — но это катило, мы были не избалованы.
На самом деле Dendy была чем-то средним между NTSC и PAL версией приставки. Дело в том, что под NTSC было выпущено больше игр, поэтому при клонировании приставки китайцы постарались сделать так, чтобы на Dendy в PAL режиме шли игры, написанные для NTSC (по возможности с минимальными модификациями).
Да-да. Отсюда и частые проблемы со скоростью работы игр.
На сколько я понял, из-за этого ещё на Денди часто были видны артефакты по краям экрана, которые на истинно NTSC консолях/телевизорах были за пределами видимой зоны.
А не расскажите про ограничения Neo-Geo? Там вроде были гигантские катриджы и если не сотни, то точно десятки одновременно отображаемых спрайтов с заметно бОльшим числом цветов, да и со звуком там было получше. Или всё это добро очень сложно программировалось?
Детально с NEO-GEO не знаком, но скроллируемых бекграундов там нет — всё отрисовывается спрайтами вплоть до 16*512, коих может быть 96 на строку.
Спрайты состоят из тайлов 16*16(16 цветов) которые читаются напрямую из ROM, без необходимости копировать их во VRAM а так же могут масштабироваться.
Спасибо за историю, напишите, пожалуйста, какие инструменты использовали для создания кода. Мне пришлось Форт освоить, подозреваю, что были альтернативы.
Я сам под NES ничего не писал. В первом комментарии товарищ VEG дал ссылку на свою статью.
На сколько я знаю, в те времена не было никаких стандартных инструментов. Все писали свои велосипеды, вплоть до компилятора. Документация по NES была плохая, разработчики писали кто как догадался, поэтому часто при дизассемблировании в играх можно встретить странные конструкции. Сейчас с этим всё намного лучше. Энтузиасты написали огромное количество хорошей документации и инструментов по теме. Но когда имеешь дело с такой низкоуровневой штукой — то и дело, что приходится писать какие-то свои утилиты. Например, при написании Unchained Nostalgia было написано под десяток мелких утилиток на C# для подготовки тех или иных данных к встраиванию в ROM. Например, утилита для сжатия фонов (в ROM они хранятся в сжатом виде и извлекаются напрямую в видеопамять). Или утилита для перемешивания набора тайлов (в зависимости от порядка тайлов зависела степень сжатия фонов). Даже отдельную утилитку для генерации облаков написал, потому что вручную перерисовывать все кадры при изменении одного облачка было очень долго и нудно :)
Не видел документации на Wii-U, но видел на DS/DSi, 3DS и Wii и могу подтвердить — все плохо :) Если бы не суппорт нинтенды, было бы все совсем чрезвычайно грустно. На 3DS когда она только появилась, документация на английском отставала на одну-две версии от версии SDK стабильно (сейчас не знаю как, может так же). Как писались игры, которые вышли вместе с 3DS я вообще не представляю: в SDK, да даже в компиляторе было огромное количество багов, после выпуска был отзыв девкитов (вероятно, они были и до выпуска, но у нас не было тогда девкитов).
Автор, а можешь столь же интересное рассказать про звук, переключения банков, работу с управлением и остальном железе NES/Famicom? Уж очень крутой рассказ, хочется продолжения…
Если только сам во всё это хорошо вникну.
А я вот очень сожалею, что в конце 80-х никто не подозревал о GTA-подобной механике игр.
А то бы играли мы все детство в нечто подобное.
В то время были свои хиты не хуже, например The Legend of Zelda и Metroid, которые были у нас совсем неизвестны по той простой причине, что китайские пираты их не завозили. Я часто задумываюсь о том, как сложилась бы история, если бы к нам не завезли и Марио. Скорее всего 99% людей в России не знало бы этого персонажа. Зато у нас отлично знают Battle City, которая никогда не выходила за пределами Японии :)
Это да. Zelda и Metroid так и остались уделом редких фанатов (на просторах бывшего СССР).
p.s.
Кстати спасибо за отличный ЖЖ. Давно почитываю.
Ну почему же никто не подозревал? Например Dick Tracy реализует часть подобной механики. Но устроить хаос в изометрической проекции никто не догадался, это да.
Dick Tracy, мягко говоря, слабоиграбелен.
Не стареют душой ветераны. Каждый пост про NES и консоли тех старых добрых времен обдает волной томной ностальгии.
Статья крутейшая. Обход подобных ограничений меня восхищает и сейчас, хоть я даже и не программист. А ролик выше про создание аналога GTA взрывает мозг. Круто! Кластер, пиши еще. Было бы интересно про Megadrive или Master System почитать. Про их ограничения.

Все же здорово, что мы застали эти игры) От АТАРИ до виртуальной реальности Окулус Рифта. Толи еще будет.
облака и кусты — это один и тот же рисунок

Моя жизнь не станет прежней.
Я думал, что сейчас этим уже никого не удивить :)

Еще страшнее — Марио разбивает кирпичи не головой а рукой:

Скрытый текст
image
Отличная статья! Теперь я понял, почему часто спрайты мерцали :)
Классные методы, вообще нетривиальные решения. Познавательно.
Невозможно поверить что спустя столько технологий и лет… железо стало «жирнее», а игры скучнее и однообразнее Нет, есть хорошие, но их масштаб не тот (инди инди и ещё раз инди)
Хороших и разнообразных игр меньше не стало. Проблема в том, что количество шлака увеличилось на несколько порядков, и те самые красивые разнообразные игры просто тонут в море проходняка. Сейчас успех игры на 50% определяется маркетинговой политикой, на 49% удачей и лишь на 1% зависит от качества. Поэтому мы вряд ли узнаем о шедевре уровня Mario, если за его продвижение не возьмутся профессионалы с большими бюджетами.
Это как сравнивать игры под iOS и Android. Сперва может показаться, что под iOS больше хороших игр, и вообще в среднем качество несколько выше. На деле же хороших игр примерно столько же, это просто шлака под Android больше выкладывается, т.к. порог вхождения существенно ниже.
Просто тогда, неискушенному детскому мозгу все это казалось чем-то невероятным и заоблачным. Сейчас мы старше, удивить и поразить нас труднее и в силу возраста, и в силу искушенности.
Я считаю, что проблема в том, что всё уже просто приелось. Почти все коммерческие игры по сути являются клонами друг друга. Серьёзные разработчики редко решают попробовать что-то действительно новое — это рискованно, может не продаться. А вот инди-разработчики часто экспериментируют по полной программе, в результате чего от них иногда можно получить что-то действительно новое и нестандартное. Посмотрите на такие игры как Antichamber или The Stanley Parable. В них играешь и понимаешь: «Такого ещё не было!»
Иногда всё-таки и крупные компании решаются на что-то такое. Самое очевидное — это наверное Portal.
А во времена NES/Денди всё казалось чем-то новым и необычным. Ну и игровой процесс несколько иначе строился. Тогда игру можно было пройти за час, но для этого иногда нужно было тренироваться месяц. Сейчас игры обычно проходятся гораздо дольше, но уже с первого раза.
Да это точно, дойти до последнего уровня и убить последнего босса казалось чудом и вызывало море положительных эмоций. Весь левелап и опыт был в собственном мастерстве и собственном опыте прохождения, а не в ячейке памяти компьютера, а сейчас достаточно время от времени не забывать сохраняться и копить очки опыта.
А у меня одной из первых игр были Звездные войны (на одном картридже с The Jungle Book, Felix The Cat и Jurassic Park) — это была самая невероятная игра из тех, что я видел, а сам картридж — лучша подборка длинных и красочных игр. Жаль у меня телевизор был системы SECAM и изображение было черно-белым. Но тем не менее 3D полеты на звездолете через облако метеоритов — это было невероятно. Причем чтобы дойти до этого места нужно было довольно долго играть в обычный платформер — я думал меня обманули насчет 3D, а когда увидел, аж дух захватило. Посмотрите сами на эту невероятную игру. И вот еще.

Видео заблокированы

И действительно 2014, виноват. Перешёл сюда из какой-то свежей статьи о NES.
Жаль, в своё время мне не попалась эта игра.
Из длинных игр я помню названия Kid Cool и Super Mario Bros. 2.
Ещё у пары игр я не помню названий.

Kid Cool выносила мозг сложной физикой управления персонажем :)
Из длинных: Zanac, Jurassic Park, The Jungle Book, Felix The Cat (последняя длинная, но однообразная)

Да каким же они местом длинные? Все проходятся за час-полтора. Длинные игры часов на десять-двадцать.

Ога, если заранее знать все фишки, может и проходятся, а если самому без подсказок играть, то это десятки, сотни, а может и тысячи раз повторения одних и тех же ошибок. Чего стоил поиск кристаллов в Jungle Book (и куда там нужно прыгнуть, чтобы попаст на нужную платформу) или какие команды на каком терминале нужно ввести в Jurassic Park, чтобы открыть ворота (и т.п.)

А ещё все игры были на английском или японском, которые никто не знал, и зарисовывали иероглифы в тетрадку :)
Не помню сложной физики в Kid Cool. Помню, нашёл чит или фичу — можно было прыгать на мачте зарабатывая жизни, после 255 счётчик обнулялся :)
Длина игры на китайских клонах NES определялась качеством блока питания — часа через два-три он перегревался и отключался :(

А как открыть "ресурсы" готовой игры, чтобы, например, перевести в ней тексты на русский?

Sign up to leave a comment.

Articles