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:
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* sprite_anim_stop — остановить кадровую анимацию. frame ≥ 0 — какой
|
||||
* кадр останется на экране (индекс вдоль оси ленты, ≤127); -1 —
|
||||
* замереть на текущем. Ось кадра считается циклом сложений (стоп —
|
||||
* редкий вызов, __mulint не тянем). Валидна после sprite_anim
|
||||
* (an_step/ось настроены им); SPR_ANIM_DONE не трогает.
|
||||
*/
|
||||
#include "../_bgi.h"
|
||||
#include <sprite.h>
|
||||
|
||||
void sprite_anim_stop(sprite_t *s, int8_t frame)
|
||||
{
|
||||
s->an_flags &= (uint8_t)~(SPR_ANIM_ON | _SPR_ANIM_BACK);
|
||||
|
||||
if (frame >= 0 && (uint8_t)frame != s->an_frame) {
|
||||
int off = 0;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < (uint8_t)frame; i++)
|
||||
off += s->an_step;
|
||||
s->an_frame = (uint8_t)frame;
|
||||
if (s->an_flags & _SPR_ANIM_HORZ)
|
||||
sprite_frame(s, off, s->sy);
|
||||
else
|
||||
sprite_frame(s, s->sx, off);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user