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

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 лабиринт. Пришлось лезть в исходники редактора и смотреть как на самом деле нужно создавать списки связей решеток и кнопок. Выяснилось, что и положение решеток “открыто-закрыто” тоже надо было задавать. В принципе, это логично, но я просто уже забыл об этом. Вообщем, первая попытка сделать новый лабиринт провалилась, буду разбираться.