diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index 0922d3d..6a18da5 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -73,17 +73,7 @@ public: explicit Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size); virtual ~Sprite() {} - void makeAnimated(int numberOfFrames, int animationDelay) { - this->numberOfFrames = numberOfFrames; - this->animationDelay = animationDelay; - animate(); - } - void makeAnimated(int beginFrame, int numberOfFrames, int animationDelay) { - setBeginFrame(beginFrame); - animateToFrame(beginFrame); - makeAnimated(numberOfFrames, animationDelay); - animate(); - } + void makeAnimated(int beginFrame, int numberOfFrames, int animationDelay); void setBeginFrame(int frame) { this->beginFrame = frame; } void animateToFrame(int frame) { this->currentFrame = frame; } void animate() { this->animating = true; } @@ -113,6 +103,8 @@ public: u32 getDy() { return dy; } u32 getWidth() { return w; } u32 getHeight() { return h; } + u32 getAnimationDelay() { return animationDelay; } + u32 getNumberOfFrames() { return numberOfFrames; } u32 getCurrentFrame() { return currentFrame; } bool isAnimating() { return animating; }; bool isOffScreen(); diff --git a/engine/include/libgba-sprite-engine/sprites/sprite_builder.h b/engine/include/libgba-sprite-engine/sprites/sprite_builder.h index 303f414..84246c8 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite_builder.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite_builder.h @@ -80,11 +80,7 @@ template std::unique_ptr SpriteBuilder::buildWithDataOf(const template void SpriteBuilder::setProperties(T* s) { s->setVelocity(this->dx, this->dy); if(this->numberOfFrames > 0) { - if(this->beginFrame > 0) { - s->makeAnimated(this->beginFrame, this->numberOfFrames, this->animationDelay); - } else { - s->makeAnimated(this->numberOfFrames, this->animationDelay); - } + s->makeAnimated(this->beginFrame, this->numberOfFrames, this->animationDelay); } s->setStayWithinBounds(stayWithinBounds); diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index 3bd6262..80e1a6d 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -10,6 +10,10 @@ Sprite::Sprite(const Sprite &other) : Sprite(nullptr, 0, other.x, other.y, other.spriteSize) { tileIndex = other.tileIndex; + animationDelay = other.animationDelay; + numberOfFrames = other.numberOfFrames; + currentFrame = other.currentFrame; + animationCounter = other.animationCounter; } Sprite::Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size) @@ -55,6 +59,14 @@ void Sprite::syncVelocity() { oam->attr1 = (oam->attr1 & ~ATTR1_X_MASK) | (x & ATTR1_X_MASK); } +void Sprite::makeAnimated(int beginFrame, int numberOfFrames, int animationDelay) { + setBeginFrame(beginFrame); + animateToFrame(beginFrame); + this->numberOfFrames = numberOfFrames; + this->animationDelay = animationDelay; + animate(); +} + void Sprite::syncAnimation() { int newTileIndex = this->tileIndex + (currentFrame * (this->animation_offset * 2)); oam->attr2 &= OAM_TILE_OFFSET_CLEAR; diff --git a/test/spritetest.cpp b/test/spritetest.cpp index dea7d2d..ee7f26e 100644 --- a/test/spritetest.cpp +++ b/test/spritetest.cpp @@ -207,7 +207,7 @@ protected: TEST_F(SpriteSuite, Sync_Animation_Updates_OAM_To_Next_Frame) { s = new SpriteWithStubOam(SIZE_16_32); - s->makeAnimated(2, 0); + s->makeAnimated(0, 2, 0); auto oam = s->buildOamForTesting(208); // should start at 224 (11100000) after a frame update s->update(); @@ -216,9 +216,18 @@ TEST_F(SpriteSuite, Sync_Animation_Updates_OAM_To_Next_Frame) { ASSERT_EQ(std::string("0000000011100000"), attr2); } +TEST_F(SpriteSuite, Animated_Sprite_Copy_In_Constructor_Takes_Over_Animation_Properties) { + s->makeAnimated(0, 2, 5); + + Sprite copy(*s); + + ASSERT_EQ(0, copy.getCurrentFrame()); + ASSERT_EQ(5, copy.getAnimationDelay()); + ASSERT_EQ(2, copy.getNumberOfFrames()); +} TEST_F(SpriteSuite, Animated_Sprite_Increases_Current_Frame_After_Delay) { - s->makeAnimated(2, 5); + s->makeAnimated(0, 2, 5); ASSERT_EQ(0, s->getCurrentFrame()); s->update(); // 1 times @@ -232,7 +241,7 @@ TEST_F(SpriteSuite, Animated_Sprite_Increases_Current_Frame_After_Delay) { } TEST_F(SpriteSuite, Animated_Sprite_Resets_Current_Frame_After_Hitting_Max) { - s->makeAnimated(2, 0); + s->makeAnimated(0, 2, 0); s->update(); ASSERT_EQ(1, s->getCurrentFrame()); s->update();