БК-11М в 21м веке

13
Апр
2024

AZBK и экраны

В цикле вывода на экран стоял wait и сам вывод начинался после возникновения прерывания по вектору 100 («кадровое прерывание» на БК). Это необходимо, чтобы спрайты не мигали на экране, ведь их приходится стирать и выводить снова, и момент, когда спрайта нет на экране не должен быть виден игроку. Но это самое ожидание обратного хода луча может все и тормозить, если программе есть чем заняться 🙂 Альтернативой является использование двух экранных страниц — одну страницу скрываем, стираем на ней спрайты (все равно она не отображается сейчас), выводим заново на новых местах, а в это время демонстрируем вторую. Таким образом момент, когда спрайты стерты, не виден.

На БК0011М экранных страниц две. А сколько их на AZBK? Да сколько хочешь, ведь вся память AZBK может быть отображена с любой страницы. И включать эти страницы можно в любые слои экрана. Вот я и завел себе две экранных страницы для верхнего экранного слоя и вывожу туда бегущего Дейва, попеременно включая то одну, то вторую. В итоге ожидания обратного хода луча нет и мигания спрайтов тоже нет.

Завтра заведу две экранных страницы и для среднего слоя, где Зомби гуляют.

13
Апр
2024

Призрачные Зомби

Переделал движок анимации монстров. В анимации Зомби каждая фаза движения стоит на экране 8 кадров, напрашивалось решение выводить на экран только один из этих спрайтов, первый. А потом 7 кадров пусть он себе стоит, не надо выводить его заново. Что и было реализовано. Получен, конечно, большой выигрыш в скорости обработки монстров. Но можно еще ускорить, если сдвинуть начальные фазы монстров так, чтобы они обновляли свои ключевые спрайты не одновременно.

Не обошлось без подводных камней: пакет команд в блиттер уходит сразу после получения «кадрового» прерывания, а вот изменения начального адреса отображения слоя видеопамяти — в процессе обработки скроллинга движком. В итоге иногда на экране мелькают призраки Зомби, которые не успели стереться. Идеи борьбы с этими «хвостами» у меня есть, завтра попробую реализовать.

Монстров на одном уровне в Дейве прямо толпы — количество их достигает 60 штук. Конечно, не все они видны и в реальной игре Дейва быстро сожрут при большом столпотворении, но все равно есть что оптимизировать…

11
Апр
2024

Зомби!

Добавил анимацию Зомби, создал движок для монстров, ошивающихся поблизости. Пока ходят просто туда-сюда, ни на что не реагируя (как зомбированные):

10
Апр
2024

Допилил недоделки

Сегодня плодотворно поработал:

  • исправил спрайты со смещенным контуром (один был при стрельбе влево вверх, второй — при заряжании)
  • добавил анимацию перезарядки и расход патронов (собственно, добавил еще вчера, но из-за кривых спрайтов выглядело это не очень)
  • оптимизировал обнаружение препятствий летящей пулей — процедура ускорилась  в 17 раз 🙂
  • добавил команду «повтор спрайта» для движка движений — таблицы движений сократились даже не знаю во сколько раз
  • добавил задание индивидуального шага в анимацию объектов обстановки, теперь они работают как положено, с разными скоростями — дым летит быстро, алмазы мигают медленно, очки плывут вверх средне
  • допилил стрельбу — после выстрела не происходит возврат в базу, пока не отпустят кнопку выстрела
  • добавил проверку попыток стрелять при пустом магазине и соответствующие движения

Завтра приступаю к запуску Зомби!

07
Апр
2024

Стрельба готова

Как-то мне попалось мини-интервью Джона Ромеро, его там спросили под каким углом стреляет Дейв. Ответ был — 45 градусов. Я тогда удивился, почему вообще возник такой вопрос у народа. Поизучал траектории полета пули в оригинале и тоже удивился: что-то там не похоже на 45 градусов никак:

Пришлось немного повысчитывать, но все получилось, теперь Дейв стреляет:

 

И вот появилось ощущение той самой игры! Теперь надо или подумать над звуками в игре, или заняться монстрами, разлетающимися кусками от них и т.д.

P.S. Совсем забыл — надо же перезарядку дробовика еще сделать 🙂

06
Апр
2024

Дейв становится опасным

Добавил анимацию стрельбы и дыма при выстрелах. 6 видов дымов! Один из спрайтов стрельбы оказался с кривым контуром — слишком толстым. Выглядит он как будто с тенью на стене. Поищем, починим. Теперь надо делать обработку попаданий и расход патронов. Гонять стало сразу куда прикольней!

05
Апр
2024

Переходим к главному!

Добавил движения прицеливания. С джойстиком все ок, а вот на клавиатуре придется делать кнопки сразу стрельбы, а не прицеливания. Потому что клавиатура БК не позволяет обработать нажатие двух клавиш. Точнее, есть один способ (через команду RESET), но во-первых работает он только на реальном железе, а во-вторых так вылавливаются далеко не любые сочетания клавиш. И тем более нельзя будет задавать произвольные клавиши для такого метода опроса. Так что от этой мысли я отказался.

 

04
Апр
2024

Слоеные слои

Итак, шкафы Дейв научился открывать и пришло время брать из этих шкафов всякие бонусы. А значит, нужно было  заняться анимацией вещей типа цифр с количеством очков, которые вылетают при взятии предметов. Сначала я выяснил, что в оригинале Дейв выводится поверх этих самых «очков». Стало быть, надо накладывать эти спрайты на фон, а уже на них накладывать Дейва. Напомню, что в AZBK есть три экранных слоя, каждый из них обладает независимым скроллингом. Самый нижний слой у меня использован под фон, а также на нем выводится анимация статичных предметов — тех самых алмазов. Анимация выводится на фон, фон двигается, все отлично. Спрайты очков, как выяснилось, тоже привязаны к фону — если Дейв берет предмет и убегает, то цифра с очками уезжает в сторону вместе с фоном. Значит эту анимацию логично вывести на нижний (фоновый) слой и забыть о ней — она сама уедет куда надо, когда фон сдвинется. Но вот только при этом надо сохранять фон, который запортится при выводе спрайтов. Или же выводить заново тайлы обстановки, по которым проедутся спрайты цифр. Последовательность «запомнить фон — вывести спрайт — восстановить фон» тоже не так проста, как кажется. Ведь на этапе «запомнить фон» можно запомнить фон вместе с куском уже выведенного рядом спрайта такой же анимации — ведь очки вылетают и из убитых врагов, которые могут ходить толпами. Поэтому сначала надо восстановить фоны под ВСЕМИ спрайтами анимации, потом запомнить «чистый» фон для каждого спрайта, а потом уже выводить новые спрайты. Ну и при этом всем фон у меня имеет хитрую структуру с разными пересекающимися областями, там черт ногу сломит.

Но у нас же есть слои! Долой рутину с оперных подмостков!

Итак, к черту запоминание фонов и все вот это. Будем выводить спрайты анимации на СРЕДНИЙ слой экрана. Это позволит нам не запоминать никаких фонов, а просто стирать выведенные спрайты прямоугольниками с заливкой прозрачным цветом. И выводить спрайты тоже можно прямоугольниками — никаких тебе BIC по маске и BIS. Правда, на этом слое у нас обитает Дейв — ну и выселим его на верхний слой, там ничего кроме обоймы с патронами нет. Интересно, может ли Дейв допрыгнуть до обоймы? Да, может, как выяснилось. Есть такие места. Ну и ладно, пусть об этом думаешь Тэд из будущего.

Вывести анимацию на средний слой — это шикарное избавление от кучи проблем. Но ведь они должны быть привязаны к фону и двигаться вместе с ним. И тут пригождается независимый скроллинг слоев. Не эти ваши всякие паралаксы же реализовывать ими! Делаем средний слой всего одним квадратом 512х512. Видимая часть у нас 256х192. Синхронизируем это с нижним слоем так, чтобы средний слой всегда имел запас по краям со всех сторон видимой области — это позволит выводить анимацию в еще невидимые области на границах отображаемой части, чтобы объекты могли входить в кадр справа-слева-сверху-снизу и при этом не надо было заботиться об обрезке спрайтов границами экрана. Нижний слой, состоящий из кучи страниц, переключает скроллится в одну сторону, над ним второй слой перематывает сам себя и все время начинается на координаты -200 по X и -140 по Y относительно рабочего окна. Над всем этим стационарно висит слой с Дейвом без всякого скролла. Трехмерная модель высылается по запросу (шутка).

Процесс синхронизации занял у меня довольно много времени, так как я наткнулся на непонятную проблему — при спуске вниз анимация внизу экрана успешно работала, но если Дейв поднимался чуть выше и слой двигался, то в нижней трети экрана спрайты анимации вообще исчезали. Сначала я подумал, что не туда позиционируется вертикальный скроллинг. Потом — что я неправильно задал длину вертикального рулона и поэтому часть строк просто не выводится при прокрутке. Затем начались подозрения на глюк в прошивке AZBK… Наконец, мне пришла в голову гениальная мысль — к черту эти рулоны, надо лечь спать, а то уже два часа ночи.

Как известно, утро вечера всякоразней. С новыми силами и новыми матами я разбирался в этих заморочках с рулонами и координатами и вдруг выяснил, что при выводе спрайта на строки ниже 400 (8) у меня возникает переполнение при вычислении адреса в памяти AZ — там же 24-битные адреса и я на это регулярно натыкался первое время. Ну и вот опять. Спрайты анимации просто переставали выводиться туда, куда надо при определенном соотношении смещения слоя и его виртуального начала относительно фона.

Пофиксил вычисление адреса и все успешно заработало. Записал ролик, выложил его на ютуб и заметил, что теперь не все алмазы мигают как надо 🙂 Но это ерунда, починим!

 

31
Мар
2024

Алмазы и скроллинг

Сделал вывод анимированных объектов со второго слоя лабиринта — алмазов и прочих бонусов:

Заодно теперь можно открывать шкафы:

А также, провел пару тестов по всенаправленному скроллу для ОБЫЧНОЙ БК0011М, без AZBK. Прикидываю, возможно ли сделать Дейва и для обычной БКшки, ведь все алгоритмы у меня будут. Тесты получились такими (в первом спрайты черезстрочные, во втором полноценные):

Кажется, Дейв вполне возможен и для обычной БК 🙂

28
Мар
2024

Интересный формат лабиринта

Разбираюсь с форматом лабиринта оригинального Дейва — теперь меня интересует второй слой, на котором расставлены все враги, а также все предметы которые можно собрать. Вроде бы сначала идет все хорошо — в дампе коды алмазов (100001) совпадают с кодами шкафов на первом плане, коды Зомби (1) стоят где положено… Дохожу до нижнего уровня и начинаются приколы:

  • на экране алмаз в шкафу, но в дампе его нет! Там как раз стоит 456 нулей, т.е. это пропуск аж 4 строк и еще 56 элементов
  • следом за ним на экране большой алмаз (код 20) и в дампе он есть
  • потом идет пустота, потом код Зомби (1), стоящего у правого края окна
  • затем начинается уже новая строка и снова код Зомби (1), который стоит у входа в дом
  • потом код того самого алмаза в шкафу (100001), что на экране стоит ЛЕВЕЕ большого алмаза (код 20)

Ок, допустим что «алмаз в шкафу» кодируется не в той строке, что он нарисован, а строкой ниже, там где «ручка двери шкафа». Тогда понятно, почему они в разных строках с большим алмазом. Но Зомби? Получается, что код 1 — это вовсе не уровень головы или ног Зомби, ведь эти два Зомби на одном этаже, а в дампе — в разных строках. Типа просто вот он тут где-то установлен, строкой выше или строкой ниже. Ставьте его уже сами потом так, чтобы он не торчал наполовину в полу. При  этом сам слой практически пустой, ничего не мешало расставить этих Зомби точно по месту, с другими объектами там конфликтов нет.

P.S. Похоже, Зомби кодируются по уровню плеч. А тот, что строкой выше — просто стоит на лестнице, на одну строку выше пола.