Nomad
Alone Coder>
В прошлом году я показывал игру Nomad
на DiHalt'е. К сожалению, нам выделили не
самое лучшее время, а я был не в лучшей
форме - застрял на 2-м уровне и не смог
показать весь блокбастер.
Hippiman>
На самом деле для DiHalt'а нужно было
сделать облегчённую версию с более мощным
оружием или меньшим количеством врагов.
Игра получилась действительно сложной, и
для её прохождения нужна тренировка или
хороший скилл в этом жанре.
Alone Coder>
Расскажи, как родилась идея Номада?
Ведь сделать приглядный скролл в цвете на
точку - это очень сложно... И почему он
Номад? (Помню игру детства с названием
N.O.M.A.D :))
Hippiman>
Я изначально планировал в игру вставить
сюжет в постапокалиптическом, фантастичес─
ком мире, разрушенном войной. Где остатки
человечества изо всех сил пытаются выжить,
а остатки боевых машин-роботов методично
это человечество истребляют, выполняя пос─
леднюю заложенную в них программу.
А главный герой - бродяга, как безумный
Макс в исполнении Мела Гибсона. Он колесит
на своем байке по миру в поисках пищи и
топлива и однажды по радио ловит сигнал о
помощи. Он узнаёт, что далеко на востоке
есть долина, где собираются выжившие, но
её атаковала армия роботов. Герой решает
идти на помощь.
Вот как-то так. Писатель из меня ника─
кой, и я прикинул,что могу банально не по─
тянуть всё это дело - красиво описывать и
нарисовать в заставке. Да и сюжет шмапу
особо не нужен в пяти-то уровнях, и я ре─
шил предоставить всё воображению игрока.
Сделал только вступление и концовку (я их
из-за размеров даже в отдельные модули за─
пихнул).
Alone Coder>
Всех ли врагов можно избежать? Или по─
теря энергии неизбежна?
Hippiman>
Врагов можно избежать всех. Я специаль─
но делал так, чтобы игру можно было пройти
без потерь. Но в некоторых местах это сло─
жно. В конце первого уровня, прямо перед
боссом избежать вражеской пули очень слож─
но, нужно сделать очень точный прыжок.
Иногда нужно просто знать, откуда появится
враг. Некоторые уровни предпочтительнее
проходить с определённым оружием.
Однако, когда я тестировал игру, то
проходил её наNormalбез потери жизней и
без особых проблем. Сейчас нужно потрени─
роваться, потерял навык.
Самое сложное место в игре - 2-й уро─
вень. Базовый пистолет слишком слаб для
большинства врагов, а магнумом сложно ору─
довать из-за низкой скорости стрельбы.
Лучше всего этот уровень проходить с
УЗИ или обрезом.Для этого нужно немного
потренировать 1-й уровень и постараться
набрать на нём как можно больше очков.
Это на самом деле несложно. Если это
сделать, тогда 2-й уровень покажется нам─
ного проще.
Alone Coder>
Как скриптуются враги? Как скриптуются
уровни?
Hippiman>
Это интересный вопрос :). В Nomad я по─
ступил хитро.
Каждый уровень - это не красиво расста─
вленные по сетке враги, а по сути скрипт -
последовательность команд самой разной на─
правленности.
Все команды выполняются строго по оче─
реди и по времени. Т.е. очередная команда
не выполнится, покуда глобальный счётчик
времени не дойдёт до определенного значе─
ния.
Команды есть самые разные:
-создать монстра
-изменить скорость скролла
-сделать чекпоинт
-выпустить босса
-перейти на несколько команд назад с
отмоткой времени (так делаются циклы)
А с их помощью делаются паттерны.
Использование паттернов - некого набора
команд, который повторяется несколько раз,
сильно упростило мне жизнь во время разра─
ботки уровней. Вместо того, чтобы созда─
вать каждого врага по отдельности, я мог
создать одного, а затем указать, сколько
раз его нужно повторить.
Монстры не скриптуются никак. У них нет
ИИ как такового. Поведение каждого монстра
задают 2 параметра: тип движения и тип
стрельбы.
Все типы движения и стрельбы жёстко за─
даны в коде игры и тоже бывают на все слу─
чаи жизни:
-двигаться зигзагом, прямо в игрока, по
прямой, выскакивать из под пола, лететь
прямо, а потом взрываться и пр.
-стрелять в каком-то направлении, в иг─
рока, стрелять другим монстром,не стрелять
вообще и т.д.
Комбинируя разные типы движения, стре─
льбы и паттернов, я добился разных интере─
сных эффектов.
Например, судно на воздушной подушке из
2-го уровня, которое плывет на фоне - это
моб с очень толстой бронёй и очень малень─
ким хитбоксом, который стреляет вверх с
определенной периодичностью. Следом за ко─
мандой спауна этого моба идёт цикл, кото─
рый спавнит энергетические шары вверху эк─
рана. Энерго-шары - тоже мобы. И этот цикл
синхронизирован с движением судна так,
чтобы казалось, что эти шары - это его
снаряды.
Это простой пример. На самом деле при
помощи паттернов, циклов и разных типов
движения можно сделать много интересного.
Alone Coder>
Сколько примерно времени нужно на пол─
ное прохождение? Как ты его отлаживал?
Hippiman>
Первый уровень до босса, если не терять
жизней, проходится примерно за1.5минуты.
2-й - примерно за 3 с копейками. Последую─
щие - точно не помню, но в среднем от4до
5 с половиной минут на уровень.
Получается, что с боссами и потерей жи─
зней игра проходится в среднем минут за
30-40.
Больше 5минут на уровень - уже сложно
для игрока. Банально устаёшь физически от
постоянной концентрации и начинаешь оши─
баться.
А отлаживал я достаточно просто.
Делал часть уровня: одну или две волны.
Обычно это был отрезок от одного чекпоинта
до другого. И многократно его проходил,
покуда правильно не выстраивал все команды
по времени, не расставлял монстров так,
чтобы было интересно, но и не слишком сло─
жно, чтобы можно было пройти без поврежде─
ний. Потом переходил к следующему и т.д.
Когда уровень был закончен, я многократно
перепроходил уровень целиком и дошлифовы─
вал то, что проглядел ранее. Подстраивал
части друг к другу.
Старался также учесть разные стили про─
хождения. Кто-то может быстро всех пере─
бить,и ему придется ждать следующую волну,
а кто-то наоборот - завязнуть, и следующая
волна его подкосит окончательно.
Приходилось искать золотую середину.
Каждый уровень был изначально задуман
для прохождения оружием определенного уро─
вня и с определенным набором способностей.
То есть, например, на 3-м уровне с базовым
пистолетом делать нечего, а на 4-м и 5-м -
без двойного прыжка. Соответственно, у иг─
рока должно быть определённое количество
денег, чтобы его купить + должно остаться
на новые жизни и раскачку энергии.
Примерное количество денег после прохо─
ждения уровня я определял по своим прохож─
дениям. Играл несколько раз с разным ору─
жием, потом считал среднее арифметическое
заработанных на уровне очков и уменьшал на
треть.
Хотя набор очков - это понятие очень
растяжимое, и виной тому система множити─
лей. Если регулярно "лажать", то набёрешь
совсем мало очков.
Если же играть "чисто" и не попадать
под пули, то с каждым сбитым врагом будешь
увеличивать множитель очков и, соответст─
венно, сильно увеличивать финальные очки.
Если войти в ритм, то уже на первом уровне
можно вполне набить очков на покупку
"калаша" (штурмовой винтовки,она же АКСУ),
да ещё и на дополнительную жизнь остане─
тся. А можно там же потратить все жизни, а
выигранных очков не хватит даже намагнум.
Alone Coder>
Игра сильно отличается от прочих игр
для ATM Turbo. В ней используются какие-то
ассемблерные процедуры сверх обычного Evo
SDK?
Hippiman>
Да кроме работы с диском и твоих функ─
ций работы с расширенной памятью, по сути,
и ничего. Всё делалось на C.
Я использовал несколько функций быстрой
математики,но они тоже были написаны на C.
В глубоком использовании ассемблера просто
не было нужды.
Alone Coder>
А можно ли на подобном движке сделать
что-то типа Midnight Resistance? :)
Hippiman>
Midnight Resistance - нет, конечно :)
Этот движок для такого не расчитан.
В целом этот движок можно охарактеризо─
вать одним словом - экономия.Ради скорости
мне приходилось экономить на всём. Так как
аппаратного скроллинга нет, а программно
горизонтально двигать экранную область из-
за странной организации памяти и больших
её объемов очень долго,даже14 MHzне хва─
тало на фреймовый скролинг, мне пришлось
выкручиваться.
Даже простое копирование изображения на
экран происходит долго,т.е. я вообще никак
не мог сделать скроллинг всей игровой об─
ласти.
Я поступил хитрее. Всю графику уровней
я рисовал таким образом, чтобы не было за─
метно, что вся игрвая область поделена на
небольшие полосы.
Дорога, по которой движется игрок, сис─
тоит из двух полос по8pxв высоту каждая.
Эти две полосы перерисовываются почти каж─
дый кадр. А фон я сделал из трёх полос:
две по8pxи одна в1бpx.И тут меня выру─
чил эффект параллакса.
Я расчитал интервалы движения этих по─
лос так, чтобы никогда не нужно было дви─
гать их все сразу. За раз перерисовывается
только одна полоса.
Таким образом получилось, что в макси─
мальной нагрузке мне нужно было пере─
рисовать 1бpxдороги и1бpxнижнего слоя
параллакса. Что уже совсем немного,и оста─
валось ещё много процессорного времени для
движения большого количества спрайтов.Хотя
в особо напряжённых моментах мне приходи─
лось останавливать движение вообще, чтобы
сэкономить ещё и на нём.
(Позже при помощи асма я сделал пару
функций вертикального скролинга, об этом
читайте в отдельной статье.Это уже заметно
быстрее и плавнее. Но для нормальной ско─
рости всё равно нужно было бы делать ани─
мацию полосками. Flash_zx очень умело при─
менил эти функции в своей демке Battle─
toads ZX_Evo .)
Но при желании переделать движок под
стандартные шмапы типа R-Type,Zybex и т.д.
вполне можно!
Other articles: