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

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

 

04
Ноя
2020

12 лабиринт, продолжение

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