applications/PoP/roomtest: fore-слой поверх Kid (передние тайлы)
Порт SDLPoP seg003 redraw_at_char + seg008 set_char_collision: после kid_draw передний слой (fore_id = foretable-кусок) тайлов ФУТПРИНТА спрайта Kid перерисовывается ПОВЕРХ него — то, что по изометрии перед персонажем (передние грани колонн/ворот/большой колонны/щебня). Стены и факелы имеют fore_id=0 → остаются сзади (в статическом фоне). - pop_bg: pop_fore_over_kid(obj_x,obj_y,w,h,dir) — считает футпринт (char_x_left/right, col_from_x, y_to_row_mod4) рядов top..bottom × колонок left..right (≤2×2=4 тайла) и рисует fore_id каждого в GFX_BANK_SPRITE (видео-ОЗУ; kid_heal восстановит из теневого фона, fore в нём запечён pop_room_draw). - pop_kid: kid_fp_obj_x/y/width/height — метрики последнего кадра (obj_x ЛОГИЧЕСКАЯ, до ×8/7) для футпринта. - roomtest: вызов pop_fore_over_kid после kid_draw. Проверено в MAME: Kid, идя влево мимо колонны под навесом (row1 col3), корректно уходит ЗА её переднюю грань (скрывается) и выходит с другой стороны; задние колонны/факелы остаются сзади. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -167,6 +167,15 @@ static int kid_lx, kid_ly;
|
||||
static uint16_t kid_lw, kid_lh;
|
||||
static uint8_t kid_lvalid;
|
||||
|
||||
/* Метрики последнего kid_draw для футпринта fore-over-Kid (pop_bg):
|
||||
* obj_x — ЛОГИЧЕСКАЯ X кадра (ДО ×8/7), obj_y — низ, w/h — размер. */
|
||||
static int kid_fp_x, kid_fp_y;
|
||||
static uint16_t kid_fp_w, kid_fp_h;
|
||||
int kid_fp_obj_x(void) { return kid_fp_x; }
|
||||
int kid_fp_obj_y(void) { return kid_fp_y; }
|
||||
uint16_t kid_fp_width(void) { return kid_fp_w; }
|
||||
uint16_t kid_fp_height(void) { return kid_fp_h; }
|
||||
|
||||
/* Восстановить фон из теневой копии на месте ПРЕДЫДУЩЕГО кадра Kid. */
|
||||
void kid_heal(void)
|
||||
{
|
||||
@@ -190,6 +199,8 @@ void kid_draw(void)
|
||||
obj_y = (int)Kid.y + fr.dy;
|
||||
if ((int8_t)(fr.flags ^ Kid.direction) >= 0)
|
||||
obj_x++; /* even/odd pixel (в ЛОГИЧЕСКОЙ координате) */
|
||||
kid_fp_x = obj_x; /* ЛОГИЧЕСКАЯ X (до ×8/7) — для футпринта fore */
|
||||
kid_fp_y = obj_y;
|
||||
/* seg008 calc_screen_x_coord: логическая X (280 шир = 28px/тайл) ->
|
||||
* экран (320 шир = 32px/тайл), ×320/280 = ×8/7. БЕЗ этого Kid уезжает
|
||||
* влево от тайлов тем сильнее, чем правее (col9 ~36px). Коллизия — в
|
||||
@@ -215,6 +226,7 @@ void kid_draw(void)
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
kid_lx = bx; kid_ly = top;
|
||||
kid_lw = w; kid_lh = h; kid_lvalid = 1;
|
||||
kid_fp_w = w; kid_fp_h = h; /* размер кадра для футпринта fore */
|
||||
}
|
||||
gfx_w0_unmap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user