Монстры обзаводятся интеллектом
Переделал вывод анимации очков на двухстраничный экранный режим. Начал делать обработку обстановки монстрами (поиск препятствий, ям, лестниц).
Блог разработчика
Переделал вывод анимации очков на двухстраничный экранный режим. Начал делать обработку обстановки монстрами (поиск препятствий, ям, лестниц).
Все очень просто:
И никаких проблем.
Переделал движок анимации монстров. В анимации Зомби каждая фаза движения стоит на экране 8 кадров, напрашивалось решение выводить на экран только один из этих спрайтов, первый. А потом 7 кадров пусть он себе стоит, не надо выводить его заново. Что и было реализовано. Получен, конечно, большой выигрыш в скорости обработки монстров. Но можно еще ускорить, если сдвинуть начальные фазы монстров так, чтобы они обновляли свои ключевые спрайты не одновременно.
Не обошлось без подводных камней: пакет команд в блиттер уходит сразу после получения «кадрового» прерывания, а вот изменения начального адреса отображения слоя видеопамяти — в процессе обработки скроллинга движком. В итоге иногда на экране мелькают призраки Зомби, которые не успели стереться. Идеи борьбы с этими «хвостами» у меня есть, завтра попробую реализовать.
Монстров на одном уровне в Дейве прямо толпы — количество их достигает 60 штук. Конечно, не все они видны и в реальной игре Дейва быстро сожрут при большом столпотворении, но все равно есть что оптимизировать…
Добавил анимацию Зомби, создал движок для монстров, ошивающихся поблизости. Пока ходят просто туда-сюда, ни на что не реагируя (как зомбированные):
Сегодня плодотворно поработал:
Завтра приступаю к запуску Зомби!
Как-то мне попалось мини-интервью Джона Ромеро, его там спросили под каким углом стреляет Дейв. Ответ был — 45 градусов. Я тогда удивился, почему вообще возник такой вопрос у народа. Поизучал траектории полета пули в оригинале и тоже удивился: что-то там не похоже на 45 градусов никак:
Пришлось немного повысчитывать, но все получилось, теперь Дейв стреляет:
И вот появилось ощущение той самой игры! Теперь надо или подумать над звуками в игре, или заняться монстрами, разлетающимися кусками от них и т.д.
P.S. Совсем забыл — надо же перезарядку дробовика еще сделать 🙂
Добавил анимацию стрельбы и дыма при выстрелах. 6 видов дымов! Один из спрайтов стрельбы оказался с кривым контуром — слишком толстым. Выглядит он как будто с тенью на стене. Поищем, починим. Теперь надо делать обработку попаданий и расход патронов. Гонять стало сразу куда прикольней!
Добавил движения прицеливания. С джойстиком все ок, а вот на клавиатуре придется делать кнопки сразу стрельбы, а не прицеливания. Потому что клавиатура БК не позволяет обработать нажатие двух клавиш. Точнее, есть один способ (через команду RESET), но во-первых работает он только на реальном железе, а во-вторых так вылавливаются далеко не любые сочетания клавиш. И тем более нельзя будет задавать произвольные клавиши для такого метода опроса. Так что от этой мысли я отказался.
Итак, шкафы Дейв научился открывать и пришло время брать из этих шкафов всякие бонусы. А значит, нужно было заняться анимацией вещей типа цифр с количеством очков, которые вылетают при взятии предметов. Сначала я выяснил, что в оригинале Дейв выводится поверх этих самых «очков». Стало быть, надо накладывать эти спрайты на фон, а уже на них накладывать Дейва. Напомню, что в AZBK есть три экранных слоя, каждый из них обладает независимым скроллингом. Самый нижний слой у меня использован под фон, а также на нем выводится анимация статичных предметов — тех самых алмазов. Анимация выводится на фон, фон двигается, все отлично. Спрайты очков, как выяснилось, тоже привязаны к фону — если Дейв берет предмет и убегает, то цифра с очками уезжает в сторону вместе с фоном. Значит эту анимацию логично вывести на нижний (фоновый) слой и забыть о ней — она сама уедет куда надо, когда фон сдвинется. Но вот только при этом надо сохранять фон, который запортится при выводе спрайтов. Или же выводить заново тайлы обстановки, по которым проедутся спрайты цифр. Последовательность «запомнить фон — вывести спрайт — восстановить фон» тоже не так проста, как кажется. Ведь на этапе «запомнить фон» можно запомнить фон вместе с куском уже выведенного рядом спрайта такой же анимации — ведь очки вылетают и из убитых врагов, которые могут ходить толпами. Поэтому сначала надо восстановить фоны под ВСЕМИ спрайтами анимации, потом запомнить «чистый» фон для каждого спрайта, а потом уже выводить новые спрайты. Ну и при этом всем фон у меня имеет хитрую структуру с разными пересекающимися областями, там черт ногу сломит.
Но у нас же есть слои! Долой рутину с оперных подмостков!
Итак, к черту запоминание фонов и все вот это. Будем выводить спрайты анимации на СРЕДНИЙ слой экрана. Это позволит нам не запоминать никаких фонов, а просто стирать выведенные спрайты прямоугольниками с заливкой прозрачным цветом. И выводить спрайты тоже можно прямоугольниками — никаких тебе BIC по маске и BIS. Правда, на этом слое у нас обитает Дейв — ну и выселим его на верхний слой, там ничего кроме обоймы с патронами нет. Интересно, может ли Дейв допрыгнуть до обоймы? Да, может, как выяснилось. Есть такие места. Ну и ладно, пусть об этом думаешь Тэд из будущего.
Вывести анимацию на средний слой — это шикарное избавление от кучи проблем. Но ведь они должны быть привязаны к фону и двигаться вместе с ним. И тут пригождается независимый скроллинг слоев. Не эти ваши всякие паралаксы же реализовывать ими! Делаем средний слой всего одним квадратом 512х512. Видимая часть у нас 256х192. Синхронизируем это с нижним слоем так, чтобы средний слой всегда имел запас по краям со всех сторон видимой области — это позволит выводить анимацию в еще невидимые области на границах отображаемой части, чтобы объекты могли входить в кадр справа-слева-сверху-снизу и при этом не надо было заботиться об обрезке спрайтов границами экрана. Нижний слой, состоящий из кучи страниц, переключает скроллится в одну сторону, над ним второй слой перематывает сам себя и все время начинается на координаты -200 по X и -140 по Y относительно рабочего окна. Над всем этим стационарно висит слой с Дейвом без всякого скролла. Трехмерная модель высылается по запросу (шутка).
Процесс синхронизации занял у меня довольно много времени, так как я наткнулся на непонятную проблему — при спуске вниз анимация внизу экрана успешно работала, но если Дейв поднимался чуть выше и слой двигался, то в нижней трети экрана спрайты анимации вообще исчезали. Сначала я подумал, что не туда позиционируется вертикальный скроллинг. Потом — что я неправильно задал длину вертикального рулона и поэтому часть строк просто не выводится при прокрутке. Затем начались подозрения на глюк в прошивке AZBK… Наконец, мне пришла в голову гениальная мысль — к черту эти рулоны, надо лечь спать, а то уже два часа ночи.
Как известно, утро вечера всякоразней. С новыми силами и новыми матами я разбирался в этих заморочках с рулонами и координатами и вдруг выяснил, что при выводе спрайта на строки ниже 400 (8) у меня возникает переполнение при вычислении адреса в памяти AZ — там же 24-битные адреса и я на это регулярно натыкался первое время. Ну и вот опять. Спрайты анимации просто переставали выводиться туда, куда надо при определенном соотношении смещения слоя и его виртуального начала относительно фона.
Пофиксил вычисление адреса и все успешно заработало. Записал ролик, выложил его на ютуб и заметил, что теперь не все алмазы мигают как надо 🙂 Но это ерунда, починим!
Сделал вывод анимированных объектов со второго слоя лабиринта — алмазов и прочих бонусов:
Заодно теперь можно открывать шкафы:
А также, провел пару тестов по всенаправленному скроллу для ОБЫЧНОЙ БК0011М, без AZBK. Прикидываю, возможно ли сделать Дейва и для обычной БКшки, ведь все алгоритмы у меня будут. Тесты получились такими (в первом спрайты черезстрочные, во втором полноценные):
Кажется, Дейв вполне возможен и для обычной БК 🙂
Свежие комментарии