Немного о собственном опыте знакомства со средствами для создания игр на ретроплатформах

Vanity of razzle_dazzle

Преподавательница программирования в школе, в которой я учился, начала с вещей правильных, но неинтересных, подкупая учеников тем, что если они смогут создать такую программу, им больше не придётся решать типовую задачу снова и снова. Если вы не занимаетесь каким-то однотипным видом деятельности, а просто решаете задачки из учебника, то обнаружите, что даже в пределах одной темы задачки разные. Возникает вопрос, сколько же программ надо написать, да и все эти var'ы, int'ы, синий экран смерти ТурбоПаскаля (и это во времена winXP!), блок-черт-бы-их-побрал-схемы совсем не способствуют изначальной заинтересованности. Всё это выглядит как алхимия, какое-то тайное знание, но при этом знание скучное, сухое. Удивителен пример химии — школьников на днях открытых дверей зазывают, чтобы показать превращение красной жидкости в зелёную, и это действительно работает, хотя в итоге оказывается, что в химии есть свои var'ы и int'ы, ты как-то свыкаешься с этой идеей, прокручивая в голове опыт с превращением жидкостей. А ведь что стоило преподавательнице программирования запустить простой цикл с экраном, меняющим цвет, или показать простенькую игрушку а-ля понг.

Освоив худо-бедно основы программирования, сделав пару игрушек, приходит осознание того, что это всё, конечно, здорово, но при простенькой графике, минимуме эффектов игра просит не такой уж слабый компьютер — и, например, на моём самом первом компьютере «Мариуполис» просто отказался бы запускаться. А ведь он в сотни, а кое-где и в тысячи раз мощнее какой-нибудь NES. Заставить старую платформу с микроскопическим объёмом памяти воспроизводить игру — вот это настоящее таинство! И вправду, первый взгляд на программы, написанные на ассемблере (а подавляющее большинство игр для старых платформ на нём и писались), создают впечатление тайнописи. Я был не готов к жонглированию регистрами, но с удивлением обнаружил, что это нужно далеко не всегда. Как оказалось, существует инструментарий, позволяющий программировать игры для старых платформ на высокоуровневых языках.

В конечном счёте меня хватило на маленькую игрушку на QBasic для Ludum Dare, причём современную реализацию QBasic — с png вместо замороченных массивов c данными спрайтов и совместимостью с новыми операционными системами. Однако до этого я прошёлся по некоторым ресурсам по программированию на ретроплатформах и нашёл кое-что интересное.

Atari 2600

 

Удивительная штука — самая популярная из консолей конца семидесятых-начала восьмидесятых в Америке, непосредственная участница краха индустрии 1983 года, до СССР не дошла, и это при том, что многие западные платформы спустя пару-тройку лет обычно повторялись, пусть иногда с некоторыми изменениями, на «рассыпухе» местного производства. Основным производителем клонов Atari 2600 был Китай и клоны эти пошли уже в начале девяностых. По популярности они сильно уступали технически более совершенному плюс распиаренному с помощью ТВ всем известному клону NES.

Атари 2600 основана на микроцессоре MOS Technology 6507, урезанной, а значит и более дешёвой версии 6502, который будет впоследствии использоваться на многих платформах, как домашних компьютерах, так и консолях, в т.ч. и Nintendo Entertainment System. Оперативной памяти было всего лишь 128 байт (!!!), а за вывод картинки на экран (а также за звуки и чтение данных контроллеров ввода) отвечал TIA — Television Interface Adaptor.

Программирование для данной платформы представляет собой действительно спартанский способ управления ресурсами. Игра состоит из двух объектов игроков (однотонные спрайты 8 на 8, которые можно растягивать в 2 или 4 раза, а также дублировать 2 или 3 раза), объект «мяч» — горизонтальная линия цвета игрового поля размером в степени двойки до 8 включительно, 2 объекта «снарядов» — то же самое, что «мяч», но цвета игрока, а также игровое поле — однотонное нединамическое нечто, которое можно зеркально отражать и дублировать. Неплохо для понга со стрельбой,  но катастрофически мало для чего-то большего. Здесь на помощь прихоодят разные уловки вроде «фликера», когда на самом деле среди множества объектов врагов в отдельный момент времени прорисовывается лишь один из них и т.п. Конечно, графика какого-нибудь Pitfall смотрится довольно примитивно, но как только понимаешь, что у разработчиков было изначально, проникаешься к ним уважением.

