From 4c980d8690e230e2cef1a27e6c25ea63dea5d26f Mon Sep 17 00:00:00 2001 From: herbglitch Date: Wed, 26 Mar 2025 18:26:02 -0600 Subject: [PATCH] added animation stuff to sprite --- include/arc/graphics/sprite.h | 19 +++++++++++++++++++ packages/graphics/sdl3/sprite.c | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/arc/graphics/sprite.h b/include/arc/graphics/sprite.h index f09e8b7..3f9f9e3 100644 --- a/include/arc/graphics/sprite.h +++ b/include/arc/graphics/sprite.h @@ -35,6 +35,9 @@ typedef struct ARC_Sprite { float opacity; ARC_SpriteAxix axis; + + float animationCurrentTime; + float animationTime; } ARC_Sprite; /** @@ -87,6 +90,14 @@ void ARC_Sprite_RenderAt(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_FPoint */ void ARC_Sprite_IterateFrame(ARC_Sprite *sprite); +/** + * @brief switches ARC_Sprite's frames to next for animation + * + * @param sprite ARC_Sprite that is being animated (having its frame updated based on delta time) + * @param deltatime the ammount of time elapsed in seconds (stored as a float where 1.0 is a second) since last animated +*/ +void ARC_Sprite_AnimateFrame(ARC_Sprite *sprite, float deltatime); + /** * @brief switches ARC_Sprite's frame to specified index * @@ -121,6 +132,14 @@ void ARC_Sprite_SetOrigin(ARC_Sprite *sprite, ARC_FPoint origin); */ void ARC_Sprite_SetOpacity(ARC_Sprite *sprite, float opacity); +/** + * @brief sets ARC_Sprite's framerate for + * + * @param sprite ARC_Sprite to change its frame rate + * @param rate the new framerate as a float in seconds (1.0 is one second) +*/ +void ARC_Sprite_SetFrameRate(ARC_Sprite *sprite, float rate); + /** * @brief gets ARC_Sprite's current frame * diff --git a/packages/graphics/sdl3/sprite.c b/packages/graphics/sdl3/sprite.c index 4c85687..397de3a 100644 --- a/packages/graphics/sdl3/sprite.c +++ b/packages/graphics/sdl3/sprite.c @@ -21,6 +21,9 @@ void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Ar ARC_Sprite_SetOpacity(*sprite, 1.0f); (*sprite)->axis = ARC_SPRITE_AXIS_NONE; + + (*sprite)->animationCurrentTime = 0.0f; + (*sprite)->animationTime = 1.0f / 24.0f; } void ARC_Sprite_Destroy(ARC_Sprite *sprite){ @@ -72,6 +75,15 @@ void ARC_Sprite_IterateFrame(ARC_Sprite *sprite){ } } +void ARC_Sprite_AnimateFrame(ARC_Sprite *sprite, float deltatime){ + sprite->animationCurrentTime += deltatime; + + if(sprite->animationCurrentTime >= sprite->animationTime){ + sprite->animationCurrentTime -= sprite->animationTime; + ARC_Sprite_IterateFrame(sprite); + } +} + void ARC_Sprite_SetFrameIndex(ARC_Sprite *sprite, uint32_t index){ if(sprite->frames.size <= index){ arc_errno = ARC_ERRNO_DATA; @@ -96,6 +108,11 @@ void ARC_Sprite_SetOpacity(ARC_Sprite *sprite, float opacity){ } } +void ARC_Sprite_SetFrameRate(ARC_Sprite *sprite, float rate){ + sprite->animationCurrentTime = 0; + sprite->animationTime = rate; +} + uint32_t ARC_Sprite_GetFrameIndex(ARC_Sprite *sprite){ return sprite->frameIndex; }