/* * movesprite — переместить спрайт (кадр ≤ 64×64): восстановить фон под * старой позицией (heal по размерам img из заголовка) и вывести спрайт в * новой (putsprite). Порядок heal→draw делает перекрытие старой и новой * позиций безопасным: heal читает фон из ОЗУ-копии, которую спрайт * (банк 0x5C) никогда не трогал. * * Идёт через лин-ядро _gfx_heal_sprite (без split'а, 8-бит w/h) — банк * на время heal форсится 0x50 (иначе heal бессмыслен), затем putsprite. * Спрайтовая программа не тянет общие *_full. * * Канонический цикл анимации — docs/sprite-api-design.md §6: * putsprite(x, y, hero); ... * gfx_wait_vsync(); movesprite(x, y, nx, ny, hero); */ #include "../_bgi.h" void movesprite(int oldx, int oldy, int x, int y, const void *img) { const uint8_t *p = (const uint8_t *)img; uint8_t saved = gfx_get_bank(); gfx_set_bank(GFX_BANK_NORMAL); _bgi_begin(); if (_gfx_sprite_clip) _gfx_heal_sprite(oldx, oldy, p[0], p[2]); else _gfx_heal_sprite_noclip(oldx, oldy, p[0], p[2]); _bgi_end(); gfx_set_bank(saved); putsprite(x, y, img); }