Она же «Слизняк», она же «Жвачка», она же Эльза Кальценбоген. Сегодня начал делать эту самую Липчку. Поизучал движения в оригинале — в итоге смог минут 10 от нее спокойно убегать, хотя раньше шарахался, как черт от ладана. Принялся реализовывать. Пока что сделал движения по полу вправо и влево. Завтра буду делать прыжки. Интересно мне, как в оригинале задается начальное состояние Липучек в лабиринте? Ведь они могут и по потолку бегать и по полу, а код у нее один — 3. Или они все изначально на полу, а при старте начинают разбегаться кто куда? Поизучаю…
Загруз по работе пока отступил, снова занялся Дейвом. В результате Зомби перестали бродить по воздуху. Затем исправил ошибку со взятием предмета из шкафа, она давно меня бесила — оказалось, что неверно высчитывался адрес тайл для восстановления фона. Занялся стрельбой: с клавиатуры нажатие клавиши «вверх» или «вниз» переводит Дейва в режим прицеливания. Если после этого клавишу отпустить — Дейв продолжит прицеливаться и можно будет нажать клавишу «огонь». После выстрела режим прицеливания остается. При нажатии любой другой клавиши — переход в новое движение или в основную стойку. Такие заморочки связаны с тем, что на БК нельзя жать несколько кнопкок одновременно (кроме случаев нажатия с регистровыми клавишами).
На джойстике все как в оригинале — отпускаем клавишу «вверх» и Дейв опускает дробовик.
Теперь занимаюсь тем, чтобы Дейв при стрельбе не влетал в стену от отдачи, а упирался в нее. Вроде бы все получилось.
После долгого перерыва на отпуск, послеотпускной завал работы, простуду, я наконец-то вышел на рабочий режим, въехал в собственный код и проект «Dangerous Dave для БК0011М+AZBK» начал двигаться.
Первым делом я столкнулся с тем, что Maxiol и Gid внесли изменения в железо AZBK и его реализацию в эмуляторе GID. Изменения, собственно, я сам и запрашивал, сталкиваясь с проблемами видеовывода то в железе, то в эмуле. Эти изменения притащили с собой новый формат команд и новые команды блиттера. Пришлось долгое время переписывать все процедуры Дейва, связанные с выводом на экран, под нововведения в параметрах команд блиттера. Было много глюков — спрайты рисовали не там, где надо, весь экран начинал покрываться рябью и все таком стиле. Постепенно это все ушло в небытие и Дейв начал снова бегать по лабиринту (первый уровень мне уже порядком надоел).
Но он не просто начал снова бегать, он начал снова глючить — момент перехода рулона через ноль и переключения в этот момент страниц видеопамяти вызывает дергание экрана. Все потому что движок Дейва не всегда успевает подготовить новый кадр за 1/60 секунды, чтобы вывести новые данные в момент обратного хода луча. А если не ждать этого момента — манипуляции с экраном становятся видны. На данный момент я еще не придумал, как это побороть.
Так что я решил пока двигаться дальше — какой смысл впихивать текущую подготовку кадра в 1/60 сек, если еще не все механизмы готовы? Еще нет разлетающихся кровавых ошметков от монстров, не все монстры задействованы и т.д.
Первым делом я занялся попаданиями пули по монстрам. Тут было два варианта решения:
1. При трассировке траектории пули на каждом шагу сверяться с массивом координат монстров и определять совпадение монстра и пули.
2. Завести слой лабиринта, по «знакоместам» которого двигать коды монстров (точнее, сразу указатели на записи о монстрах) при их передвижении по лабиринту. Тогда для проверки совпадения не нужно пробегать всех врагов, можно просто сразу получить указатель на того, что попался в этом «знакоместе» лабиринта.
Первый вариант не накладывает новых расходов на движок, зато грозит долгой обработкой кучи данных при стрельбе. Второй вариант делает стрельбу скоростной, но нужно двигать лишние данные на каждом движении монстров. Я выбрал второй путь. Это потребовало памяти, но, т.к. я использую AZBK, то памяти у меня вагон. Да и к тому же, как оказалось, страницы 5 и 6 (экраны БК0011М) теперь тоже можно использовать как обычные страницы памяти, ведь они больше не используются для вывода на экран.
Метод был успешно реализован, теперь надо было сделать визуализацию попадания пули в монстра. В Дейве это реализовано выводом текущего спрайта монстра полностью залитым белым цветом. Я собирался генерировать такой спрайт программно, но Maxiol сказал, что это можно легко заставить делать блиттер. В итоге в новой версии блиттера (и в эмуле GIDа) к моему приезду как раз появилась такая команда. Я воспользовался ей и все сразу заработало, что удивительно. Спрайты «блымкают» белым как надо, это сразу добавило энтузиазма, как и любое продвижение вперед.
В прилагаемом ролике видны дергания экрана, это как раз те глюки при переключении страниц, которые меня вгоняют в тоску. Также там видно, что Зомби пока что слезают со ступенек раньше, чем дойдут до пола, но это все ерунда. Хуже то, что при большом количестве Зомби на экране Дейв начинает притормаживать, но я утешаю себя тем, что в реальной игре Дейв просто не может пройти через такое количество врагов, они его сожрут раньше. Но в целом, конечно, надо искать узкие места и оптимизировать.
Переписываю вывод всей графики на новый формат команд блиттера. Помимо изменения способа задания размеров спрайта, добавился и новый способ позиционирования спрайтов на экране — теперь блиттеру можно указать координату Y в виде номера строки. Раньше это был 24-битный адрес. Так что переделывать пришлось много чего. Но уже почти все получилось.
Из-за длительного перерыва (отпуск на море!) дело шло со скрипом. Все-таки пока целиком погружен в проект — пишется легко, вся структура в голове. А немного отвлекся и приходится въезжать заново 🙂
Итак, Таиланд посещен, возвращаюсь к разработке. Остановился я на том, что в при попадании в монстра нужно спрайт монстра целиком белым. Я собирался программно генерить белый спрайт из текущей фазы монстра, но Maxiol добавил в блиттер AZBK команду, позволяющую залить спрайт нужным цветом. В эмуляторе GID пока что не заявлено поддержки этой фичи, так что я решил пока заняться процедурой разлетания кусков мяса убитого монстра.
Первым делом я, как обычно, стал изучать как это выглядит в оригинале. Сразу стало понятно, что куски, разлетающиеся от монстров, являются полноценными объектами, падающими в ямы, разворачивающимися от столкновений со стенами и т.д. От Бабуляторов разлетается два куска, от Зомби — четыре. Потом обнаружилось, что от Липучки ошметки могут лететь как в разные сторону, так и в одну (хотя Липучка никуда еще не прыгнула, а только целится). Видимо учитываются ее намерения.
Сдается мне, что авторами сначала была написана система разлетания мяса, а потом они стали думать, в какой игре это применить 🙂
Сегодня ножи, которыми кидаются Бабки, полноценно полетели по лабиринту — они находят стены и разбиваются о них:
Не обошлось без неожиданных глюков:
Теперь можно начать обрабатывать попадания в монстров. Тут две задачи:
Спрайт монстра, при попадании пули, нужно превратить в целиком белый спрайт. Средствами блиттера этого не сделать, там нет таких фич. Палитрой этого тоже не сделать. Придется попробовать генерить новый, белый спрайт из текущего спрайта монстра.
Разлетание ошметков мяса — та еще задачка. Надо поизучать, как эти куски разлетаются на самом деле. Влияют ли на это стены, чтобу будет, если кусок мяса падает в яму и т.д.
Итак, Бабки научились кидаться ножами. Применил такую же стереофонию, как в «Prince of Persia»: звук броска слева — воспроизводится в левом канале, звук броска справа — в правом. Однако, возник интересный глюк — при левом броске звук воспроизводится с искажениями, хотя массив играется один и тот же. Похоже, что-то я сломал в звуковом стерео-движке, пока переделывал его под Goonies:
Неоднократно задавали мне вопрос, почему я делаю именно ремейки известных игр, вместо того, чтобы создать что-то свое. Тут два момента.
Во-первых, я моделист. Мне нравится делать модели техники в масштабе 1/35. Пока ты ее собираешь, то становится ясно, как на самом деле устроена эта машина. И потом покраской и везерингом можно доводить их до состояния похожести на настоящие. Вот пример моего модельного увлечения:
Музыкантам тоже интересно разобраться в какой-то сложной партии — «Как же он умудряется это сыграть? Ведь у него тоже две руки!». И когда разобрался и у тебя самого получилось так сыграть — это кайф. Вместе с этим ты получаешь опыт и пополняешь багаж удачных решений разных задачек.
Тоже самое и с ремейками игр — в процессе работы над игрой ты узнаешь о ней и ее механизмах гораздо больше, чем просто в процессе игры. Когда я играл в Дейва, я не задумывался как именно монстры реагируют на происходящее. Там некогда особо думать, стрелять надо! 🙂 Тоже самое было и с Принцем — кто обращал внимание на то, что в третьем лабиринте есть одна-единственная решетка на всю игру, которая издает звук опускания, когда ее не видно? Остальные решетки «звучат» только когда они видны на текущем экране. А ту решетку слышно всегда. А почему? Потому что она важна, к ней трудно успеть добежать, пока она не закрылась. И автор не поленился сделать так, чтобы сразу было слышно, что она начала опускаться и надо спешить. Весьма продуманная игра.
Именно поэтому мне интересно делать ремейки — я моделист. Я смотрю на Metal Gear (MSX) и думаю «Когда я буду ее делать, то наконец-то я разберусь что там к чему, во всех этих запутанных лабиринтах и радиопереговорах непонятно с кем!» 🙂
А сюжет для своей игры у меня тоже постепенно зреет. Придет время — сделаю и ее.
Свежие комментарии