diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-03-06 21:12:22 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-03-07 10:43:54 +0100 |
commit | c74680473e702bacc009897a258387445d6f3eb5 (patch) | |
tree | 800cfb1f83f0c69ae8fcd0096949e660152a80b8 /src/simpleanimation.cpp | |
parent | f9a522c72db959b5d63061ed255735d0230fc7de (diff) | |
download | mana-c74680473e702bacc009897a258387445d6f3eb5.tar.gz mana-c74680473e702bacc009897a258387445d6f3eb5.tar.bz2 mana-c74680473e702bacc009897a258387445d6f3eb5.tar.xz mana-c74680473e702bacc009897a258387445d6f3eb5.zip |
Use the native TMX tile animation format
Rewrote the tile animation loading code based on XML tags, replacing
the code that loaded tile animations from tile properties.
Also made a number of code simplifications and optimizations:
* Replaced a number of pointer members with value members.
* Pass around Animation and TileAnimation by value, using std::move to
avoid allocating copies.
* push -> emplace
* push_front -> emplace_front
* push_back -> emplace_back
* Use range-based for loops
* Use std::vector instead of std::list for storing affected tiles
(less fragmentation)
* Avoid string copies and allocations while parsing CSV layer data.
* Replaced xmlNodeGetContent with directly accessing 'content'.
Diffstat (limited to 'src/simpleanimation.cpp')
-rw-r--r-- | src/simpleanimation.cpp | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/src/simpleanimation.cpp b/src/simpleanimation.cpp index 72045ca9..8496f3b1 100644 --- a/src/simpleanimation.cpp +++ b/src/simpleanimation.cpp @@ -31,29 +31,18 @@ #include "resources/imageset.h" #include "resources/resourcemanager.h" -SimpleAnimation::SimpleAnimation(Animation *animation): - mAnimation(animation), - mAnimationTime(0), - mAnimationPhase(0), - mCurrentFrame(mAnimation->getFrame(0)), +SimpleAnimation::SimpleAnimation(Animation animation): + mAnimation(std::move(animation)), + mCurrentFrame(mAnimation.getFrame(0)), mInitialized(true) { } SimpleAnimation::SimpleAnimation(xmlNodePtr animationNode, - const std::string& dyePalettes): - mAnimation(new Animation), - mAnimationTime(0), - mAnimationPhase(0), - mInitialized(false) + const std::string &dyePalettes) { initializeAnimation(animationNode, dyePalettes); - mCurrentFrame = mAnimation->getFrame(0); -} - -SimpleAnimation::~SimpleAnimation() -{ - delete mAnimation; + mCurrentFrame = mAnimation.getFrame(0); } bool SimpleAnimation::draw(Graphics *graphics, int posX, int posY) const @@ -76,10 +65,10 @@ void SimpleAnimation::setFrame(int frame) { if (frame < 0) frame = 0; - if (frame >= mAnimation->getLength()) - frame = mAnimation->getLength() - 1; + if (frame >= mAnimation.getLength()) + frame = mAnimation.getLength() - 1; mAnimationPhase = frame; - mCurrentFrame = mAnimation->getFrame(mAnimationPhase); + mCurrentFrame = mAnimation.getFrame(mAnimationPhase); } void SimpleAnimation::update(int timePassed) @@ -93,35 +82,29 @@ void SimpleAnimation::update(int timePassed) mAnimationTime -= mCurrentFrame->delay; mAnimationPhase++; - if (mAnimationPhase >= mAnimation->getLength()) + if (mAnimationPhase >= mAnimation.getLength()) mAnimationPhase = 0; - mCurrentFrame = mAnimation->getFrame(mAnimationPhase); + mCurrentFrame = mAnimation.getFrame(mAnimationPhase); } } } int SimpleAnimation::getLength() const { - if (mAnimation) - return mAnimation->getLength(); - else - return 0; + return mAnimation.getLength(); } Image *SimpleAnimation::getCurrentImage() const { if (mCurrentFrame) return mCurrentFrame->image; - else - return nullptr; + return nullptr; } void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode, const std::string& dyePalettes) { - mInitialized = false; - if (!animationNode) return; @@ -174,7 +157,7 @@ void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode, continue; } - mAnimation->addFrame(img, delay, offsetX, offsetY); + mAnimation.addFrame(img, delay, offsetX, offsetY); } else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { @@ -197,13 +180,13 @@ void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode, continue; } - mAnimation->addFrame(img, delay, offsetX, offsetY); + mAnimation.addFrame(img, delay, offsetX, offsetY); start++; } } else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { - mAnimation->addTerminator(); + mAnimation.addTerminator(); } } |