fix sprite animation for all sizes
This commit is contained in:
parent
ad1a178320
commit
9978e9eced
|
@ -44,11 +44,11 @@ private:
|
||||||
void updateVelocity();
|
void updateVelocity();
|
||||||
void updateAnimation();
|
void updateAnimation();
|
||||||
void syncVelocity();
|
void syncVelocity();
|
||||||
void syncAnimation();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const void *data;
|
const void *data;
|
||||||
int x, y, dx, dy;
|
int x, y, dx, dy;
|
||||||
|
u8 animation_offset;
|
||||||
u32 priority, w, h, size_bits, shape_bits;
|
u32 priority, w, h, size_bits, shape_bits;
|
||||||
bool stayWithinBounds;
|
bool stayWithinBounds;
|
||||||
u32 imageSize, tileIndex;
|
u32 imageSize, tileIndex;
|
||||||
|
@ -58,6 +58,7 @@ protected:
|
||||||
|
|
||||||
std::unique_ptr<OBJ_ATTR> oam;
|
std::unique_ptr<OBJ_ATTR> oam;
|
||||||
|
|
||||||
|
void syncAnimation();
|
||||||
virtual void syncOam();
|
virtual void syncOam();
|
||||||
virtual void buildOam(int tileIndex);
|
virtual void buildOam(int tileIndex);
|
||||||
void setAttributesBasedOnSize(SpriteSize size);
|
void setAttributesBasedOnSize(SpriteSize size);
|
||||||
|
|
|
@ -52,10 +52,7 @@ void Sprite::syncVelocity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sprite::syncAnimation() {
|
void Sprite::syncAnimation() {
|
||||||
int offset = w == 64 ? 2 : 1; // 64xY sprites don't seem to cut currFrame * w
|
int newTileIndex = this->tileIndex + (currentFrame * (this->animation_offset * 2));
|
||||||
int width = w == 16 ? 8 : w; // 16xY sprites: frame 192 -> 200 (x8) (skip last 2 bpps)
|
|
||||||
int newTileIndex = this->tileIndex + (currentFrame * width * offset);
|
|
||||||
|
|
||||||
oam->attr2 &= OAM_TILE_OFFSET_CLEAR;
|
oam->attr2 &= OAM_TILE_OFFSET_CLEAR;
|
||||||
oam->attr2 |= (newTileIndex & OAM_TILE_OFFSET_NEW);
|
oam->attr2 |= (newTileIndex & OAM_TILE_OFFSET_NEW);
|
||||||
}
|
}
|
||||||
|
@ -99,18 +96,18 @@ void Sprite::update() {
|
||||||
|
|
||||||
void Sprite::setAttributesBasedOnSize(SpriteSize size) {
|
void Sprite::setAttributesBasedOnSize(SpriteSize size) {
|
||||||
switch (size) {
|
switch (size) {
|
||||||
case SIZE_8_8: size_bits = 0; shape_bits = 0; w = 8; h = 8; break;
|
case SIZE_8_8: size_bits = 0; shape_bits = 0; w = 8; h = 8; animation_offset = 1; break;
|
||||||
case SIZE_16_16: size_bits = 1; shape_bits = 0; w = 16; h = 16; break;
|
case SIZE_16_16: size_bits = 1; shape_bits = 0; w = 16; h = 16; animation_offset = 4; break;
|
||||||
case SIZE_32_32: size_bits = 2; shape_bits = 0; w = 32; h = 32; break;
|
case SIZE_32_32: size_bits = 2; shape_bits = 0; w = 32; h = 32; animation_offset = 16; break;
|
||||||
case SIZE_64_64: size_bits = 3; shape_bits = 0; w = 64; h = 64; break;
|
case SIZE_64_64: size_bits = 3; shape_bits = 0; w = 64; h = 64; animation_offset = 64; break;
|
||||||
case SIZE_16_8: size_bits = 0; shape_bits = 1; w = 16; h = 8; break;
|
case SIZE_16_8: size_bits = 0; shape_bits = 1; w = 16; h = 8; animation_offset = 2; break;
|
||||||
case SIZE_32_8: size_bits = 1; shape_bits = 1; w = 32; h = 8; break;
|
case SIZE_32_8: size_bits = 1; shape_bits = 1; w = 32; h = 8; animation_offset = 4; break;
|
||||||
case SIZE_32_16: size_bits = 2; shape_bits = 1; w = 32; h = 16; break;
|
case SIZE_32_16: size_bits = 2; shape_bits = 1; w = 32; h = 16; animation_offset = 8; break;
|
||||||
case SIZE_64_32: size_bits = 3; shape_bits = 1; w = 64; h = 32; break;
|
case SIZE_64_32: size_bits = 3; shape_bits = 1; w = 64; h = 32; animation_offset = 32; break;
|
||||||
case SIZE_8_16: size_bits = 0; shape_bits = 2; w = 8; h = 16; break;
|
case SIZE_8_16: size_bits = 0; shape_bits = 2; w = 8; h = 16; animation_offset = 2; break;
|
||||||
case SIZE_8_32: size_bits = 1; shape_bits = 2; w = 8; h = 32; break;
|
case SIZE_8_32: size_bits = 1; shape_bits = 2; w = 8; h = 32; animation_offset = 4; break;
|
||||||
case SIZE_16_32: size_bits = 2; shape_bits = 2; w = 16; h = 32; break;
|
case SIZE_16_32: size_bits = 2; shape_bits = 2; w = 16; h = 32; animation_offset = 8; break;
|
||||||
case SIZE_32_64: size_bits = 3; shape_bits = 2; w = 32; h = 64; break;
|
case SIZE_32_64: size_bits = 3; shape_bits = 2; w = 32; h = 64; animation_offset = 32; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -181,12 +181,12 @@ const u32 kul_data [] = {
|
||||||
|
|
||||||
class SpriteWithStubOam : public Sprite {
|
class SpriteWithStubOam : public Sprite {
|
||||||
public:
|
public:
|
||||||
SpriteWithStubOam() : Sprite(nullptr, imageSize, x, y, SIZE_8_8) {
|
SpriteWithStubOam(SpriteSize size) : Sprite(nullptr, imageSize, x, y, size) {
|
||||||
oam = std::unique_ptr<OBJ_ATTR>(new OBJ_ATTR());
|
oam = std::unique_ptr<OBJ_ATTR>(new OBJ_ATTR());
|
||||||
}
|
}
|
||||||
|
|
||||||
OBJ_ATTR* buildOamForTesting() {
|
OBJ_ATTR* buildOamForTesting(int tileIndex = 0) {
|
||||||
buildOam(0);
|
buildOam(tileIndex);
|
||||||
return oam.get();
|
return oam.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,10 +201,21 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void SetUp() {
|
virtual void SetUp() {
|
||||||
s = new SpriteWithStubOam();
|
s = new SpriteWithStubOam(SIZE_8_8);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TEST_F(SpriteSuite, Sync_Animation_Updates_OAM_To_Next_Frame) {
|
||||||
|
s = new SpriteWithStubOam(SIZE_16_32);
|
||||||
|
s->makeAnimated(2, 0);
|
||||||
|
auto oam = s->buildOamForTesting(208); // should start at 224 (11100000) after a frame update
|
||||||
|
s->update();
|
||||||
|
|
||||||
|
auto attr2 = std::bitset<16>(oam->attr2).to_string();
|
||||||
|
|
||||||
|
ASSERT_EQ(std::string("0000000011100000"), attr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_F(SpriteSuite, Animated_Sprite_Increases_Current_Frame_After_Delay) {
|
TEST_F(SpriteSuite, Animated_Sprite_Increases_Current_Frame_After_Delay) {
|
||||||
s->makeAnimated(2, 5);
|
s->makeAnimated(2, 5);
|
||||||
|
|
Loading…
Reference in New Issue