File AnimatedSprite.c
File List > Components > AnimatedSprite.c
Go to the documentation of this file
#include "AnimatedSprite.h"
#include "Entities.h"
#include "GameFramework.h"
#include "Game2DLayer.h"
#include "DynArray.h"
#include "Atlas.h"
#include "AssertLib.h"
#include "Game2DVertexOutputHelpers.h"
void AnimatedSprite_OnInit(struct AnimatedSprite* pAnimatedSprite, struct Entity2D* pEnt, struct GameFrameworkLayer* pLayer, float deltaT)
{
struct GameLayer2DData* pData = pLayer->userData;
if(!pAnimatedSprite->bDraw) return;
if(pAnimatedSprite->animationName)
{
struct AtlasAnimation* pAnim = At_FindAnim(pData->hAtlas, pAnimatedSprite->animationName);
pAnimatedSprite->numSprites = VectorSize(pAnim->frames);
pAnimatedSprite->pSprites = pAnim->frames;
pAnimatedSprite->fps = pAnim->fps;
}
//EASSERT(pAnim);
}
void AnimatedSprite_SetAnimation(struct GameFrameworkLayer* pLayer, struct AnimatedSprite* pSpriteComp, const char* animName, bool bResetOnFrame, bool bResetTimer)
{
struct GameLayer2DData* pData = pLayer->userData;
pSpriteComp->animationName = animName;
if(animName)
{
struct AtlasAnimation* pAnim = At_FindAnim(pData->hAtlas, pSpriteComp->animationName);
pSpriteComp->pSprites = pAnim->frames;
pSpriteComp->numSprites = VectorSize(pAnim->frames);
pSpriteComp->fps = pAnim->fps;
pSpriteComp->bDraw = true;
if(bResetOnFrame)
{
pSpriteComp->onSprite = 0;
}
if(bResetTimer)
{
pSpriteComp->timer = 0.0f;
}
}
else
{
pSpriteComp->bDraw = 0;
pSpriteComp->numSprites = 0;
pSpriteComp->fps = 0;
}
}
void AnimatedSprite_OnDestroy(struct Entity2D* pEnt)
{
}
void AnimatedSprite_OnUpdate(struct AnimatedSprite* pAnimatedSprite, struct Entity2D* pEnt, struct GameFrameworkLayer* pLayer, float deltaT)
{
if(pAnimatedSprite->bIsAnimating)
{
pAnimatedSprite->timer += deltaT;
if(pAnimatedSprite->timer >= 1.0f / pAnimatedSprite->fps)
{
pAnimatedSprite->onSprite++;
if(pAnimatedSprite->onSprite == pAnimatedSprite->numSprites)
{
if(pAnimatedSprite->bRepeat)
{
pAnimatedSprite->onSprite = 0;
}
else
{
pAnimatedSprite->onSprite = pAnimatedSprite->numSprites - 1;
pAnimatedSprite->bIsAnimating = false;
}
}
pAnimatedSprite->timer = 0.0f;
}
}
}
void AnimatedSprite_GetBoundingBox(struct Entity2D* pEnt, struct AnimatedSprite* pAnimatedSprite, struct GameFrameworkLayer* pLayer, vec2 outTL, vec2 outBR)
{
struct GameLayer2DData* pLayerData = pLayer->userData;
if(!pAnimatedSprite->bDraw) return;
AtlasSprite* pSprite = At_GetSprite(pAnimatedSprite->pSprites[pAnimatedSprite->onSprite], pLayerData->hAtlas);
vec2 tl = {pEnt->transform.position[0], pEnt->transform.position[1]};
vec2 br;
vec2 size = {
pSprite->widthPx * pEnt->transform.scale[0] * pAnimatedSprite->transform.scale[0],
pSprite->heightPx * pEnt->transform.scale[1] * pAnimatedSprite->transform.scale[1]
};
glm_vec2_add(pEnt->transform.position, size, br);
glm_vec2_add(tl, pAnimatedSprite->transform.position, tl);
glm_vec2_add(br, pAnimatedSprite->transform.position, br);
outTL[0] = tl[0];
outTL[1] = tl[1];
outBR[0] = br[0];
outBR[1] = br[1];
}
void AnimatedSprite_Draw(struct AnimatedSprite* pSpriteComp, struct Entity2D* pEnt, struct GameFrameworkLayer* pLayer, struct Transform2D* pCam, VECTOR(Worldspace2DVert)* outVerts, VECTOR(VertIndexT)* outIndices, VertIndexT* pNextIndex)
{
if(!pSpriteComp->bDraw)
return;
HSprite_DrawBase(pSpriteComp->pSprites[pSpriteComp->onSprite], &pSpriteComp->transform, pEnt, pLayer, outVerts, outIndices, pNextIndex);
}