diff options
Diffstat (limited to 'source/Sprite.cpp')
-rw-r--r-- | source/Sprite.cpp | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/source/Sprite.cpp b/source/Sprite.cpp index 876b75a..6cff1d3 100644 --- a/source/Sprite.cpp +++ b/source/Sprite.cpp @@ -5,6 +5,7 @@ #include "EditorUtils.hpp" #include "Image.hpp" #include "RapidJsonHelper.hpp" +#include "Rect.hpp" #include <imgui.h> #include <misc/cpp/imgui_stdlib.h> @@ -13,7 +14,7 @@ using namespace std::literals; -bool Sprite::IsValid() const { +bool SpriteDefinition::IsValid() const { return mAtlas != nullptr; } @@ -21,7 +22,7 @@ bool IresSpriteFiles::IsValid() const { return !spriteFiles.empty(); } -Sprite* IresSpriteFiles::CreateInstance() const { +SpriteDefinition* IresSpriteFiles::CreateInstance() const { if (IsValid()) { return nullptr; } @@ -42,7 +43,7 @@ Sprite* IresSpriteFiles::CreateInstance() const { return nullptr; } - auto sprite = std::make_unique<Sprite>(); + auto sprite = std::make_unique<SpriteDefinition>(); sprite->mAtlas.Attach(atlas.release()); sprite->mBoundingBox = atlasOut.elements[0].subregionSize; sprite->mFrames.reserve(atlasOut.elements.size()); @@ -58,7 +59,7 @@ Sprite* IresSpriteFiles::CreateInstance() const { return sprite.release(); } -Sprite* IresSpriteFiles::GetInstance() { +SpriteDefinition* IresSpriteFiles::GetInstance() { if (mInstance == nullptr) { mInstance.Attach(CreateInstance()); } @@ -91,11 +92,11 @@ bool IresSpritesheet::IsValid() const { sheetHSplit != 0; } -void IresSpritesheet::ResplitSpritesheet(Sprite* sprite, const IresSpritesheet* conf) { +void IresSpritesheet::ResplitSpritesheet(SpriteDefinition* sprite, const IresSpritesheet* conf) { ResplitSpritesheet(sprite, conf->sheetWSplit, conf->sheetHSplit, conf->frameCountOverride); } -void IresSpritesheet::ResplitSpritesheet(Sprite* sprite, int wSplit, int hSplit, int frameCount) { +void IresSpritesheet::ResplitSpritesheet(SpriteDefinition* sprite, int wSplit, int hSplit, int frameCount) { auto atlas = sprite->GetAtlas(); auto size = atlas->GetInfo().size; int frameWidth = size.x / wSplit; @@ -131,26 +132,26 @@ void IresSpritesheet::ResplitSpritesheet(Sprite* sprite, int wSplit, int hSplit, } } -Sprite* IresSpritesheet::CreateInstance() const { +SpriteDefinition* IresSpritesheet::CreateInstance() const { if (!IsValid()) { return nullptr; } char path[256]; - snprintf(path, sizeof(path), "%s/Ires/%s", AppConfig::assetDir.c_str(), spritesheetFile.c_str()); + snprintf(path, sizeof(path), "%s/%s", AppConfig::assetDir.c_str(), spritesheetFile.c_str()); auto atlas = std::make_unique<Texture>(); if (atlas->InitFromFile(path) != Texture::EC_Success) { return nullptr; } - auto sprite = std::make_unique<Sprite>(); + auto sprite = std::make_unique<SpriteDefinition>(); sprite->mAtlas.Attach(atlas.release()); ResplitSpritesheet(sprite.get(), this); return sprite.release(); } -Sprite* IresSpritesheet::GetInstance() { +SpriteDefinition* IresSpritesheet::GetInstance() { if (mInstance == nullptr) { mInstance.Attach(CreateInstance()); } @@ -281,18 +282,46 @@ void IresSpritesheet::Read(IresLoadingContext& ctx, const rapidjson::Value& valu BRUSSEL_JSON_GET_DEFAULT(value, "FrameCount", int, frameCountOverride, 0); } -SpriteMesh::SpriteMesh(Sprite* sprite) - : mSprite(sprite) { +Sprite::Sprite() + : mDefinition(nullptr) { } -void SpriteMesh::SetFrame(int frame) { - // TODO +bool Sprite::IsValid() const { + return mDefinition != nullptr; } -void SpriteMesh::PlayFrame() { - // TODO +void Sprite::SetDefinition(SpriteDefinition* definition) { + mDefinition.Attach(definition); + mCurrentFrame = 0; +} + +int Sprite::GetFrame() const { + return mCurrentFrame; +} + +const Subregion& Sprite::GetFrameSubregion() const { + return mDefinition->GetFrames()[mCurrentFrame]; +} + +void Sprite::SetFrame(int frame) { + mCurrentFrame = frame; +} + +void Sprite::PlayFrame() { + ++mTimeElapsed; + if (mTimeElapsed >= mPlaybackSpeed) { + mTimeElapsed -= mPlaybackSpeed; + + int frameCount = mDefinition->GetFrames().size(); + int nextFrame = (mCurrentFrame + 1) % frameCount; + SetFrame(nextFrame); + } +} + +int Sprite::GetPlaybackSpeed() const { + return mPlaybackSpeed; } -void SpriteMesh::SetPlaybackSpeed(int speed) { +void Sprite::SetPlaybackSpeed(int speed) { // TODO } |