feat(anim): suport de flip H/V per frame i per animació

This commit is contained in:
JailDesigner committed 2026-04-29 08:30:08 +02:00
1 parent 39eda56c9d
commit 1d43a77800
5 files changed
+438 -87

No files matched your search

@@ -8,14 +8,34 @@
#include "core/rendering/sprite/moving_sprite.hpp"
#include "core/resources/resource_types.hpp"
#include "external/fkyaml_node.hpp"
class AnimatedSprite : public MovingSprite {
public:
// Un frame d'animació = rectangle dins el spritesheet + flags de flip
// associats. El flip s'aplica al sprite a `animate()` quan l'animació
// declara que ella controla el flip (vegeu `AnimationData::controls_flip`).
struct Frame {
SDL_FRect rect{.x = 0.0F, .y = 0.0F, .w = 0.0F, .h = 0.0F};
bool flip_h{false};
bool flip_v{false};
};
// Paràmetres geomètrics del spritesheet, derivats del bloc `sprite:`
// del YAML. Es passen al parser d'animacions per a calcular els
// rectangles de cada frame a partir dels seus índexs.
struct SheetParams {
float frame_width{0.0F};
float frame_height{0.0F};
int frames_per_row{1};
int max_tiles{1};
};
// Dades d'una animació concreta dins d'un spritesheet. Les claus del
// mapa (`animations_`) són els noms; aquí només es guarden els fotogrames
// i l'estat de reproducció.
struct AnimationData {
std::vector<SDL_FRect> frames;
std::vector<Frame> frames;
// Durada de cada frame en segons (convertit des de `frame_ms` al YAML).
// Si té un sol valor, val per a tots els frames; altrament ha de tenir
// la mateixa mida que `frames`.
@@ -24,6 +44,13 @@ class AnimatedSprite : public MovingSprite {
// 0 = loop complet des del primer frame.
// N>0 = rebota al frame N en passar del final.
int loop_from{0};
// Si true, `animate()` escriu el flip del frame actual al sprite.
// Si false (cas backward-compat per a animacions sense cap declaració
// de flip), `animate()` no toca el flip — el codi del joc el segueix
// controlant externament via `setFlip(...)`. Es marca a true quan
// l'animació declara `flip_h`/`flip_v`, o quan algun frame es declara
// amb la forma mapping `{ index, flip_h?, flip_v? }`.
bool controls_flip{false};
bool completed{false};
int current_frame{0};
float accumulated_time{0.0F};
@@ -40,6 +67,12 @@ class AnimatedSprite : public MovingSprite {
void resetAnimation();
void animate(float delta_time);
// Helper de parsing exposat per a testabilitat. NO toca el cache de
// recursos — només el bloc `animations:` del YAML i els paràmetres de
// full ja calculats. El ctor d'`AnimatedSprite` el crida internament.
static auto parseAnimationsFromYaml(const fkyaml::node& yaml, const SheetParams& params)
-> std::unordered_map<std::string, AnimationData>;
private:
std::unordered_map<std::string, AnimationData> animations_;
// Nom de l'animació activa. Buit fins que algú crida `setCurrentAnimation`.