From c4529dbd7b7f8f3ae5009d35010139e7f1b68deb Mon Sep 17 00:00:00 2001 From: Philipp Sehmisch Date: Wed, 13 Sep 2006 23:17:54 +0000 Subject: some improvements at the animation system --- src/animatedsprite.cpp | 47 ++++++++++++++++++++++++++++++++++------------- src/animatedsprite.h | 3 ++- 2 files changed, 36 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index a7a4453c..a6d8eaf7 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -92,11 +92,6 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): std::string name = getProperty(node, "name", ""); std::string imageset = getProperty(node, "imageset", ""); - if (name.empty()) - { - logger->log("Warning: unnamed action in %s", - animationFile.c_str()); - } if (mSpritesets.find(imageset) == mSpritesets.end()) { logger->log("Warning: imageset \"%s\" not defined in %s", imageset.c_str(), @@ -108,8 +103,27 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): Action *action = new Action(); - action->setSpriteset(mSpritesets[imageset]); - mActions[makeSpriteAction(name)] = action; + action->setSpriteset(mSpritesets[imageset]); + + SpriteAction actionname = makeSpriteAction(name); + if (actionname == ACTION_INVALID) + { + + logger->log("Warning: Unknown action \"%s\" defined in %s", + name.c_str(), + animationFile.c_str()); + continue; + } + else { + mActions[makeSpriteAction(name)] = action; + + // When first action set it as default direction + if (mActions.empty()) + { + mActions[ACTION_DEFAULT] = action; + } + }; + // get animations for (xmlNodePtr animationNode = node->xmlChildrenNode; @@ -161,6 +175,7 @@ AnimatedSprite::AnimatedSprite(const std::string& animationFile, int variant): } // for node // Complete missing actions + substituteAction(ACTION_STAND, ACTION_DEFAULT); substituteAction(ACTION_WALK, ACTION_STAND); substituteAction(ACTION_WALK, ACTION_RUN); substituteAction(ACTION_ATTACK, ACTION_STAND); @@ -278,11 +293,12 @@ AnimatedSprite::update(int time) if (time < mLastTime || mLastTime == 0) mLastTime = time; - // If not enough time have passed yet, do nothing + // If not enough time has passed yet, do nothing if (time > mLastTime && mAction) { - Animation *animation = mAction->getAnimation(mDirection); - animation->update((unsigned int)((time - mLastTime) * mSpeed)); + Animation *animation = mAction->getAnimation(mDirection); + if (animation != NULL) { + animation->update((unsigned int)((time - mLastTime) * mSpeed));} mLastTime = time; } } @@ -293,7 +309,9 @@ AnimatedSprite::draw(Graphics* graphics, Sint32 posX, Sint32 posY) const if (!mAction) return false; - Animation *animation = mAction->getAnimation(mDirection); + Animation *animation = mAction->getAnimation(mDirection); + if (animation == NULL) return false; + int phase = animation->getCurrentPhase(); if (phase < 0) return false; @@ -319,7 +337,10 @@ AnimatedSprite::getHeight() const SpriteAction AnimatedSprite::makeSpriteAction(const std::string& action) -{ +{ + if (action == "" || action == "default") { + return ACTION_DEFAULT; + } if (action == "stand") { return ACTION_STAND; } @@ -363,7 +384,7 @@ AnimatedSprite::makeSpriteAction(const std::string& action) return ACTION_DEAD; } else { - return ACTION_DEFAULT; + return ACTION_INVALID; } } diff --git a/src/animatedsprite.h b/src/animatedsprite.h index 89394d6c..c860b46d 100644 --- a/src/animatedsprite.h +++ b/src/animatedsprite.h @@ -50,7 +50,8 @@ enum SpriteAction ACTION_SIT, ACTION_SLEEP, ACTION_HURT, - ACTION_DEAD + ACTION_DEAD, + ACTION_INVALID }; enum SpriteDirection -- cgit v1.2.3-70-g09d2