sprite documentation added as well as copy function

This commit is contained in:
herbglitch 2023-01-02 19:59:26 -07:00
parent f337113932
commit 8d5190e405
4 changed files with 58 additions and 18 deletions

View file

@ -8,8 +8,7 @@
struct ARC_Sprite { struct ARC_Sprite {
ARC_Spritesheet *spritesheet; ARC_Spritesheet *spritesheet;
ARC_Rect *frames; ARC_Array *frames;
uint32_t *frameSize;
uint32_t *frameIndex; uint32_t *frameIndex;
}; };

View file

@ -10,18 +10,58 @@ extern "C" {
#include "arc/math/rectangle.h" #include "arc/math/rectangle.h"
#include "arc/std/array.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; 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); 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); 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_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); ARC_Rect *ARC_Sprite_GetBounds(ARC_Sprite *sprite);
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -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)->frameIndex = malloc(sizeof(uint32_t));
((ARC_Sprite *) *value)->spritesheet = spritesheet; ((ARC_Sprite *) *value)->spritesheet = spritesheet;
((ARC_Sprite *) *value)->frames = bounds->data; ((ARC_Sprite *) *value)->frames = bounds;
((ARC_Sprite *) *value)->frameSize = bounds->size;
*((ARC_Sprite *) *value)->frameIndex = 0; *((ARC_Sprite *) *value)->frameIndex = 0;
ARC_Rect *ttt = (ARC_Rect *)bounds->data; 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){ if(!bounds){
free(sprite->frames); free(sprite->frames);
free(sprite->frameSize);
} }
free(sprite->frameIndex); free(sprite->frameIndex);

View file

@ -6,7 +6,7 @@
#include "arc/math/rectangle.h" #include "arc/math/rectangle.h"
#include <stdlib.h> #include <stdlib.h>
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 = (ARC_Sprite *)malloc(sizeof(ARC_Sprite));
(*sprite)->spritesheet = spritesheet; (*sprite)->spritesheet = spritesheet;
(*sprite)->frames = frames; (*sprite)->frames = frames;
@ -18,26 +18,29 @@ void ARC_Sprite_Destroy(ARC_Sprite *sprite){
free(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){ void ARC_Sprite_Render(ARC_Sprite *sprite, ARC_Renderer *renderer, ARC_Rect *renderBounds){
ARC_Rect *temp = &sprite->frames[*sprite->frameIndex]; ARC_Rect *temp = (ARC_Rect *)sprite->frames->data + *sprite->frameIndex;
SDL_RenderCopy(renderer->renderer, sprite->spritesheet->texture, (SDL_Rect *)&sprite->frames[*sprite->frameIndex], (SDL_Rect *)renderBounds); SDL_RenderCopy(renderer->renderer, sprite->spritesheet->texture, (SDL_Rect *)sprite->frames->data + *sprite->frameIndex, (SDL_Rect *)renderBounds);
} }
void ARC_Sprite_IterateFrame(ARC_Sprite *sprite){ void ARC_Sprite_IterateFrame(ARC_Sprite *sprite){
++*sprite->frameIndex; ++*sprite->frameIndex;
if(*sprite->frameIndex == *sprite->frameSize){ if(*sprite->frameIndex == *sprite->frames->size){
*sprite->frameIndex = 0; *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){ ARC_Rect *ARC_Sprite_GetBounds(ARC_Sprite *sprite){
return sprite->frames + *sprite->frameIndex; return (ARC_Rect *)sprite->frames->data + *sprite->frameIndex;
} }
#endif // ARC_SDL #endif // ARC_SDL