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