libbgi: авто-анимация спрайтов — кадровая + tween (tests/spranim все PASS)
Реализация §9г по требованиям пользователя: - sprite_anim(first,last,speed,mode): ANIM_LOOP / ANIM_PINGPONG / ANIM_ONCE (one-shot замирает на last), | ANIM_HORIZ для горизонтальных лент. Смена кадра в тике = ±an_step к оси ленты — без умножений (осевое смещение first считается в setup циклом). - sprite_moveto(tx,ty,max_step,interval): Брезенхэм порциями ≤max_step вдоль большей оси (меньшая — err-аккумулятором, нелинейные шаги Y сами собой), деления нет. - Одновременность кадровой и tween — независимые поля/биты. - Статус: sprite_anim_status() — битовое поле SPR_ANIM_ON/DONE + SPR_MOVE_ON/DONE; sprite_anim_frame() — текущий индекс кадра; sprite_moving(). - Стопы: sprite_anim_stop(frame | -1 = текущий); sprite_move_stop(0 = замереть / 1 = прыжок в цель + DONE). - Тикер _sprite_tick — проход 0 sprite_update через funcptr _spr_tick_fn (DCE: без sprite_anim/moveto код не линкуется, цена — один if на кадр; +40 Б программе с движком, sprite_t +18 Б). tests/spranim (MAME dev, все PASS): LOOP/PINGPONG (разворот на границе без удвоения краёв)/ONCE+DONE; пример (0,0)→(100,50), шаг 5, интервал 4 → ровно 80 кадров, Y идёт 3/2/3/2; стопы обоих видов. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -155,6 +155,15 @@ void _gfx_w0_isr(void);
|
||||
#define _ATL_DIR_OFF 0x68u /* каталог: count × 8 Б (макс 19) */
|
||||
#define _ATL_DATA_OFF 0x100u /* ленты; = резерв ISR-стаба */
|
||||
|
||||
/* ---- Авто-анимация спрайтов (§9г) --------------------------------- *
|
||||
* Тикер подключается указателем (DCE: программа без sprite_anim/
|
||||
* sprite_moveto не тянет его код): дефолт NULL (_BSS), ставят
|
||||
* sprite_anim()/sprite_moveto(). sprite_update зовёт в начале кадра.
|
||||
* Типы из <sprite.h> здесь недоступны (подключается после) — void*. */
|
||||
typedef void (*_spr_tick_fp)(void *arr, uint8_t count);
|
||||
extern _spr_tick_fp _spr_tick_fn; /* common/_spr_tick_fn.c */
|
||||
void _sprite_tick(void *arr, uint8_t count); /* common/_sprite_tick.c */
|
||||
|
||||
/* ---- Fill-burst'ы акселератора 256 (register-ABI, asm-only) ------ *
|
||||
* Вызываются ТОЛЬКО из asm raw-примитивов; аргументы в регистрах, без
|
||||
* глобального скретча в _DATA:
|
||||
|
||||
Reference in New Issue
Block a user