Category: Разработка

15
Ноя
2020

Старые грабли

Продолжаю работу над падающими плитами.  Обнаружилось, что если такая плита лежит перед закрытой решеткой, то после падения плиты, решетка выводится с куском уже несуществующей плиты. Это происходило потому что фон под решеткой запомнился тогда, когда плита еще была перед ней нарисована. Надо было это фиксить, конечно. Придумал как – надо читать фон еще когда этой плиты нет перед решеткой, при выводе окна. Ок, прочитал. Пропал верхний уголок над решеткой – потому что фон запомнился когда плиты еще нет, но при этом еще и нет обстановки над решеткой. В итоге потом черный кусок над решеткой. Ок, при выводе решетки читаем нижнюю треть фона, где уже нарисовано все без плиты, а после вывода всего окна – дочитываем верхнюю часть фона. Начинаю тестить – жуть, принц проваливается в пол, вместо решеток – куски памяти, вместо обстановки рисуется шизофрения. Ого! Такого размаха глюководства давненько я не наблюдал!

Если глюки такие масштабные, значит поверх памяти вкатил, наверное, эти половинки фона или стек, может, запортился. В общем, что-то типа этого начинаю искать. Ищу и не нахожу ничего криминального. Как обычно. Плюнул на все, лег спать. Утро вечера всякоразней.

Утром (ну как утром…. в три часа дня) посмотрел свежим взглядом – все супер, никаких ошибок нет. Но все-таки утро рулит – пришла в голову мысль, что эти грабли мне знакомы. А не вылез ли я за пределы страницы памяти? Смотрю размер файла с этими подпрограммами – так и есть, на 20 байт больше, чем влезает в страницу. Кусок программы просто отрезался при загрузке. Перетасовал подпрограммы по разным загружаемым файлам и все ок – фоны читаются, решетки не портятся.

Но пока я все это делал, то решил, что надо все делать по-другому )))

 

14
Ноя
2020

Ночная шиза

Засиживаюсь иногда до трех часов ночи, когда кажется, что вот-вот и задача будет решена. Ну да, часто так и бывает – или нахожу где ошибка или уже исправляю этот баг. Но иногда это выходит боком. Недавно заметил, что шипы в лабиринтах перестали убираться, когда принц уходит из их зоны действия. Так как я недавно много чего оптимизировал в выводе спрайтов, то решил, что где-то задел проверку на координаты принца при выводе шипов. Сегодня решил исправить. Прошерстил весь контроль шипов – все вроде нормально. Но они не убираются! Делаю отладку, вижу, что принц вышел из зоны. И программа видит это, начинает убирать шипы. Счетчики бегут, спрайты меняются, а на экране шипы как торчали, так и торчат. Что за бред? Начинаю смотреть еще внимательней – да все срабатывает, вот фазы шипов пошли новые, убирающиеся. На экране шипы торчат.

Попил чаю, подумал о вечном.

Смотрю еще раз и вдруг вижу, что старый фон шипов выводится не командами MOV, а BIS! Т.е. вместо затирания старых фаз сохраненным фоном, этот фон накладывается на выведенные шипы. И новые фазы так удачно рисуются, что не вылезают за пределы старых. На экране выглядит так, как будто шипы торчат, а на самом деле там уже нарисовалось еще кучу фаз убирания и шипы убрались.

Ну и откуда там взялся BIS? В исходниках недельной давности там MOV. А потому что нефиг в три часа ночи оптимизировать вывод спрайтов!

 

14
Ноя
2020

Очень хитрый глюк

Сегодня весь день боролся с одним глюком. В 11м лабиринте есть место с большим количеством падающих плит, они там занимают два экрана. И вот, пробегаю я там для проверки и вижу, что одна плита почему-то не падает. Точнее, в одном экране плита остается висеть вверху, как будто я по ней и не пробегал, а в другом экране почему-то нет на одном месте обломков, хотя плита туда падала и они должны там валяться. Сначала я думал, что дело в том, что принц наступает на плиту, она начинает качаться и тут принц падает в окно ниже. Конечно, думал я, текущее окно сменилось, а фаза плиты, небось, еще не дошла до точки падения и при смене окна фаза обнулилась, что и вызвало застревание плиты. Но в процедуре смены окна вроде бы все было хорошо. Начал отлаживать, вижу, что при смене окна все-таки есть баг, в редком случае плита может еще не успеть упасть и текущее окно у нее не сменится.  Исправил. Вообще ничего не изменилось. Снова сижу в отладчике, вылавливаю эту плиту. Все вроде упало, а плита в лабиринте не стерта! Конечно она там выводится, ведь если код плиты остался на месте, то она и должна вывестись! Смотрю место, где плита должна стереться, когда начинает падать. В отладчике дохожу до этой точки и вижу, что плита стерлась. Но через пару кадров она снова в массиве лабиринта появляется! Как так-то? Ага, ведь есть случай “mcfly”, когда падающая плита падает на падающую плиту и тогда в лабиринт снова записывается код 15 (падающая плита). Неужели плита умудряется упасть “сама на себя”? Фиг его знает, может что напутал с координатами при смене окна… Но нет, эта подпрограмма не вызывается при трассировке…

