summaryrefslogtreecommitdiff
path: root/src/simpleanimation.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-03-06 21:12:22 +0100
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-03-07 10:43:54 +0100
commitc74680473e702bacc009897a258387445d6f3eb5 (patch)
tree800cfb1f83f0c69ae8fcd0096949e660152a80b8 /src/simpleanimation.cpp
parentf9a522c72db959b5d63061ed255735d0230fc7de (diff)
downloadmana-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.cpp47
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();
}
}