Фикс чистки факелов при перевороте: чистим в СТАРОЙ системе координат
На скриншоте пользователя после U остался чёрный квадрат в стороне от факела, а у двух факелов пропало пламя. Причина — система координат: pop_upside переключается в главном цикле ДО pop_flip_screen, а картинка на экране к этому моменту нарисована ещё в прежней. pop_torch_wipe считала координаты уже зеркально, поэтому чёрный бар ложился в отражённое место (там и остался квадрат), а само пламя не стиралось. Чистка теперь идёт при временно возвращённом старом значении pop_upside — то есть ровно по той картинке, что на экране.
This commit is contained in:
@@ -530,12 +530,19 @@ void pop_flip_screen(void) __banked
|
|||||||
* прямую копию уже чистой картинки. Дешевле полной перерисовки комнаты
|
* прямую копию уже чистой картинки. Дешевле полной перерисовки комнаты
|
||||||
* на порядок: 0..4 тайла против 6.2 млн тактов (14.5 кадра, замер MAME
|
* на порядок: 0..4 тайла против 6.2 млн тактов (14.5 кадра, замер MAME
|
||||||
* 2026-08-12) — а копия отражения стоит всего 2.1 кадра. */
|
* 2026-08-12) — а копия отражения стоит всего 2.1 кадра. */
|
||||||
|
/* ВНИМАНИЕ на систему координат: pop_upside к этому моменту УЖЕ
|
||||||
|
* переключён (главный цикл делает это перед вызовом), а картинка на
|
||||||
|
* экране нарисована ещё в СТАРОЙ. Чистить её надо по старым
|
||||||
|
* координатам, иначе чёрный бар ложится в зеркальное место — на экране
|
||||||
|
* оставался чёрный квадрат, а пламя так и не стиралось. */
|
||||||
|
pop_upside = (uint8_t)!pop_upside; /* временно: система ЭКРАНА */
|
||||||
gfx_set_draw_page(front);
|
gfx_set_draw_page(front);
|
||||||
for (i = 0; i < 30; i++) {
|
for (i = 0; i < 30; i++) {
|
||||||
uint8_t t = room_fg[i];
|
uint8_t t = room_fg[i];
|
||||||
if (t == 19 || t == 30) /* факел / факел с щебнем */
|
if (t == 19 || t == 30) /* факел / факел с щебнем */
|
||||||
pop_torch_wipe(i / 10, i % 10);
|
pop_torch_wipe(i / 10, i % 10);
|
||||||
}
|
}
|
||||||
|
pop_upside = (uint8_t)!pop_upside; /* вернуть новое состояние */
|
||||||
|
|
||||||
gfx_set_draw_page(back);
|
gfx_set_draw_page(back);
|
||||||
gfx_copy_page(&area, GFX_COPY_VFLIP); /* источник — видимая страница */
|
gfx_copy_page(&area, GFX_COPY_VFLIP); /* источник — видимая страница */
|
||||||
|
|||||||
Reference in New Issue
Block a user