From c2039cf254428acfc1c7ba76aa928c4d4c73fab2 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Wed, 31 Jul 2019 17:13:25 +0200 Subject: [PATCH 1/6] Ignore .vscode --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 83642da..20b435c 100644 --- a/.gitignore +++ b/.gitignore @@ -122,3 +122,6 @@ CTestTestfile.cmake *.exe *.out *.app + +#VisualStudio code +.vscode From 66892f846ae9d1dbe98af942398f355fd0c36679 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Wed, 31 Jul 2019 17:44:56 +0200 Subject: [PATCH 2/6] Add option to define beginFrame Used function overloading for backwards compatibility Also add a getter to check if the sprite is animating (because protected) --- engine/include/libgba-sprite-engine/sprites/sprite.h | 10 +++++++++- engine/src/sprites/sprite.cpp | 9 ++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index 1433fb5..a55d511 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -58,7 +58,7 @@ protected: bool stayWithinBounds; u32 imageSize, tileIndex; SpriteSize spriteSize; - u32 animationDelay, amountOfFrames, currentFrame, animationCounter; + u32 animationDelay, amountOfFrames, beginFrame, currentFrame, animationCounter; bool animating; std::unique_ptr oam; @@ -78,6 +78,13 @@ public: this->animationDelay = animationDelay; animate(); } + void makeAnimated(int beginFrame, int amountOfFrames, int animationDelay) { + this->amountOfFrames = amountOfFrames; + this->animationDelay = animationDelay; + this->beginFrame = beginFrame; + this->currentFrame = beginFrame; + animate(); + } void animate() { this->animating = true; } void animateToFrame(int frame) { this->currentFrame = frame; } void stopAnimating() { this->animating = false; } @@ -107,6 +114,7 @@ public: u32 getWidth() { return w; } u32 getY() { return y; } u32 getCurrentFrame() { return currentFrame; } + bool isAnimating() { return animating; }; bool isOffScreen(); friend class SpriteManager; diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index cdb0763..243df73 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -14,7 +14,7 @@ Sprite::Sprite(const Sprite &other) : Sprite(nullptr, 0, other.x, other.y, other Sprite::Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size) : x(x), y(y), data(imageData), imageSize(imageSize), spriteSize(size), - animationDelay(0), amountOfFrames(0), currentFrame(0), animationCounter(0) { + animationDelay(0), amountOfFrames(0), beginFrame(0), currentFrame(0), animationCounter(0) { setAttributesBasedOnSize(size); } @@ -86,8 +86,11 @@ void Sprite::updateAnimation() { animationCounter++; if(animationCounter > animationDelay) { currentFrame++; - if(currentFrame > (amountOfFrames - 1)) { - currentFrame = 0; + if(currentFrame > (amountOfFrames - 1) + beginFrame) { + currentFrame = beginFrame; + } + if(currentFrame < beginFrame) { + currentFrame = beginFrame; } animationCounter = 0; From 619916b025fb31dafdf28d6bcfe0fb92f4f8a5c9 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Wed, 31 Jul 2019 17:46:24 +0200 Subject: [PATCH 3/6] Use correct grammar Number of frames is countable (also in line with sprite_builder now) --- engine/include/libgba-sprite-engine/sprites/sprite.h | 10 +++++----- engine/src/sprites/sprite.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index a55d511..ca2be27 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -58,7 +58,7 @@ protected: bool stayWithinBounds; u32 imageSize, tileIndex; SpriteSize spriteSize; - u32 animationDelay, amountOfFrames, beginFrame, currentFrame, animationCounter; + u32 animationDelay, numberOfFrames, beginFrame, currentFrame, animationCounter; bool animating; std::unique_ptr oam; @@ -73,13 +73,13 @@ public: explicit Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size); virtual ~Sprite() {} - void makeAnimated(int amountOfFrames, int animationDelay) { - this->amountOfFrames = amountOfFrames; + void makeAnimated(int numberOfFrames, int animationDelay) { + this->numberOfFrames = numberOfFrames; this->animationDelay = animationDelay; animate(); } - void makeAnimated(int beginFrame, int amountOfFrames, int animationDelay) { - this->amountOfFrames = amountOfFrames; + void makeAnimated(int beginFrame, int numberOfFrames, int animationDelay) { + this->numberOfFrames = numberOfFrames; this->animationDelay = animationDelay; this->beginFrame = beginFrame; this->currentFrame = beginFrame; diff --git a/engine/src/sprites/sprite.cpp b/engine/src/sprites/sprite.cpp index 243df73..7eb9b4e 100644 --- a/engine/src/sprites/sprite.cpp +++ b/engine/src/sprites/sprite.cpp @@ -14,7 +14,7 @@ Sprite::Sprite(const Sprite &other) : Sprite(nullptr, 0, other.x, other.y, other Sprite::Sprite(const void *imageData, int imageSize, int x, int y, SpriteSize size) : x(x), y(y), data(imageData), imageSize(imageSize), spriteSize(size), - animationDelay(0), amountOfFrames(0), beginFrame(0), currentFrame(0), animationCounter(0) { + animationDelay(0), numberOfFrames(0), beginFrame(0), currentFrame(0), animationCounter(0) { setAttributesBasedOnSize(size); } @@ -86,7 +86,7 @@ void Sprite::updateAnimation() { animationCounter++; if(animationCounter > animationDelay) { currentFrame++; - if(currentFrame > (amountOfFrames - 1) + beginFrame) { + if(currentFrame > (numberOfFrames - 1) + beginFrame) { currentFrame = beginFrame; } if(currentFrame < beginFrame) { From 454c5f7db785065a28e0a29ee1c6b760d7eb7ac1 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Wed, 31 Jul 2019 17:54:23 +0200 Subject: [PATCH 4/6] Not sure if all this is needed --- .../libgba-sprite-engine/sprites/sprite.h | 6 +++--- .../sprites/sprite_builder.h | 21 ++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index ca2be27..5a80c28 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -107,12 +107,12 @@ public: GBAVector getPosAsVector() { return GBAVector(getPos()); } VECTOR getCenter() { return { x + w / 2, y + h / 2 }; } VECTOR getVelocity() { return { dx, dy}; } + u32 getX() { return x; } + u32 getY() { return y; } u32 getDx() { return dx; } u32 getDy() { return dy; } - u32 getX() { return x; } - u32 getHeight() { return h; } u32 getWidth() { return w; } - u32 getY() { return y; } + u32 getHeight() { return h; } 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 5712514..303f414 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite_builder.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite_builder.h @@ -13,12 +13,12 @@ private: bool stayWithinBounds = false; const void *imageData; u32 x, y, dx, dy; - u32 numberOfFrames, animationDelay; + u32 beginFrame, numberOfFrames, animationDelay; SpriteSize size; void setProperties(T* sprite); void reset() { - imageSize = x = y = dx = dy = numberOfFrames = animationDelay = 0; + imageSize = x = y = dx = dy = beginFrame = numberOfFrames = animationDelay = 0; imageData = nullptr; stayWithinBounds = false; size = SIZE_16_16; @@ -51,9 +51,16 @@ public: this->size = size; return *this; } - SpriteBuilder& withAnimated(int numberOfFrames, int delay) { + SpriteBuilder& withAnimated(int numberOfFrames, int animationDelay) { + this->beginFrame = 0; this->numberOfFrames = numberOfFrames; - this->animationDelay = delay; + this->animationDelay = animationDelay; + return *this; + } + SpriteBuilder& withAnimated(int beginFrame, int numberOfFrames, int animationDelay) { + this->beginFrame = beginFrame; + this->numberOfFrames = numberOfFrames; + this->animationDelay = animationDelay; return *this; } T build(); @@ -73,7 +80,11 @@ template std::unique_ptr SpriteBuilder::buildWithDataOf(const template void SpriteBuilder::setProperties(T* s) { s->setVelocity(this->dx, this->dy); if(this->numberOfFrames > 0) { - s->makeAnimated(this->numberOfFrames, this->animationDelay); + if(this->beginFrame > 0) { + s->makeAnimated(this->beginFrame, this->numberOfFrames, this->animationDelay); + } else { + s->makeAnimated(this->numberOfFrames, this->animationDelay); + } } s->setStayWithinBounds(stayWithinBounds); From f353c89172495f0916431c365260f45584b3b6ec Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Wed, 31 Jul 2019 18:15:03 +0200 Subject: [PATCH 5/6] Add relative scroll to backgrounds --- engine/include/libgba-sprite-engine/background/background.h | 3 ++- engine/src/background/background.cpp | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/engine/include/libgba-sprite-engine/background/background.h b/engine/include/libgba-sprite-engine/background/background.h index f55ae01..efcfcf1 100644 --- a/engine/include/libgba-sprite-engine/background/background.h +++ b/engine/include/libgba-sprite-engine/background/background.h @@ -25,9 +25,10 @@ public: const int getCharBlock() { return charBlockIndex; } void useMapScreenBlock(int block) { screenBlockIndex = block; } void scroll(int x, int y); + void scrollSpeed(int dx, int dy); Background(int bgIndex, const void *data, int size, const void* map, int mapSize) : data(data), bgIndex(bgIndex), size(size), map(map), - screenBlockIndex(0), charBlockIndex(0), mapSize(mapSize) {} + screenBlockIndex(0), charBlockIndex(0), mapSize(mapSize) {} virtual void persist(); void updateMap(const void* map); void clearMap(); diff --git a/engine/src/background/background.cpp b/engine/src/background/background.cpp index f5121c5..3191005 100644 --- a/engine/src/background/background.cpp +++ b/engine/src/background/background.cpp @@ -78,4 +78,9 @@ void Background::buildRegister() { void Background::scroll(int x, int y) { REG_BG_OFS[bgIndex].x = x; REG_BG_OFS[bgIndex].y = y; +} + +void Background::scrollSpeed(int dx, int dy) { + REG_BG_OFS[bgIndex].x += dx; + REG_BG_OFS[bgIndex].y += dy; } \ No newline at end of file From e96cbc97b40ebd5982eb12331fca627a783017b8 Mon Sep 17 00:00:00 2001 From: Jorim Tielemans Date: Thu, 1 Aug 2019 23:01:03 +0200 Subject: [PATCH 6/6] New function to only change beginFrame --- engine/include/libgba-sprite-engine/sprites/sprite.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/include/libgba-sprite-engine/sprites/sprite.h b/engine/include/libgba-sprite-engine/sprites/sprite.h index 5a80c28..0922d3d 100644 --- a/engine/include/libgba-sprite-engine/sprites/sprite.h +++ b/engine/include/libgba-sprite-engine/sprites/sprite.h @@ -79,14 +79,14 @@ public: animate(); } void makeAnimated(int beginFrame, int numberOfFrames, int animationDelay) { - this->numberOfFrames = numberOfFrames; - this->animationDelay = animationDelay; - this->beginFrame = beginFrame; - this->currentFrame = beginFrame; + setBeginFrame(beginFrame); + animateToFrame(beginFrame); + makeAnimated(numberOfFrames, animationDelay); animate(); } - void animate() { this->animating = true; } + void setBeginFrame(int frame) { this->beginFrame = frame; } void animateToFrame(int frame) { this->currentFrame = frame; } + void animate() { this->animating = true; } void stopAnimating() { this->animating = false; } void setStayWithinBounds(bool b) { stayWithinBounds = b; } void setVelocity(int dx, int dy) {