Для простых смертных, решивших написать что-то своё для Атари 2600, существует компилятор batari Basic. Он отличается от классического бейсика (в нём не нужно вводить номер исполняемой строки — и это здорово), но не настолько, чтобы в нём не узнавался прямолинейный стиль оригинала. Также можно вставлять код на ассемблере.

Под спойлером предлагаю ознакомиться с исходником небольшого примера, в котором есть определение столкновений между игроком и игровым полем — то есть уже неплохой задел для коротенькой полноценной игры.

Спойлер
показать
   dim p0_x = b
   dim p0_y = c

   player0:
   %01101100
   %00101000
   %00111000
   %00010000
   %11111110
   %00010000
   %00111000
   %00111000
   %00111000
end

   COLUBK = 0
   COLUPF = 144

   player0x = 92
   player0y = 47

main

   playfield:
   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XX............................XX
   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
end

   COLUP0 = 28

   p0_x = 0
   if joy0left then p0_x = 255
   if joy0right then p0_x = 1
   player0x = player0x + p0_x

   p0_y = 0
   if joy0up then p0_y = 255
   if joy0down then p0_y = 1
   player0y = player0y + p0_y


   drawscreen

   if collision(player0,playfield) then gosub knock_player_back

   goto main

knock_player_back
   player0x = player0x — p0_x
   player0y = player0y — p0_y
   return

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

Более того, существует полноценное IDE для batari Basic. — Visual bB. А это значит подсветка кода, редактор спрайтов, игрового поля и даже музыки. Конечно, выглядит он неказисто и для того, чтобы он корректно работал, придётся немного помучиться (во всяком случае, мне пришлось — изначально программа отказывалась компилировать проекты, в которых есть «игровое поле»), но оно того стоит. Из того, что я видел, это лучшая среда для разработки игр под ретроплатформы.

Nintendo Entertainment System

Самая народная ретроплатформа. Первая консоль. Лично у меня она появилась в 1996 году, вернее, у меня дома — поначалу мало что получалось и полноценно я начал играть году этак в 1999-2000. Конечно, когда пошла речь о разработке под ретроплатформы, я в первую очередь думал о Денди. Я не буду вдаваться в технические подробности принципов вывода картинки на экран, хотя это довольно интерено, и на это у меня есть веская причина — мне пришлось вникать в вывод картинки на Атари 2600, потому что я смог на ней что-то сделать. На NES я даже не стал вникать, потому что бейсикоподобного инструментария для неё нет, а к ассемблеру я не готов, у меня просто нет столько времени. Но не всё так плохо с программированием под NES. Есть, например, компилятор сс65 для C. Но всё-таки порог вхождения в С высок, а тут ещё и специфичекие факторы, которые должны учитываться при разработке для консоли. Несмотря на довольно широкий функционал и относительную простоту, я смотрел на примеры на С как на что-то сверхъестественное — как будто ты уже освоил drag'n'drop на гамаке и тут тебе подкидывают исходник процедурной генерации ландшафта.

Но тут мне попался на глаза другой компилятор, сделанный бразильским программистом Гуту Майей — PyNes. Писать программы на Python довольно просто, и помимо GML это второй язык программирования, которым я немного (хотя и хуже, чем GML — что не удивительно ввиду узости специфики языка гамака и универсальности питона) владею. Не ахти какое достижение, но это была действительно приятная новость. Код на Python, пусть не такой простой, как на batari Basic, всё же понятен. Но тут другая беда — PyNes на сегодняшний день почти ничего не может кроме как выводить и двигать спрайты на экране. То есть ни коллизий, ни музыки, ни скроллинга фонов — печально. Гуту Майя обещает златые горы к версии 0.2, да только вот последние обновление страницы проекта на github утверждают, что в последний раз какие-то изменения делались ещё в сентябре прошлого года, и все касались версии 0.1.

ZX Spectrum

