Category: Блог

15
Ноя
2020

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

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

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

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

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

 

14
Ноя
2020

Ночная шиза

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

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

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

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

 

14
Ноя
2020

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

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

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

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

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

 

10
Ноя
2020

Оптимизация

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

 

 

 

 

 

 

 

 

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

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

 

 

 

 

09
Ноя
2020

Комментарии

Помнится, Женя все время мне говорил “Пиши комментарии в коде! Потом ведь фиг разберешься!”, а я ему отвечал “Да и так все понятно, чего тут комментировать?”. И вот теперь:

 

 

 

Что, блин, за “случай МакФлай”?? Что это значит, еклмн? Вернуться бы в прошлое и дать себе подзатыльник!

P.S. Случай mcfly оказался ситуацией, когда одна падающая плита падает на другую “нестабильную” плиту.

 

09
Ноя
2020

Баги, баги…

Борьба с багами продолжается. Любимые грабли – выход за пределы экрана и затирание страницы со 100000. В 11м лабиринте куча падающих плит на границе экрана, вот там оно и вылезло. Нашел где, осталось исправить 🙂

Эти летающие плиты “еще со времен Ганди нас ненавидят” (с) Раджеш Кутраппали.

 

08
Ноя
2020

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

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

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

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

 

07
Ноя
2020

Двумя багами меньше!

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

А в качестве видео – вот как работает переворачивающий кувшин 🙂