roomtest: fore-окклюзия пола/стены над Kid (порт redraw_at_char/char2)
Kid — высокий спрайт: голова/руки торчат в ряд выше опорного, floor/wall там должны перекрывать его. Сверено с SDLPoP (seg003 redraw_at_char2 + seg008 draw_tile_fore/draw_other_overlay/draw_floor_overlay): - fore_tile (draw_tile_fore): стена рисует и WALL_FRAM_BOTTOM (нижняя грань-решётка), не только MAIN — руки при прыжке в потолок [2,7]->[1,7] уходят за стену; - диапазон рядов форсит включение ряда над опорным (y_to_row верха спрайта мог схлопнуться из-за +60-сдвига); - other_overlay_tile (draw_other_overlay): на КРОМКЕ пола (сосед слева пуст) перерисовать весь тайл поверх Kid — но ТОЛЬКО в позах захвата (78-79), виса (action 2/6), полёта (3/4), старта падения (bumped 102-106) и начала подъёма (135/136, до SEQ_UP на 141 Kid ещё в ряду ПОД полом). Гейтинг как в redraw_at_char2 — при стоянии/беге ложной окклюзии нет; - отладочный стоп-кадр: '1' заморозить / '2' продолжить (для разбора поз). Проверено в MAME (пользователь): прыжок-в-потолок, короткий прыжок, спрыгивание, подъём на [0,3] — окклюзия корректна. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -23,7 +23,7 @@ int main(void)
|
||||
/* Дабл-буфер: front — видимая страница, back — куда рисуем. dbuf=1
|
||||
* по умолчанию (без мерцания); SPACE переключает в однобуфер для
|
||||
* отладки багов рисования (edge по sp_prev, чтоб не дёргать). */
|
||||
uint8_t pg, front = 0, back, dbuf = 1, sp_prev = 0;
|
||||
uint8_t pg, front = 0, back, dbuf = 1, sp_prev = 0, frozen = 0;
|
||||
|
||||
if (pop_bg_load() != 0) { /* атласы — ДО initgraph */
|
||||
puts("pop_bg_load failed");
|
||||
@@ -58,7 +58,8 @@ int main(void)
|
||||
kid_init(SEQ_STAND, 1, 1, 0);
|
||||
kid_draw();
|
||||
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
||||
kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);
|
||||
kid_fp_width(), kid_fp_height(),
|
||||
Kid.direction, Kid.frame, Kid.action);
|
||||
|
||||
if (pop_ctrl_init() != 0) { /* raw-канал клавиатуры (забирает ввод у DSS) */
|
||||
closegraph();
|
||||
@@ -79,6 +80,16 @@ int main(void)
|
||||
}
|
||||
sp_prev = sp;
|
||||
|
||||
/* Отладочный стоп-кадр: '1' (PS/2 0x16) — заморозить, '2' (0x1E) —
|
||||
* продолжить. В заморозке пропускаем весь tick/draw/flip: картинка
|
||||
* стоит, можно спокойно разбирать позу Kid и окклюзию. */
|
||||
if (kbd_raw_down(0x16)) frozen = 1;
|
||||
if (kbd_raw_down(0x1E)) frozen = 0;
|
||||
if (frozen) {
|
||||
gfx_wait_vsync();
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Рисуем в СКРЫТУЮ страницу (при dbuf); в однобуфере — в 0. */
|
||||
back = dbuf ? (uint8_t)(front ^ 1) : 0;
|
||||
gfx_set_draw_page(back);
|
||||
@@ -93,7 +104,8 @@ int main(void)
|
||||
}
|
||||
kid_draw(); /* нарисовать новый кадр */
|
||||
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
||||
kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);
|
||||
kid_fp_width(), kid_fp_height(),
|
||||
Kid.direction, Kid.frame, Kid.action);
|
||||
|
||||
/* Пейсинг 3 кадра, затем tear-free флип на vblank: draw уже
|
||||
* сделан (скрытая страница), wait_vsync ловит начало кадра,
|
||||
|
||||
Reference in New Issue
Block a user