Третья и последняя ретроплатформа, которая меня заинтересовала. Если консоли советские инженеры консоли копировали неохотно (насколько я понимаю, копировались только «спортивные» клоны Понга, тысячи их), то практически все домашние компьютеры, сделанные на Западе, имели свои советские аналоги. Я не застал Спектрумы и впервые узнал об их существовании в журнале «Игромания» в году этак 2004. Для меня спектрум так и был чем-то далёким, пока в начале этого года в рамках своей научной работы я не взялся за изучение советских игровых платформ (возможно, я напишу о них когда-нибудь здесь, если соберусь с духом — для этой статьи мне пришлось собираться около полугода). Оказалось, что Спектрумы в середине девяностых были культовой штукой на постсоветском пространстве, а русскоязычной литературы по программированию для Спектрума вагон и маленькая тележка (впрочем, качество книг издателей-однодневок оставляло желать лучшего — чего стоит перевод оператора goto как «иди на»). На английском я бы не стал в это вникать, а тут решил почитать по диагонали и заинтересовался. Оказалось, что есть целая куча игр, сделанных уже в 90-ые. Непаханное поле для исследований. И тут я взялся за изучение книг — есть целая серия книг по программированию графики, где есть хорошие примеры программной отрисовки различных сложных фигур, фракталов и прочей радости, что, возможно, пригодится мне в каких-то будущих проектах. Оказалось, что отрисовать спрайт и перемещать его по экрану довольно просто, и в какой-то момент я даже подумал о ремейке «Глаза» на спектруме, тем более что графический стиль подземелий прямо-таки спектрумовский. Да только вот беда — что-то сложнее, чем перемещение спрайта реализовать довольно сложно да и в какой-то момент упрётся в мощности платформы, так что без ассемблера здесь, наверное, не обойтись. 

Похожие статьи

4 комментария
Xitilon

Хрена се. Понятия не имел, что у тебя был такой опыт. У меня кстати тоже был, я пытался одно время написать игрушку для GBA, на Си. Но когда дошло до того что надо как-то кодировать/хранить спрайты, то есть писать IDE для себя, под свой проект, я забил. Я конечно мог бы этим озаботиться, благо с C# давно «на ты». Но кто же игры будет делать?! Не, так не пойдёт.

ИМХО, не помешало бы какую-нибудь картинку зазывальную добавить перед катом, а то как-то сухо, без понга, недостаточно блескуче.

Xitilon

Вот теперь вообще отлично.

Да, ещё про Спектрум забыл:

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

Вот и для меня тоже так в один момент «оказалось». Всё-таки человек один, а компов и консолей много...

И по поводу C для NES — вот есть очень доходчивая статья на тему. Разумеется, английский.

razzle_dazzle

Хрена се. Понятия не имел, что у тебя был такой опыт.

Летом во время каникул и не таким заниматься станешь.

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

GBA на С — это интересно, но ни разу не очевидно. Я, например, ГБА вживую впервые увидел года три назад на радиорынке и уж тем более его не было ни у кого из моих знакомых. Как дошёл до жизни такой?

Вспомнилось, кстати, что «Мор.Утопия» якобы планировался для Nintendo DS — там он был бы в качестве визуальной новеллы с минимумом игрового процесса. Не помню, где я такое слышал, но слышал. Кстати, стоит ли считать дску ретроплатформой?

Вот и для меня тоже так в один момент «оказалось». Всё-таки человек один, а компов и консолей много...

Культовое — это не массовое, поэтому ничего удивительного. Но «движуха», судя по оставшимся от неё электронным журналам, была интересная.

Xitilon

Как дошёл до жизни такой?

Мне его подарил китаец-однокурсник (у которого уже и так была ДСка). А потом как-то раз просто подумалось — а вдруг?! Наверное тоже были каникулы или что, я уже не помню, 2010 что ли был год.

А вот недостижимым для меня была «Сонька», она же PlayStation. Не то что вторая, но и первая. Так что теперь есть с чем сравнить — Сега-то была огого, игр больше чем на Денди.

Про Мор.Утопию впервые такое слышу, неужели правда? Впрочем, пофигу, лол. ДСка первая вот почти-почти станет ретро, ИМХО. Раз уж ГБА ретро, а это следующее поколение за ним. Или всё-таки через два? Хм...

Мне перед Даркменом007 было стыдно, он такой фанат, и вообще демосценер, а я не шарю. Впрочем, это всё напрасные переживания упоротого прошлого.

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.