summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2011-06-22 18:18:39 +0200
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2011-06-23 04:17:28 +0200
commita3e5eadaa503e16a4e02af40f1d36a2bb0b5c243 (patch)
tree49d94fee1286d5c8c5dc01fdf22e7b3dda4338a9
parentba5b70974c5dfa0be3105e72a0a012455b28e7a9 (diff)
downloadmana-a3e5eadaa503e16a4e02af40f1d36a2bb0b5c243.tar.gz
mana-a3e5eadaa503e16a4e02af40f1d36a2bb0b5c243.tar.bz2
mana-a3e5eadaa503e16a4e02af40f1d36a2bb0b5c243.tar.xz
mana-a3e5eadaa503e16a4e02af40f1d36a2bb0b5c243.zip
Made the being death sequence better handled.
Now the death animation is set to the minimum of 1.5 seconds just as in the older versions, but permit longer sequences as well. I didn't put a maximum hard cap on it as it may be a burden for the maintainers whatever the hard cap would be, and as it isn't vital to set one anyway. Resolves: Mana-Mantis #364. Reviewed-by: bjorn, Jaxad0127.
-rw-r--r--src/actorsprite.cpp2
-rw-r--r--src/animatedsprite.cpp7
-rw-r--r--src/animatedsprite.h2
-rw-r--r--src/being.cpp6
-rw-r--r--src/compoundsprite.cpp11
-rw-r--r--src/compoundsprite.h2
-rw-r--r--src/imagesprite.h3
-rw-r--r--src/resources/animation.h2
-rw-r--r--src/resources/spritedef.cpp4
-rw-r--r--src/sprite.h10
10 files changed, 43 insertions, 6 deletions
diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp
index 1e0db70e..e89ba3c8 100644
--- a/src/actorsprite.cpp
+++ b/src/actorsprite.cpp
@@ -460,7 +460,7 @@ void ActorSprite::loadTargetCursor(const std::string &filename,
for (unsigned int i = 0; i < currentImageSet->size(); ++i)
{
- anim->addFrame(currentImageSet->get(i), 75,
+ anim->addFrame(currentImageSet->get(i), DEFAULT_FRAME_DELAY,
-(currentImageSet->getWidth() / 2),
-(currentImageSet->getHeight() / 2));
}
diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp
index fb612f19..000dec55 100644
--- a/src/animatedsprite.cpp
+++ b/src/animatedsprite.cpp
@@ -206,6 +206,13 @@ size_t AnimatedSprite::getFrameCount() const
return 0;
}
+int AnimatedSprite::getDuration() const
+{
+ if (mAnimation)
+ return mAnimation->getDuration();
+ return 0;
+}
+
int AnimatedSprite::getWidth() const
{
if (mFrame)
diff --git a/src/animatedsprite.h b/src/animatedsprite.h
index 1c5d6994..a5d91095 100644
--- a/src/animatedsprite.h
+++ b/src/animatedsprite.h
@@ -81,6 +81,8 @@ class AnimatedSprite : public Sprite
size_t getFrameCount() const;
+ int getDuration() const;
+
private:
bool updateCurrentAnimation(unsigned int dt);
diff --git a/src/being.cpp b/src/being.cpp
index 42043313..4f546f6d 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -893,10 +893,12 @@ void Being::logic()
ActorSprite::logic();
- // Remove it after 3 secs. TODO: Just play the dead animation before removing
+ // Remove it after 1.5 secs if the dead animation isn't long enough,
+ // or simply play it until it's finished.
if (!isAlive() && Net::getGameHandler()->removeDeadBeings() &&
- get_elapsed_time(mActionTime) > 3000)
+ get_elapsed_time(mActionTime) > std::max(getDuration(), 1500))
{
+
if (getType() != PLAYER)
actorSpriteManager->destroy(this);
}
diff --git a/src/compoundsprite.cpp b/src/compoundsprite.cpp
index d77005c7..5214890c 100644
--- a/src/compoundsprite.cpp
+++ b/src/compoundsprite.cpp
@@ -255,6 +255,17 @@ size_t CompoundSprite::getFrameCount(size_t layer)
return 0;
}
+int CompoundSprite::getDuration() const
+{
+ int duration = 0;
+ SpriteConstIterator it, it_end;
+ for (it = begin(), it_end = end(); it != it_end; it++)
+ if ((*it) && (*it)->getDuration() > duration)
+ duration = (*it)->getDuration();
+
+ return duration;
+}
+
static void updateValues(int &dimension, int &pos, int imgDimUL, int imgDimRD, int imgOffset)
{
// Handle going beyond the left/up
diff --git a/src/compoundsprite.h b/src/compoundsprite.h
index 3a5e0129..17fdfd18 100644
--- a/src/compoundsprite.h
+++ b/src/compoundsprite.h
@@ -70,6 +70,8 @@ public:
size_t getFrameCount() const;
+ int getDuration() const;
+
size_t size() const
{ return std::vector<Sprite*>::size(); }
diff --git a/src/imagesprite.h b/src/imagesprite.h
index 3a3678d9..e9f0e7b5 100644
--- a/src/imagesprite.h
+++ b/src/imagesprite.h
@@ -66,6 +66,9 @@ public:
size_t getFrameCount() const
{ return 1; }
+ int getDuration() const
+ { return 0; }
+
private:
Image *mImage;
};
diff --git a/src/resources/animation.h b/src/resources/animation.h
index 1629aebf..14ba2b27 100644
--- a/src/resources/animation.h
+++ b/src/resources/animation.h
@@ -70,7 +70,7 @@ class Animation
int getLength() const { return mFrames.size(); }
/**
- * Returns the duration of this animation.
+ * Returns the duration of this animation in milliseconds.
*/
int getDuration() const { return mDuration; }
diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp
index 22312107..4375fb89 100644
--- a/src/resources/spritedef.cpp
+++ b/src/resources/spritedef.cpp
@@ -22,6 +22,7 @@
#include "resources/spritedef.h"
#include "log.h"
+#include "sprite.h"
#include "resources/action.h"
#include "resources/animation.h"
@@ -224,7 +225,8 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode,
// Get animation frames
for_each_xml_child_node(frameNode, animationNode)
{
- const int delay = XML::getProperty(frameNode, "delay", 0);
+ const int delay = XML::getProperty(frameNode, "delay",
+ DEFAULT_FRAME_DELAY);
int offsetX = XML::getProperty(frameNode, "offsetX", 0);
int offsetY = XML::getProperty(frameNode, "offsetY", 0);
diff --git a/src/sprite.h b/src/sprite.h
index 797b1b20..096dcf8a 100644
--- a/src/sprite.h
+++ b/src/sprite.h
@@ -26,6 +26,9 @@
class Graphics;
class Image;
+// Default frame display delay in milliseconds
+const int DEFAULT_FRAME_DELAY = 75;
+
class Sprite
{
public:
@@ -60,7 +63,7 @@ class Sprite
virtual bool draw(Graphics* graphics, int posX, int posY) const = 0;
/**
- * Gets the width in pixels of the image
+ * Gets the width in pixels of the image
*/
virtual int getWidth() const = 0;
@@ -115,6 +118,11 @@ class Sprite
*/
virtual size_t getFrameCount() const = 0;
+ /**
+ * Returns the duration of the current sprite animation in milliseconds.
+ */
+ virtual int getDuration() const = 0;
+
protected:
float mAlpha; /**< The alpha opacity used to draw */
};