eb9ca0179d
Реализация §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>
33 lines
1.3 KiB
C
33 lines
1.3 KiB
C
/*
|
|
* atlas_sprite_init — инициализировать спрайт лентой idx W0-атласа.
|
|
* Аналог sprite_init, но img/размер КАДРА берутся из каталога атласа
|
|
* (заголовок ленты трогать нельзя — он в невидимой сейчас странице),
|
|
* а page = страница атласа (sprite_update подключит её сам).
|
|
* Кадр (0,0); кадр (i,j) ленты — sprite_frame(s, i*fw, j*fh).
|
|
*/
|
|
#include <sprinter.h>
|
|
#include <sprite.h>
|
|
#include "../_bgi.h"
|
|
|
|
void atlas_sprite_init(sprite_t *s, const atlas_t *a, uint8_t idx)
|
|
{
|
|
uint8_t saved = _io_page_w3;
|
|
const uint8_t *e;
|
|
|
|
sprinter_page_w3(a->page);
|
|
e = (const uint8_t *)(0xC000 + _ATL_DIR_OFF) + (uint16_t)idx * 8;
|
|
s->img = (const void *)(e[0] | (uint16_t)(e[1] << 8));
|
|
s->w = e[2]; /* fw — размер КАДРА */
|
|
s->h = e[3]; /* fh */
|
|
sprinter_page_w3(saved);
|
|
|
|
s->x = 0; s->y = 0;
|
|
s->sx = 0; s->sy = 0;
|
|
s->flags = 0;
|
|
s->page = a->page;
|
|
s->an_flags = 0; /* авто-анимации выключены */
|
|
s->an_frame = 0;
|
|
s->drawn[0].on = 0;
|
|
s->drawn[1].on = 0;
|
|
}
|