Начинаю отслеживать тот момент, когда же вновь появляется код плиты в лабиринте на старом месте. И вижу, что это происходит при восстановлении фона для стирания плиты с экрана! Вот это поворот! Каким же боком восстановление сохраненного под плитой фона влияет на состояние элементов в лабиринте?? Оказывается, в 90х я не дописал толком эти самые падения плит – нет проверок на высоту спрайта плиты при проваливании плиты за границу экрана! Таким образом, когда плита подлетала к нижней границе экрана, фон для нее запоминался с куском данных ЗА этой границей, через адрес 100000. Со 100000 как раз подключена страница с лабиринтом. Фон запоминался, поверх экрана и лабиринта рисовалась плита (!), потом фон восстанавливался и лабиринт тоже. Поэтому и плиты “возвращались” на место – этот кусок данных возвращался на место.

Вот такой вот мегаглюк. Любимый переход через 100000, чтоб его.

Ну, теперь принц тут бегает спокойно:

 

12
Ноя
2020

А плиты летят, плиты…

Читал у Джордана Мекнера “Сегодня я добавил в игру падающие плиты”. Так буднично, как будто он сел такой после обеда,  добавил ВСЕ, что связано с этими плитами и пошел кидаться пивными банками в голубей. Там СТОЛЬКО гемора с этими плитами, что они вызывают у меня уже нервный тик! Они должны качаться, они должны лететь через весь лабиринт и сшибать на своем пути другие плиты. Если плита упала на управляющую решеткой плиту – должны сработать решетки. Если принц наступил на такую плиту с самого правого края, затем сразу вбежал в правое окно – часть плиты видна уже слева, и координаты ее надо поменять на левый край, а то она будет продолжать рисоваться справа…. аааа…. Еще плиты не должны ничего затереть, конечно же. А он, блин, “сегодня я добавил плиты”….

Исправил сегодня три бага с плитами. И еще два есть.

 

 

10
Ноя
2020

Оптимизация

Оптимизировал копирование со скрытого экрана на видимый – развернул цикл копирования и сделал самомодифицирующийся код этого самого цикла по совету Manwe Sands. В зависимости от ширины копируемого куска, исполняется нужное количество итераций цикла. Код  sob r2 как раз и изменяю:

 

 

 

 

 

 

 

 

Для теста просто запустил секундомер и пробежал три экрана на старой версии и на новой. Выигрыш 1 секунда 🙂

Вообще надо попробовать обойтись без копирования – переключать экраны. Сейчас просто пустой экран используется как чистый фон, но есть мысль как от этого избавиться: раз копирование у меня все равно в одном месте сделано, то что мешает в этом месте тупо переключить экраны, раз уже все выведено и подготовлено к копированию? А восстанавливать фон на втором экране уже. Завтра попробую.

 

 

 

 

08
Ноя
2020

Слишком точная копия

Разбираюсь с тем, как должен вести себя принц, упавший на “ненадежные” плиты, которые рушатся. Если у принца последняя жизнь и он теряет ее при падении, то принц переходит в состояние “помер”. А плита-то активирована и потом падает. И принц остается висеть в воздухе.

Стал смотреть, как этот вопрос решен в оригинале, и вдруг:

И что, блин, делать? 🙂

 

07
Ноя
2020

12+13 лабиринт

Поделил 12 лабиринт на два, теперь мультики не портят данные. Сделал переход из 12-го в “13-й”. Попутно выяснилось, что в наличии два жутких глюка – во-первых, падающая плита при падении на такую же “нестабильную” плиту не уносила ее с собой вниз, как положено, а застревала на ней. Во-вторых, падающие плиты выводились неверно – поверх них выводился задний план. Оба глюка побеждены. И оба они были очень древними 🙂 Ну и еще мелкий глюк со смещением маски верхней части колонн исправлен, но это ерунда.

04
Ноя
2020

12 лабиринт

Нашел в чем была проблема с новым 12м лабиринтом. Последние два слова в каждом лабиринте представляют собой адрес в экране, куда вывести принца после входа и слово состояния принца (движение), которое он должен получить при входе. Т.к. в некоторые лабиринты принц “впадает” (как в 7-й), то это первое движение вовсе не везде одинаково. К тому же, после входа принц смотрит в определенную сторону, а вовсе не в одну и ту же. Все это есть в слове состояния принца. И вот это самое слово состояния и адрес вывода при сохранении лабиринта из редактора тупо обнулялись! Видимо тогда нам было лень делать механизм назначения движения и мы решили, что впишем от руки потом, лабиринтов-то всего 12. И вписали, что характерно. А вот я об этом забыл 🙂 Ну, вписал и сейчас, не проблема 🙂

Лабиринт заработал. Заодно проверил возможность пройти череду прыжков в 12-м, это весьма сложное место и в оригинале, с нормальной клавиатурой. А уж на БК с ее “особенностями” и подавно. Мне было интересно, реально ли пропрыгать этот каскад в нашем принце. Оказалось, что реально, по крайней мере на эмуляторе БК. Но и глюк нашелся, куда без этого: если при смене экрана принц бежит по обваливающейся плите, то он сразу падает. Будем исправлять 🙂

P.S. проблему с плитой и провалом пофиксил, но ролик получился эпичный ))

04
Ноя
2020

Хитрый глюк

Проверял срабатывание мультика с мышью в 8м лабиринте, когда она нажимает плиту. Нашел кучу глюков, но в итоге мышь-таки выбежала. Но самый прикол был потом – я добежал до выхода и увидел, что дверь ЗАКРЫВАЕТСЯ! Типа слишком долго провозился, выход закрыт )) Последствие переделки
механизма решеток 🙂