Как написать игру на ассемблере для ZX Spectrum/Глава 01
- ГЛАВА ПЕРВАЯ,
- в которой обсуждается структура игровой программы
Если вы удостоили вниманием первую книгу из серии «Как написать игру», то о структуре игровой программы знаете уже более чем достаточно и не много потеряете, пропустив эту главу. Но учитывая интересы тех, кто упомянутую книгу даже в руках не держал, мы все же повторимся немного и поясним некоторые термины, которыми будем в дальнейшем пользоваться.
Несмотря на несметное количество существующих компьютерных игр различного уровня сложности и жанра, все же есть в них что-то общее, поддающееся классификации. Если проанализировать любую из них от начала загрузки до появления на экране сообщения GAME OVER (игра окончена), то можно выделить несколько частей, которые, хотя и связаны между собой в единое целое какими-то общими переменными и данными, но тем не менее, выполняют в игре вполне самостоятельные функции. Это позволяет разрабатывать каждую из частей независимо от других (однако, не забывая о связях с остальными частями), что в значительной степени упрощает создание игровой программы в целом. О каких же частях идет речь? Это:
- заставка;
- игровое пространство;
- блок взаимодействия с играющим;
- блок оценки игровой ситуации;
- блок звукового сопровождения игры.
Одна из основных задач этой книги состоит именно в том, чтобы научить вас реализовывать в ассемблерных программах каждую из перечисленных выше частей, но вначале посмотрим, что же они собой представляют, какие функции в игровых программах выполняют и какими примерно они должны быть.
ЗАСТАВКА
Вы знаете, что заставкой обычно называют картинку, появляющуюся во время загрузки игровой программы. Такие картинки имеют тот же смысл, что и рекламные щиты у дверей кинотеатров. Значительную площадь, как правило, занимает название игры, а все, что изображено на экране, так или иначе связано с ее сюжетом. Здесь же обычно сообщается о фирме-изготовителе, авторах программы и годе ее создания (рис. 1.1).
Часто только это изображение и называют заставкой, хотя на самом деле это лишь первая ее часть, помогающая игроку морально подготовиться к тяготам предстоящего сражения или лишениям, связанным с поисками сокровищ. Однако в солидных игровых программах заставка чаще всего разбивается на несколько частей, именуемых кадрами. Объясняется это очень просто: перед началом игры на экране должно появиться столь большое количество информации, что «впихнуть» ее в один кадр практически невозможно. Поэтому после окончания загрузки программы на экране появляется основной кадр заставки, называемый меню, в котором дается список действий, необходимых для настройки программы или для получения той или иной информации (рис. 1.2).
Меню - это что-то вроде диспетчерского пункта, из которого можно вызвать любой кадр заставки. Обычно в меню выбирается способ управления игрой: один из типов джойстика (Kempston, Sinclair и т. д.) или клавиатура (Keyboard); начальный уровень (Level); запуск игры (Start Game). После выбора управления от клавиатуры часто появляется еще один кадр - Define Keys, в котором предлагается назначить удобные именно для вас управляющие клавиши. В ряде игр как отдельные кадры заставки выводится таблица рекордов (Hi Score), подсказка (Help), рассказ о сюжете (History) и прочая информация.
ИГРОВОЕ ПРОСТРАНСТВО
Игровое пространство мы ранее (см. [1]) определили как совокупность всех подвижных и неподвижных объектов, появляющихся на экране во время игры. Однако во многих программах игровое пространство имеет значительную протяженность и в каждый момент времени можно видеть лишь небольшую его часть, в то время как все остальное остается за кадром. Поэтому иногда мы будем пользоваться и другим термином - игровое поле. Это как раз и есть тот фрагмент игрового пространства, который можно наблюдать на экране.
Попытаемся теперь разобраться в вопросе о том, из каких частей состоит игровое пространство и, в самых общих чертах, как они создаются. Заметим, что более подробно эти вопросы будут рассмотрены в соответствующих главах.
В большинстве случаев игровое пространство может быть разбито на три существенно отличающиеся части. К первой отнесем все неподвижные элементы изображения, имитирующие небо, землю, воду, космическое пространство со звездами и планетами, а также «мелкие» объекты: здания, деревья, мосты, лабиринты и т. д. В дальнейшем все это для краткости будем называть пейзажем. Пример простейшего пейзажа - шахматная доска в игре CHESS. А в таких программах как SABOTEUR, DIZZY или ROBOCOP пейзажи представляют собой настоящие произведения искусства (рис. 1.3). Они состоят из большого количества различных предметов и выглядят весьма правдоподобно.
Вторую часть составляют подвижные объекты, которые перемещаются сами по себе и на которые вы не можете оказывать непосредственного воздействия. Как правило, к этой группе относятся изображения ваших противников, например, силуэты вертолетов, кораблей и самолетов в игре RIVER RAID или проносящиеся мимо вас мотоциклы в SPEED KING2.
Наконец, к третьей группе объектов игрового пространства относится одно (а реже - несколько, как в игре CHESS) изображение, действиями которого вы можете управлять с помощью клавиатуры или джойстика. Так, в игре LEGEND OF KAGE это неустрашимый герой, преодолевающий множество препятствий и ведущий бескомпромиссную борьбу с многочисленными врагами-ниндзя. Персонаж игр серии BOULDER DASH - маленький забавный человечек, бегающий по головоломным лабиринтам и собирающий алмазы, за которым охотятся страшные бабочки, живые «бомбы» и кровожадные челюсти. Наконец, в играх OPERATION WOLF, STAR RADIERS II и во многих других «милитаристских» играх управляемым элементом является всего лишь перекрестие прицела.
Таким образом, если обобщить сказанное, то становится понятно, что любое сложное изображение на экране можно представить в виде набора небольших по размерам и вполне законченных объектов. Некоторые из этих объектов могут двигаться, а основная их масса составляет фоновый рисунок, на котором разворачивается действие игры. Все перечисленные объекты в компьютерных играх носят название спрайты (от английского слова Sprite - эльф, светлячок). Более точно спрайт можно определить как перемещаемый графический объект с неизменным рисунком и размером (см. [4]). Трудно представить хорошую игру без таких объектов (хотя, в некоторых играх, например, в MICRONAUT ONE или DARK SIDE, изображение создается программными средствами), поэтому, чтобы научиться писать приличные игровые программы, прежде всего нужно освоить технику создания спрайтов.
О том, как делать маленькие и большие спрайты, а также сложные пейзажи, мы расскажем дальше, а здесь только перечислим способы их изготовления. Небольшие спрайты вполне могут быть изготовлены вручную. Для этого спрайт рисуется на клетчатой бумаге (каждая клетка соответствует одной точке на экране), а затем изображение переводится в последовательность чисел. Значительно интереснее, а главное, эффективнее, создать рисунок будущего объекта в каком-либо графическом редакторе (например, в Art Studio или The Artist II), после чего автоматически закодировать его с помощью специальной программы, называемой генератором спрайтов, и записать на ленту или диск в виде готового к использованию спрайт-файла.
Все эти способы были подробно расписаны в [1], поэтому в настоящей книге мы не станем подолгу останавливаться на них и рассмотрим лишь некоторые особенности, имеющие непосредственное отношение к языку ассемблера.
ВЗАИМОДЕЙСТВИЕ С ИГРАЮЩИМ
Думается, ни для кого не секрет, в чем кроется причина популярности компьютерных игр. Ведь в них любой играющий с помощью несложных манипуляций может влиять на события, происходящие на экране и тем самым без особого вреда для здоровья почувствовать себя в роли супергероя или суперзлодея. И каким бы сложным ни был сюжет игры, устройства управления остаются одними и теми же - клавиатура или джойстик.
Приведем несколько примеров. В игре RIVER RAID можно ускорять или замедлять полет вашего самолетика, поворачивать его вправо или влево. И для этого достаточно лишь наклонить ручку джойстика в нужном направлении, а нажав кнопку «огонь», можно выпустить по объекту противника ракету.
Особенно поражают реальностью происходящего игры, посвященные какому-либо виду спортивной борьбы (FIST, ORIENTAL GAMES и другие). В них с помощью все тех же пяти клавиш или джойстика можно заставить главного персонажа выполнять множество различных приемов, прыжков, ударов и прочих телодвижений.
Подобные примеры можно продолжать до бесконечности, но для нас важно другое: все эти изменения на экране возможны благодаря особой части игровой программы, которая носит название блок взаимодействия с играющим. Когда вы нажимаете на какую-либо из управляющих клавиш или наклоняете ручку джойстика, программа реагирует должным образом и обычно переключается на выполнение той части, которая «заведует» выполнением соответствующего действия. Так, например, если ваш танк может поворачивать вправо и влево, а время от времени еще и стрелять, то в блоке управления такой программы должно быть ровно три части, каждая из которых отвечает за свой «участок работы».
У вас может создаться впечатление, что вся задача сводится лишь к тому, чтобы отслеживать нажатия клавиш или наклон ручки джойстика да в ответ на воздействие извне изменять направление движения управляемого объекта. Однако это пока еще не все. В реальной игре, когда по экрану движется созданный вами человечек, самолет или любой другой персонаж, возникает масса проблем, которые нужно решать. Прежде всего необходимо восстанавливать фон позади движущегося объекта, чтобы за ним не протянулся след девственно чистого экрана. А что делать, если движущийся объект «натолкнулся» на какое-то препятствие: стенку, дерево или встретился лицом к лицу со своим противником. Наконец, как поступить с врагом, в которого попал снаряд, выпущенный из вашей пушки. На все эти вопросы мы постараемся дать ответ на страницах нашей книги.
ОЦЕНКА ИГРОВОЙ СИТУАЦИИ
Во время игры на экране появляются не только предметы и персонажи, определенные сюжетом, но еще и выводится различная информация, помогающая играющему разобраться в текущем положении. Например, в игре BOULDER DASH ведется постоянный подсчет собранных алмазов, а на экране показывается, сколько их еще нужно собрать до перехода на следующий уровень. Это очень важно, так как вам объявлена настоящая вендетта по-корсикански, а времени, чтобы уйти от погони, у вас в обрез (оставшиеся в вашем распоряжении секунды также высвечиваются на экране, чтобы безжалостная надпись «Out of time» не показалась слишком неожиданной). Поэтому, только забрав последний алмаз, вы можете вздохнуть с некоторым облегчением (правда, ненадолго).
В более сложных играх, таких как INTO THE EAGLES NEST, VIDEO POOL или OPERATION WOLF количество выводимой информации также становится более значительным. Кроме чисел на экране можно увидеть и тексты, поясняющие результаты ваших действий или предупреждающие о возникшей опасности (например, в SILENT SERVICE). Чаще всего такая информация выводится в виде «бегущей строки» или в специальном окне, предназначенном именно для этих целей (рис. 1.4). А во многих стратегических играх оценочная информация настолько обильна, что в них для вывода различных сообщений отводятся уже целые кадры, занимающие полный экран (скажем, как в играх SIM CITY или DICTATOR).
Несмотря на невероятное разнообразие реализованных в игровых программах сюжетов, все же есть нечто, что объединяет выводимую на экран дополнительную информацию: она представляет собой оценку игровой ситуации. Следовательно, в программе должна присутствовать часть, которая оценивает действия играющего и его противников на всех стадиях игры и выводит на экран результаты этой оценки.
В большинстве игр ведется подсчет очков по тому или иному критерию, что позволяет легко выяснить, как со временем растет мастерство играющего или сравнить силу нескольких игроков. Очень часто выводится время, оставшееся до конца игры, число попаданий в противника, а также количество оставшихся у вас ресурсов (бомб, торпед, патронов). Все эти характеристики могут использоваться для оценки игровой ситуации и должны быть взяты вами «на вооружение» при создании собственных программ.
ЗВУКОВОЕ СОПРОВОЖДЕНИЕ ИГРЫ
Трудно даже назвать игру, тем более фирменную, где бы совсем не использовались те или иные звуки. Речь может идти лишь о том, что в одних играх музыкального сопровождения меньше, а в других каждое нажатие клавиши приводит ко все новым музыкальным шедеврам. Как образцы блестящего музыкального оформления стоит назвать такие игры как DEFINDER OF THE CROWN, PINK PONG, FLYING SHARK. Мы привели данный список с той мыслью, что, прочитав книгу до конца и накопив некоторый опыт, вам будет вполне по силам дизассемблировать эти игры и найти, а затем использовать лучшие образцы компьютерной музыки в своих программах. Ведь чего греха таить, не все, даже очень хорошие программисты, рождаются с музыкальными способностями.
В отличие от других частей игровой программы, выделить какой-то особый музыкальный блок довольно трудно, поскольку разные по сложности и назначению звуки формируются и в заставке, и в блоке взаимодействия с играющим, и даже в блоке оценки игровой ситуации. Тем не менее, все, что связано с музыкальным оформлением игры, можно рассматривать с точки зрения программирования как нечто, напоминающее отдельный блок. Все дело в том, что разные звуки и музыкальные фрагменты формируются одними и теми же подпрограммами и отличие может состоять лишь в размерах блоков данных (в особенности это справедливо для подпрограмм, создающих звуки в компьютере ZX Spectrum 128).
Говоря о звуках в компьютерных играх, никак нельзя пройти мимо возможностей музыкального сопроцессора, с помощью которого можно создавать не просто интересные звуковые эффекты, но и настоящие музыкальные произведения с полноценной оркестровой аранжировкой. На страницах этой книги мы постараемся поделиться своим опытом в данной области, подробно расскажем о программировании звуковых эффектов, сопровождая все это примерами ассемблерных программ с их подробным описанием.