diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2006-11-14 22:51:09 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2006-11-14 22:51:09 +0000 |
commit | 29bedd4da7e21b6dc644c8aa69d096db1516ea7b (patch) | |
tree | c33d35513bbf069e4e39c604bc2200ce100856e1 /src/animatedsprite.cpp | |
parent | 82f587f2f3795898ed4fb7b125bf34b7e13de7cd (diff) | |
download | mana-29bedd4da7e21b6dc644c8aa69d096db1516ea7b.tar.gz mana-29bedd4da7e21b6dc644c8aa69d096db1516ea7b.tar.bz2 mana-29bedd4da7e21b6dc644c8aa69d096db1516ea7b.tar.xz mana-29bedd4da7e21b6dc644c8aa69d096db1516ea7b.zip |
Resolve Image* of animation phase at load time instead of storing just the
spriteset index and looking it up later (checking validity should still be
added). Also calculate animation length during loading instead of summing it up
each time it is requested.
Diffstat (limited to 'src/animatedsprite.cpp')
-rw-r--r-- | src/animatedsprite.cpp | 92 |
1 files changed, 55 insertions, 37 deletions
diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index e5a4df15..61d2f3cf 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -30,6 +30,7 @@ #include "resources/resourcemanager.h" #include "resources/spriteset.h" +#include "resources/image.h" AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): mAction(NULL), @@ -91,17 +92,18 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): else if (xmlStrEqual(node->name, BAD_CAST "action")) { std::string actionName = getProperty(node, "name", ""); - std::string imageset = getProperty(node, "imageset", ""); + std::string imagesetName = getProperty(node, "imageset", ""); - if (mSpritesets.find(imageset) == mSpritesets.end()) { + SpritesetIterator si = mSpritesets.find(imagesetName); + if (si == mSpritesets.end()) { logger->log("Warning: imageset \"%s\" not defined in %s", - imageset.c_str(), + imagesetName.c_str(), animationFile.c_str()); // skip loading animations continue; } - + Spriteset *imageset = si->second; SpriteAction actionType = makeSpriteAction(actionName); if (actionType == ACTION_INVALID) @@ -112,7 +114,6 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): continue; } Action *action = new Action(); - action->setSpriteset(mSpritesets[imageset]); mActions[actionType] = action; // When first action set it as default direction @@ -131,12 +132,15 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): if (!xmlStrEqual(animationNode->name, BAD_CAST "animation")) continue; - std::string directionName = getProperty(animationNode, "direction", ""); + std::string directionName = + getProperty(animationNode, "direction", ""); + SpriteDirection directionType = + makeSpriteDirection(directionName); - SpriteDirection directionType = makeSpriteDirection(directionName); if (directionType == DIRECTION_INVALID) { - logger->log("Warning: Unknown direction \"%s\" defined for action %s in %s", + logger->log("Warning: Unknown direction \"%s\" defined " + "for action %s in %s", directionName.c_str(), actionName.c_str(), animationFile.c_str()); @@ -159,28 +163,28 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): int offsetX = getProperty(phaseNode, "offsetX", 0); int offsetY = getProperty(phaseNode, "offsetY", 0); - offsetY -= mSpritesets[imageset]->getHeight() - 32; - offsetX -= mSpritesets[imageset]->getWidth() / 2 - 16; - animation->addPhase(index + variant_offset, delay, - offsetX, offsetY); + offsetY -= imageset->getHeight() - 32; + offsetX -= imageset->getWidth() / 2 - 16; + Image *img = imageset->get(index + variant_offset); + animation->addPhase(img, delay, offsetX, offsetY); } else if (xmlStrEqual(phaseNode->name, BAD_CAST "sequence")) { int start = getProperty(phaseNode, "start", 0); int end = getProperty(phaseNode, "end", 0); - int offsetY = -mSpritesets[imageset]->getHeight() + 32; - int offsetX = -mSpritesets[imageset]->getWidth() / 2 + 16; + int offsetY = -imageset->getHeight() + 32; + int offsetX = -imageset->getWidth() / 2 + 16; while (end >= start) { - animation->addPhase(start + variant_offset, - delay, offsetX, offsetY); + Image *img = imageset->get(start + variant_offset); + animation->addPhase(img, delay, offsetX, offsetY); start++; } } else if (xmlStrEqual(phaseNode->name, BAD_CAST "end")) { animation->addTerminator(); - }; + } } // for phaseNode } // for animationNode } // if "<imageset>" else if "<action>" @@ -223,8 +227,8 @@ AnimatedSprite::getProperty(xmlNodePtr node, const char* name, int def) } std::string -AnimatedSprite::getProperty(xmlNodePtr node, const char* name, - const std::string& def) +AnimatedSprite::getProperty(xmlNodePtr node, const char *name, + const std::string &def) { xmlChar *prop = xmlGetProp(node, BAD_CAST name); if (prop) { @@ -294,7 +298,7 @@ AnimatedSprite::play(SpriteAction action) void AnimatedSprite::update(int time) { - bool notFinished = true; + bool finished = false; // Avoid freaking out at first frame or when tick_time overflows if (time < mLastTime || mLastTime == 0) mLastTime = time; @@ -304,11 +308,12 @@ AnimatedSprite::update(int time) { Animation *animation = mAction->getAnimation(mDirection); if (animation != NULL) { - notFinished = animation->update((unsigned int)(time - mLastTime));} + finished = !animation->update((unsigned int)(time - mLastTime)); + } mLastTime = time; } - if (!notFinished) + if (finished) { play(ACTION_STAND); } @@ -317,33 +322,46 @@ AnimatedSprite::update(int time) bool AnimatedSprite::draw(Graphics* graphics, Sint32 posX, Sint32 posY) const { - if (!mAction) - return false; - - Animation *animation = mAction->getAnimation(mDirection); - if (animation == NULL) return false; - - int phase = animation->getCurrentPhase(); - if (phase < 0) + const AnimationPhase *phase = getCurrentPhase(); + if (!phase || !phase->image) + { return false; + } - Spriteset *spriteset = mAction->getSpriteset(); - Image *image = spriteset->get(phase); - Sint32 offsetX = animation->getOffsetX(); - Sint32 offsetY = animation->getOffsetY(); - return graphics->drawImage(image, posX + offsetX, posY + offsetY); + Sint32 offsetX = phase->offsetX; + Sint32 offsetY = phase->offsetY; + return graphics->drawImage(phase->image, posX + offsetX, posY + offsetY); } int AnimatedSprite::getWidth() const { - return mAction ? mAction->getSpriteset()->getWidth() : 0; + const AnimationPhase *phase = getCurrentPhase(); + return (phase && phase->image) ? phase->image->getWidth() : 0; } int AnimatedSprite::getHeight() const { - return mAction ? mAction->getSpriteset()->getHeight() : 0; + const AnimationPhase *phase = getCurrentPhase(); + return (phase && phase->image) ? phase->image->getHeight() : 0; +} + +const AnimationPhase* +AnimatedSprite::getCurrentPhase() const +{ + if (!mAction) + { + return NULL; + } + + Animation *animation = mAction->getAnimation(mDirection); + if (animation == NULL) + { + return NULL; + } + + return animation->getCurrentPhase(); } SpriteAction |