/* * sprite_anim_stop — остановить кадровую анимацию. frame ≥ 0 — какой * кадр останется на экране (индекс вдоль оси ленты, ≤127); -1 — * замереть на текущем. * * Пиксельный шаг оси берётся из размера кадра (w — горизонтальная * лента, h — вертикальная; an_step НЕ годится — он в БАЙТАХ src), * смещение кадра — циклом сложений (стоп — редкий вызов). Установка * кадра — через sprite_frame (единственная точка пересчёта кэша src; * важно и при frame == an_frame: src мог уехать тикером, а sx/sy — * нет, sprite_frame сверяет именно src). Валидна после sprite_anim; * SPR_ANIM_DONE не трогает. */ #include "../_bgi.h" #include void sprite_anim_stop(sprite_t *s, int8_t frame) { s->an_flags &= (uint8_t)~(SPR_ANIM_ON | _SPR_PP_BACK); if (frame >= 0) { uint8_t step_px = (s->an_flags & _SPR_STRIP_HORZ) ? s->w : s->h; int off = 0; uint8_t i; for (i = 0; i < (uint8_t)frame; i++) off += step_px; s->an_frame = (uint8_t)frame; if (s->an_flags & _SPR_STRIP_HORZ) sprite_frame(s, off, s->sy); else sprite_frame(s, s->sx, off); } }