Burn the Lighter #02 |
|
the making of zxoom - история создания игры ZXOOM.
> the making of zxoom Andrew771: Наверное, многие, кто научился программировать на Спеке, создавал или мечтает создать шутер от первого лица на нём. Не обошла стороной эта идея и меня. И мечта для меня осуществилась только в этом, 2011 году, спустя 15 лет после начала разработки. Вместе с талантливым художником ALKO и потрясающим сценаристом и концептологом Black Cat, 13 ноября 2011 года на суд общественности была презентована альфа- версия игры ZXOOM. А начиналось всё в далёком 1994 году, когда я только приобрел первый домашний компьютер ZX Spectrum... В ту пору я умел программировать только на Бейсике. Реальный спектрум у меня всегда был только 48к. Ещё со школьных времен мне нравилось не только играть в различные компьютерные игры, как многим, но и что-то писать своё, а особенно свои игры. Большинство моих игр на Бейсике как раз и было написано в 1994-1995 годах. Особенно нравились игры, где нужно было ходить по лабиринтам, тогда ещё двухмерным. Это Lode Runner, Klad, Indiana Jones, Titanic и подобные. Естественно, пробовал писать подобные игры на Бейсике. Была создана игра под нехитрым названием "Лабиринт", где человечек в один символ бегал по лабиринтам, пытаясь убежать от двух преследовавших его таких же размеров врагов. Собирать клады в ней не нужно было, а только искать выходы из каждого лабиринта. На Бейсике удалось уместить 6 полноэкранных уровней. Быстродействие было хорошим. К сожалению, на данный момент кассета с этой игрой утеряна, но, надеюсь, в пределах моей квартиры. Все остальные кассеты с другими поделками, кстати, были недавно найдены, оцифрованы в форматы для PC и выложены на суд публики. Примерно в то же время я впервые увидел игры Wolfenstein и Doom на PC. Увидел на мониторах в витринах компьютерных магазинов, в демо-режиме, когда всё само бегало и стреляло. Если честно, то был небольшой шок - что, неужели и такое можно создать? Про покупку собственного писюка и эти игры дома можно было не мечтать: тогда моя стипендия равнялась двум месячным проездным на автобус. Так что, приходилось смотреть на демо- режим (причём, я мог по полчаса так стоять) или как играют крутые чуваки - продавцы компьютеров. Вот тогда-то и зародилась во мне идея - написать такое же для Спектрума, чтобы самому можно было играть. Ни одной подобной игры на Спектруме я тогда не знал, немного позже только увидел Total Eclipse, но она сильно разочаровала своим быстродействием. Голый Бейсик сразу отметался по причине своей тормознутости для просчёта и построения сцен векторной графики. Поэтому было принято решение - нарисовать эти сцены заранее с помощью Бейсика, каждая размером с треть экрана по 2048 байт, а потом их разместить в памяти. А выводить нужную сцену быстро машинным кодом, подсмотренным в книге "Машинные коды" фирмы "Солон", соответствующим командам ассемблера ld hl,xxxx: ld de,16384: ld bc,2048: ldir, просто подставляя нужные адреса из Бейсика командами POKE для регистра hl. Стоит отметить, что кроме этой последовательности команд и таблицы символов и переменных больше в этой книге я ничего тогда не понимал. Таким образом, можно было уместить около 12-15 сцен и сделать повороты на 45 градусов. Эта идея была воплощена, но вскоре была отвергнута из-за очень большой дискретности. Смущал не поворот на 45 градусов, а всего лишь два-три уровня в глубину просмотра, а также однообразие и повторяемость сцен даже при одном повороте на 360 градусов, что дизориентировало и делало скучной всю затею. Вот в начале 1996 года я и решил изучать ассемблер, чего бы мне это ни стоило. Была приобретена бесценнейшая книга "Как написать игру на Ассемблере" (авторы Капульцевичи и Евдокимов) и начато ее изучение. Изучать я её начал не с начала до конца, а, как это часто бывает с книгами, выборочно - вводил в компьютер только те примеры, которые мне нравились или были полезны для будущего своего Doom'а. Сразу же понравилась идея из главы 7 - в то время как на экране видна какая-то картина, формировать в памяти другую картину на виртуальном экране, а потом быстро копировать её на экран. Был вдоль и поперек изучен пример про микроавтобус, едущий по шоссе на фоне домов и фонарей. Затем я стал, по совету авторов книги, удлинять шоссе и дорисовывать ограды, деревья и прочее самостоятельно. В общем, справился. Программирование шло в GensЧ и отладка в MonsЧ, и имелся из накопителей только магнитофон, так что весь процесс требовал огромного времени и терпения. Чтобы запрограммировать какую-нибудь мелкую фигню, иногда уходило по полдня. Особенно долгим и нудным было набивание байтов спрайтов. После того, как из этого примера было выжато всё, что можно (в том числе попытка сделать управление микроавтобусом с клавиатуры на прерываниях), я наконец вновь подступился к неприступной крепости Doom. Идея делать на векторной графике, но на ассемблере, была отвергнута: программа-калькулятор в ПЗУ для этого не годилась из-за быстродействия, а создание своей тригонометрии на ассемблере с заранее рассчитанными таблицами синусов, косинусов и прочего было, во-первых, для меня сложно тогда, а во-вторых, стоял перед глазами неудачный пример игры Total Eclipse - в ней мне не нравилось не только быстродействие, но и маленький клочок экрана, на котором разворачивалась игра. Хотя сама игра, конечно же, шедевр! На большее быстродействие рассчитывать не приходилось с векторной графикой. Про рейкастинги и рейтрейсинги я тогда не знал, интернета не было, а книги по программированию на PC мне были не интересны. И я решил делать на заранее заготовленных спрайтах, отрисованных в стиле 3D и хранящихся в памяти. Причём решил делать игру на весь экран, как в оригинальном Doom. Идея алгоритма была такая же, как и в микроавтобусе - сначала выводим на виртуальный экран дальние спрайты, затем поверх них более ближние и заканчиваем самыми ближними спрайтами. Процедуры вывода спрайтов были те же самые, что и в книге. Самостоятельно был написан обход клеток лабиринта при построении сцены вблизи игрока, начиная с дальних и заканчивая ближними, а также перемещение игрока по клеткам двухмерного лабиринта. В каждой клетке может содержаться не только стена или проход, но и любой другой элемент - колонна, барьер и даже враг в различных фазах движения. Врагов решил делать не отдельным списком, а встраивать в клетки лабиринта - это унифицировало процедуру вывода сцены для всех элементов, а также экономило память и увеличивало быстродействие. Не нужно было на каждом ходу проверять координаты всех врагов, а только тех, которые находятся в ближайших клетках. Для начала я решил делать только сплошные стены, без текстур. Взял клетчатый лист бумаги 32х24 и на нём карандашом нарисовал сетку перспективы, в Art Studio не стал - долго. Тут же по ходу решил, что можно сделать цветными спрайты, если сетку немного подогнать под границу знакомест. Затем получившиеся на бумаге прямоугольники, треугольники и трапеции вводил вручную в формате спрайтов. Т. к. было много повторяющихся байтов, использовалась процедура из книги построения блоков из одинаковых спрайтов, т. е. и тут экономилось место. За год, к середине 1997 года, были введены стены для всех уровней глубины просмотра и отлажен алгоритм. Всё заработало - можно было перемещаться по лабиринту с однотонными цветными стенами, выводящимися на весь экран. Скорость перемещения была существенно выше, чем у Total Eclipse, однако для аркады медленновата. Но даже так это было маленькой победой - идея спрайтового движка имела право на жизнь! Теперь необходимо было оптимизировать как-то код. И тут произошло событие, надолго затормозившее моё развитие на Спектруме - долгожданная покупка PC. Я наконец наигрался в оригинальный Doom и другие PC-игры. И, самое смешное, понял, что мне больше всего нравятся не шутеры, а стратегии! Не буду останавливаться на этом периоде жизни, скажу только, что я за это время освоил более- менее программирование на Delphi, которое теперь очень пригождается в кросс-разработке для Спектрума. На PC я так серьезного ничего и не написал, кроме небольших текстовых и двухмерных аркадных игр. И вот, как-то блуждая в конце 2010 года по интернету, захотелось во что-нибудь поиграть старое текстовое - "Королевство Эйфория", например. Нашел несколько разных версий для PC, перепробовал, почти написал свою на Delphi. Но какой-то дух в ней был не тот - вроде бы всё есть, но как-то больше похоже на MS Excel, чем на игру. И, в итоге, я решил достать эмулятор Спектрума, побаловаться своей старой игрушкой "Король". А заодно посмотреть в интернете, есть ли еще такие же умалишенные ретрограды. Сразу же наткнулся на форум спектрумистов zx.pk.ru. И, конечно же, поразило то, что он живой, и много участников! В свое время в 1997 году я думал, что был предпоследним спектрумистом, кроме одного друга больше никого не было вокруг на Спектруме. А тут такое! Тогда-то и проснулся повторный интерес к Спектруму, и захотелось удивить народ своей давней разработкой Doom. Теперь-то я узнал, что на Спектруме появились и Doom, и Wolfenstein, в том числе и на аналогичном спрайтовом движке, например, демо- игра от Jukova. Тем не менее, с размахом на весь экран пока вроде не было (ну, если не считать игры из линий и псевдосимволов). После показа моей демки в начале 2011 года от участников форума сразу посыпались идеи, как можно усовершенствовать движок. Ценную идею подал NovaStorm - ввести в программу своеобразный z-буфер, который перерос в решение - выводить спрайты в порядке не от дальних к ближним, а наоборот - от ближних к дальним. Ближние спрайты имеют намного большие размеры, поэтому одним спрайтом можно перекрыть чуть ли не полэкрана. Ранее ближние спрайты выводились поверх дальних спрайтов, ничего не проверяя, так что часто одно и то же знакоместо могло выводиться по нескольку раз. Теперь же все знакоместа, которые перекрывает спрайт, больше не нужно выводить для других дальних спрайтов, что должно было сильно увеличить быстродействие. На границе спрайтов подставляются маски по заранее рассчитанным таблицам. Движок был переписан, попутно оптимизированы процедуры, взятые из книги. Теперь я уже писал в эмуляторе EmuZWin Владимира Кладова, отличнейший инструмент лвсё в одном╗. Скорость игры, как и ожидалось, заметно увеличилась, так что, движок уже годился для аркады! Также огромную помощь оказал Jerri, который даже успешно ещё раз переделал алгоритм движка, не используя виртуальный экран, а формируя таблицу адресов выводимых спрайтов в нужной последовательности. Всё же, на мой взгляд, по скорости его код немного уступал при большом количестве спрайтов, но был более быстр на малом количестве, и также на пару килобайт экономил память, что для Спектрума очень существенно! Спрайты стен и колонн в новом движке хранятся не полностью, а только их четвертинки, реже половинки, т.к. имеется их симметрия осям X и Y. Остальные части спрайта достраиваются в сцену в реальном времени. Алгоритм перемещения и стрельбы врагов не составило труда написать, его решения взяты из моих ранних бейсиковских разработок игр для двухмерных лабиринтов и просто переписаны на ассемблере. Теперь настало время нарисовать элементы лабиринта, оружие игрока и врагов в различных фазах движения и стрельбы. С этой задачей блестяще справился ALKO, мне сразу понравился его стиль рисования. ALKO также дал ценные указания по цветовому оформлению игры, под которые пришлось немного модифицировать движок. Проецирование графических элементов происходило в специально написанном для игры кросс-инструменте разработки на PC Ц программе Y3D-ViewФ. Программа позволяет автоматически получать спрайты в ассемблерном коде из bmp- файлов, содержащих изображение грани элемента, для перспективной проекции под углами 90 и 45 градусов и различной удаленности элементов. Теперь перспектива строилась строго по формулам, а не приблизительно от руки, как раньше. Правда, от цветных стен поэтому пришлось отказаться. Построение лабиринта также было не вручную, а с помощью другого написанного кросс-инструмента на PC Ц УГенератора лабиринтовФ. Эта программа позволяет генерировать случайно лабиринты размером от 3х3 до 128х128 (в нашей игре используется лабиринт 128х64), содержащие различные элементы. Можно регулировать вероятности появления элементов, а также параметры генерации коридоров и залов. Готовый лабиринт выводится в ассемблерный код. И, наконец, нужно было всё сделанное собрать воедино в игру, придать ей какой-то сюжет. И здесь во всю мощь раскрылся талант Black Cat, создавший концепцию и сценарий игры о нашествии неведомой цивилизации на только оправившуюся от Третьей мировой войны Землю. Игроку в лице главного героя предстояло уничтожить пришельцев и их телепорт. Благодаря Black Cat игра получила название ZXOOM Ц по имени подземного города Зетиксум, в котором происходит действие игры. Название также нарочито созвучно ZX Spectrum и Doom путем их скрещивания. Вскоре ожидается окончательный релиз игры. Сейчас идёт доработка и исправление замеченных багов, а также пишется заставка и меню программистом-корифеем Jerri, который знает весь код игры, как свои пять пальцев. В разработке окончательного релиза игры ещё и примет участие музыкант, не знаю пока, кто. Надеемся, ZXOOM вам понравится!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября