Category: Dangerous Dave 2

23
Мар
2024

Если где-то закрывается дверь, значит это кому-нибудь не нужно!

Итак, чтобы было понятно в чем суть, объясню как устроен вывод лабиринта в Дейве (моем). Хранится он, конечно, в виде кодов объектов, но его ведь надо вывести на экран. Причем экран в Дейве скроллится во все стороны с произвольным смещением, значит надо или постоянно дорисовывать невидимые части и вдвигать их в видимое окно, или вывести сразу весь лабиринт тайлами и только двигать по нему окно отображения. Во втором случае рисовать больше ничего не надо, только смещай окно да и все. Как угодно можно смещать.

Тут начинаются (как обычно) ограничения.

  1. В контроллере AZBK можно вывести на экран любую область его памяти, просто указав “экран начинается с такой-то страницы”.
  2. В контроллере AZBK максимальная длина строки для экранного отображения – 512 байт. Для используего в Дейве видеорежима (256х192,  256 цветов) это байт на точку. Значит, рисовать “полотно” можно только кусками 512х512, а не каким-то там гигантским холстом.
  3. Скроллинг окна есть аппаратный, как горизонтальный так и вертикальный. Это прекрасно. Но он сворачивает окно в кольцо. Т.е., если мы двигаем окно влево, то справа вылезает начало этого же самого окна. Хорошие новости – размер окна может быть 512х512, а видимая часть у нас 256х192. Значит, мы можем протянуть 256 “новых” точек рулоном из невидимой части. Но после этого все равно в окно вползет левый край этого же, пусть и большого, окна.

Каким же образом двигаться по большому холсту? Можно в невидимой части дорисовывать новую обстановку. Но Макс (MaxiolLtd) предложил идею покруче: “У нас же море памяти! Можно сделать кучу страниц и оперировать ими!”.

Т.е. мы делаем две страницы 512х512 таким образом, что вторая страница ПОВТОРЯЕТ половину первой. И тогда, когда горизонтальным скроллом мы втянем влево эти правые 256 точек, мы может сбросить счетчик рулона на ноль, а начало экрана для отображения переключить уже на вторую страницу 512х512. Ведь у нас эти два куска по 256 точек полностью совпадают. И таким макаром двигать можно бесконечно – половину вкручиваем, перключаемся на следующую страницу. Расход памяти дикий, олды бьются в истерике “это не наш метод”, ну да и пофиг, развлекаемся 🙂

Коряво нарисую как выглядит “мегаэкран” в моем ремейке Дейва:

Специально сдвинул квадратики, чтобы они не затерли границы друг друга. В целом, понятно, как это выглядит – по вертикали тоже надо продублировать половины (много половин, много, да).

Скролл заработал весело, но чуть позже стало понятно, что везде есть подводные камни – если на пересекающихся частях нужно что-то изменить (открыли дверь, к примеру), то ведь и скопировать теперь надо эти изменения на ВСЕ пересекающиеся части. Итого может быть от 1 до 4 копий одного места.

Вот тут и начались развлечения с дверями. Дело в том, что эти виртуальные видеостраницы 512х512 тоже состоят из страниц, которые имеют фиксированный размер 10000(8) байт. Блиттер, конечно, лихо рисует на них, ему только адреса подкидывай. 24-битные. Но надо еще и все “соседские отношения” помнить – кто на ком стоял. Причем, размеры у лабиринтов у всех разные, окошек 512х512 может быть разное количество и по вертикали и по горизонтали. Поэтому двери у меня два или три дня появлялись непонятно где (неверно считались смещения на соседних страницах), потом вроде открываешь дверь, идешь от нее, а она у тебя за спиной закрывается! Страница включилась с неоткрытым вариантом. Ну и все в таком духе.

Записал видеоролик, залил в ютуб и потом там заметил, что на 1:31 там мелькает снова закрытая дверь! Начал думать как это снова могло произойти и понял, что не учел того, что дверь имеет размеры 2х3 тайла и при этом может стоять на границе аж четырех страниц! Т.е. левая часть в одном окне, правая часть в другом, а нижняя половина еще черт знает где.

Но сегодня я их добил! Теперь можно в эти шкафы что-то и поставить. Ролик исправлять уже не стал, пусть останется для истории:

 

16
Мар
2024

Начинаем открывать двери

Интересный прикол в оригинале – алмаз появляется раньше, чем открывается сама дверь:

 

15
Мар
2024

Уже похоже!

Недавно в эмуле GIDа появились “Точки остановки с условиями” – можно задать условие остановки, когда, к примеру, произойдет обращение к интересующей ячейке памяти по чтению или записи (на выбор). Крутая штука! Благодаря ей я нашел сейчас причину одного из глюков – время от времени скролл экрана уезжал неведомо куда. Оказалось, причина была в неверном развороте Дейва в падении. Эта процедура была расчитана на первоначальный вариант падения, а этих вариантов уже стало четыре. Как обычно возникает вопрос – как оно вообще работало? 🙂

GIDу огромное спасибо за шикарный инструмент разработки и отладки!

Итак, я добавил проверки на горизонтальные препятствия, коррекцию “полетов” при столкновении с этими препятствиями. Теперь Дейв уже не проходит сквозь стены и не пролетает. Поправил свойства некоторых объектов. Вообще, прикольный механизм придумали Ромеро с Кармаком, конечно, для обработки обстановки – у каждого тайла есть свойства “можно пройти объект справо налево”, “можно пройти объект сверху вниз” и т.д. Обработка столкновений проще при этом. Но зато приходится эти свойства обдумывать и назначать.

В целом, Дейв стал двигаться уже похоже. Теперь надо с длиной и высотой этих прыжков разобраться, чтобы не прыгал слишком далеко. И можно переходить к стрельбе!

13
Мар
2024

Потолки и стены

Дейв научился определять потолок. Ну и традиционное развлечение – найди край препятствия, ведь персонаж должен стоять на ящике ногами, а не краем спрайта, где ружье торчит. Квадратно-гнездовой метод тут не годится.

11
Мар
2024

Носимся по дому

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

04
Мар
2024

Его пигалица перемахнула через куст!

Итак, сегодня Дейв научился прыгать на разную высоту, в зависимости от того, когда будет отпущена кнопка “прыжок”. А также впервые начал распознавать под собой землю при приземлении. Так что сегодня Дейв самостоятельно залез на дерево.

29
Фев
2024

Даешь прыжки!

Собрал анимацию и механизм прыжков, а также переделал анимацию бега. Прыжки управляемые, как и положено в Дейве – на лету можно повернуть в другую сторону, уж не знаю, что за физика такая 🙂 Анимация работает успешно, теперь надо проверить, получаются ли при прыжках такие же расстояния в длину, как в оригинале. А потом можно и обстановку задействовать – пора побродить по этажам 🙂