diff --git a/include/arc/graphics/sdl/sprite.h b/include/arc/graphics/sdl/sprite.h index 6576219..97d435f 100644 --- a/include/arc/graphics/sdl/sprite.h +++ b/include/arc/graphics/sdl/sprite.h @@ -8,8 +8,7 @@ struct ARC_Sprite { ARC_Spritesheet *spritesheet; - ARC_Rect *frames; - uint32_t *frameSize; + ARC_Array *frames; uint32_t *frameIndex; }; diff --git a/include/arc/graphics/sprite.h b/include/arc/graphics/sprite.h index 40f43c2..f1ec2ea 100644 --- a/include/arc/graphics/sprite.h +++ b/include/arc/graphics/sprite.h @@ -10,18 +10,58 @@ extern "C" { #include "arc/math/rectangle.h" #include "arc/std/array.h" +/** + * @brief a sprite type + * + * @note the actual type should be define by overriding for a graphics api + */ typedef struct ARC_Sprite ARC_Sprite; -void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Rect *bounds); +/** + * @brief creates ARC_Sprite type + * + * @param sprite ARC_Sprite that is being created + * @param spritesheet ARC_Spritesheet that ARC_Sprite will be pulled from + * @param bounds ARC_Array of bounds of sprite on spritesheet + */ +void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Array *bounds); +/** + * @brief destroys ARC_Sprite type + * + * @param sprite ARC_Sprite to destroy + */ void ARC_Sprite_Destroy(ARC_Sprite *sprite); +/** + * @brief copies ARC_Sprite to a new ARC_Sprite + * + * @param newSprite ARC_Sprite that is being copied to and created + * @param oldSprite ARC_Sprite contents that are being copied + */ +void ARC_Sprite_Copy(ARC_Sprite **newSprite, ARC_Sprite *oldSprite); + +/** + * @brief renders ARC_Sprite type + * + * @param sprite ARC_Sprite that will be rendered + * @param renderer ARC_Renderer that is handling rendering + * @param renderBounds area of renderer that ARC_Sprite will be rendered to + */ void ARC_Sprite_Render(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect *renderBounds); +/** + * @brief switches ARC_Sprite's frames to next for animation + * + * @param sprite ARC_Sprite that is having its frame updated + */ void ARC_Sprite_IterateFrame(ARC_Sprite *sprite); -void ARC_Sprite_SetFrames(ARC_Sprite *sprite, ARC_Array *frames); - +/** + * @brief returns the current bounds based on the ARC_Sprite's frames + * + * @param sprite ARC_Sprite to get bounds from + */ ARC_Rect *ARC_Sprite_GetBounds(ARC_Sprite *sprite); #ifdef __cplusplus diff --git a/src/graphics/sdl/config.c b/src/graphics/sdl/config.c index d78d234..bdf825f 100644 --- a/src/graphics/sdl/config.c +++ b/src/graphics/sdl/config.c @@ -332,8 +332,7 @@ int32_t ARC_Sprite_Read(ARC_Config* config, const char *data, ARC_StringSubstr * ((ARC_Sprite *) *value)->frameIndex = malloc(sizeof(uint32_t)); ((ARC_Sprite *) *value)->spritesheet = spritesheet; - ((ARC_Sprite *) *value)->frames = bounds->data; - ((ARC_Sprite *) *value)->frameSize = bounds->size; + ((ARC_Sprite *) *value)->frames = bounds; *((ARC_Sprite *) *value)->frameIndex = 0; ARC_Rect *ttt = (ARC_Rect *)bounds->data; @@ -436,7 +435,6 @@ int32_t ARC_Sprite_Delete(ARC_Config* config, const char* data, ARC_StringSubstr if(!bounds){ free(sprite->frames); - free(sprite->frameSize); } free(sprite->frameIndex); diff --git a/src/graphics/sdl/sprite.c b/src/graphics/sdl/sprite.c index 8e15b7b..0e40feb 100644 --- a/src/graphics/sdl/sprite.c +++ b/src/graphics/sdl/sprite.c @@ -6,7 +6,7 @@ #include "arc/math/rectangle.h" #include -void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Rect *frames){ +void ARC_Sprite_Create(ARC_Sprite **sprite, ARC_Spritesheet *spritesheet, ARC_Array *frames){ *sprite = (ARC_Sprite *)malloc(sizeof(ARC_Sprite)); (*sprite)->spritesheet = spritesheet; (*sprite)->frames = frames; @@ -18,26 +18,29 @@ void ARC_Sprite_Destroy(ARC_Sprite *sprite){ free(sprite); } +void ARC_Sprite_Copy(ARC_Sprite **newSprite, ARC_Sprite *oldSprite){ + *newSprite = (ARC_Sprite *)malloc(sizeof(ARC_Sprite)); + (*newSprite)->spritesheet = oldSprite->spritesheet; + (*newSprite)->frames = oldSprite->frames; + (*newSprite)->frameIndex = (uint32_t *)malloc(sizeof(uint32_t)); + *(*newSprite)->frameIndex = *oldSprite->frameIndex; +} + void ARC_Sprite_Render(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect *renderBounds){ - ARC_Rect *temp = &sprite->frames[*sprite->frameIndex]; - SDL_RenderCopy(renderer->renderer, sprite->spritesheet->texture, (SDL_Rect *)&sprite->frames[*sprite->frameIndex], (SDL_Rect *)renderBounds); + ARC_Rect *temp = (ARC_Rect *)sprite->frames->data + *sprite->frameIndex; + SDL_RenderCopy(renderer->renderer, sprite->spritesheet->texture, (SDL_Rect *)sprite->frames->data + *sprite->frameIndex, (SDL_Rect *)renderBounds); } void ARC_Sprite_IterateFrame(ARC_Sprite *sprite){ ++*sprite->frameIndex; - if(*sprite->frameIndex == *sprite->frameSize){ + if(*sprite->frameIndex == *sprite->frames->size){ *sprite->frameIndex = 0; } } -void ARC_Sprite_SetFrames(ARC_Sprite *sprite, ARC_Array *frames){ - sprite->frames = frames->data; - *sprite->frameIndex = 0; -} - ARC_Rect *ARC_Sprite_GetBounds(ARC_Sprite *sprite){ - return sprite->frames + *sprite->frameIndex; + return (ARC_Rect *)sprite->frames->data + *sprite->frameIndex; } #endif // ARC_SDL \ No newline at end of file