Разбираюсь с форматом лабиринта оригинального Дейва — теперь меня интересует второй слой, на котором расставлены все враги, а также все предметы которые можно собрать. Вроде бы сначала идет все хорошо — в дампе коды алмазов (100001) совпадают с кодами шкафов на первом плане, коды Зомби (1) стоят где положено… Дохожу до нижнего уровня и начинаются приколы:
на экране алмаз в шкафу, но в дампе его нет! Там как раз стоит 456 нулей, т.е. это пропуск аж 4 строк и еще 56 элементов
следом за ним на экране большой алмаз (код 20) и в дампе он есть
потом идет пустота, потом код Зомби (1), стоящего у правого края окна
затем начинается уже новая строка и снова код Зомби (1), который стоит у входа в дом
потом код того самого алмаза в шкафу (100001), что на экране стоит ЛЕВЕЕ большого алмаза (код 20)
Ок, допустим что «алмаз в шкафу» кодируется не в той строке, что он нарисован, а строкой ниже, там где «ручка двери шкафа». Тогда понятно, почему они в разных строках с большим алмазом. Но Зомби? Получается, что код 1 — это вовсе не уровень головы или ног Зомби, ведь эти два Зомби на одном этаже, а в дампе — в разных строках. Типа просто вот он тут где-то установлен, строкой выше или строкой ниже. Ставьте его уже сами потом так, чтобы он не торчал наполовину в полу. При этом сам слой практически пустой, ничего не мешало расставить этих Зомби точно по месту, с другими объектами там конфликтов нет.
P.S. Похоже, Зомби кодируются по уровню плеч. А тот, что строкой выше — просто стоит на лестнице, на одну строку выше пола.
Сегодня доделал открытие дверей и переход между локациями:
— «дверь назначения» теперь автоматически выводится открытой при телепортации
— сделана коррекция Дейва в дверь при уходе
— переделано управление бегом, теперь Дейв сразу останавливается, если отжата клавиша бега на клавиатуре или джойстике. Раньше у Дейва были принцевские замашки, т.е. движение должно было доиграться до конца
Потихоньку пополняю список того, что можно добавить или исправить в Goonies:
— задание кнопок паузы и меню на джойстике
— сохранение настроек игры на диск
— публикация рекорда и открытых секретов по сети (если обнаружен AZBK)
— исправить затирание части «табло» максимально набранным шмотом
— исправить провал сквозь пол (Alex Shestipaloff снова умудрился провалиться)
Итак, чтобы было понятно в чем суть, объясню как устроен вывод лабиринта в Дейве (моем). Хранится он, конечно, в виде кодов объектов, но его ведь надо вывести на экран. Причем экран в Дейве скроллится во все стороны с произвольным смещением, значит надо или постоянно дорисовывать невидимые части и вдвигать их в видимое окно, или вывести сразу весь лабиринт тайлами и только двигать по нему окно отображения. Во втором случае рисовать больше ничего не надо, только смещай окно да и все. Как угодно можно смещать.
Тут начинаются (как обычно) ограничения.
В контроллере AZBK можно вывести на экран любую область его памяти, просто указав «экран начинается с такой-то страницы».
В контроллере AZBK максимальная длина строки для экранного отображения — 512 байт. Для используего в Дейве видеорежима (256х192, 256 цветов) это байт на точку. Значит, рисовать «полотно» можно только кусками 512х512, а не каким-то там гигантским холстом.
Скроллинг окна есть аппаратный, как горизонтальный так и вертикальный. Это прекрасно. Но он сворачивает окно в кольцо. Т.е., если мы двигаем окно влево, то справа вылезает начало этого же самого окна. Хорошие новости — размер окна может быть 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 тайла и при этом может стоять на границе аж четырех страниц! Т.е. левая часть в одном окне, правая часть в другом, а нижняя половина еще черт знает где.
Но сегодня я их добил! Теперь можно в эти шкафы что-то и поставить. Ролик исправлять уже не стал, пусть останется для истории:
Недавно в эмуле GIDа появились «Точки остановки с условиями» — можно задать условие остановки, когда, к примеру, произойдет обращение к интересующей ячейке памяти по чтению или записи (на выбор). Крутая штука! Благодаря ей я нашел сейчас причину одного из глюков — время от времени скролл экрана уезжал неведомо куда. Оказалось, причина была в неверном развороте Дейва в падении. Эта процедура была расчитана на первоначальный вариант падения, а этих вариантов уже стало четыре. Как обычно возникает вопрос — как оно вообще работало? 🙂
GIDу огромное спасибо за шикарный инструмент разработки и отладки!
Итак, я добавил проверки на горизонтальные препятствия, коррекцию «полетов» при столкновении с этими препятствиями. Теперь Дейв уже не проходит сквозь стены и не пролетает. Поправил свойства некоторых объектов. Вообще, прикольный механизм придумали Ромеро с Кармаком, конечно, для обработки обстановки — у каждого тайла есть свойства «можно пройти объект справо налево», «можно пройти объект сверху вниз» и т.д. Обработка столкновений проще при этом. Но зато приходится эти свойства обдумывать и назначать.
В целом, Дейв стал двигаться уже похоже. Теперь надо с длиной и высотой этих прыжков разобраться, чтобы не прыгал слишком далеко. И можно переходить к стрельбе!
Итак, сегодня Дейв научился прыгать на разную высоту, в зависимости от того, когда будет отпущена кнопка «прыжок». А также впервые начал распознавать под собой землю при приземлении. Так что сегодня Дейв самостоятельно залез на дерево.
Собрал анимацию и механизм прыжков, а также переделал анимацию бега. Прыжки управляемые, как и положено в Дейве — на лету можно повернуть в другую сторону, уж не знаю, что за физика такая 🙂 Анимация работает успешно, теперь надо проверить, получаются ли при прыжках такие же расстояния в длину, как в оригинале. А потом можно и обстановку задействовать — пора побродить по этажам 🙂
Свежие комментарии