diff options
author | Andrei Karas <akaras@inbox.ru> | 2011-04-13 03:36:00 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2011-04-13 03:36:00 +0300 |
commit | c978b7f0d9de1bb6bd84cd299ed80c27c5147927 (patch) | |
tree | 8f1edc2be0816693761ba58aa7c7c554040a7db6 | |
parent | da1b2d8311ca78eccd3e9875598562ce6bf05cab (diff) | |
download | manaplus-c978b7f0d9de1bb6bd84cd299ed80c27c5147927.tar.gz manaplus-c978b7f0d9de1bb6bd84cd299ed80c27c5147927.tar.bz2 manaplus-c978b7f0d9de1bb6bd84cd299ed80c27c5147927.tar.xz manaplus-c978b7f0d9de1bb6bd84cd299ed80c27c5147927.zip |
Impliment new tags in sprites animations and random condition.
Tags: <label>, <goto>
-rw-r--r-- | src/actorsprite.cpp | 5 | ||||
-rw-r--r-- | src/animatedsprite.cpp | 69 | ||||
-rw-r--r-- | src/gui/widgets/progressindicator.cpp | 2 | ||||
-rw-r--r-- | src/particleemitter.cpp | 16 | ||||
-rw-r--r-- | src/resources/animation.cpp | 27 | ||||
-rw-r--r-- | src/resources/animation.h | 13 | ||||
-rw-r--r-- | src/resources/mapreader.cpp | 3 | ||||
-rw-r--r-- | src/resources/spritedef.cpp | 23 | ||||
-rw-r--r-- | src/simpleanimation.cpp | 7 |
9 files changed, 127 insertions, 38 deletions
diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp index 686c871e7..d87156285 100644 --- a/src/actorsprite.cpp +++ b/src/actorsprite.cpp @@ -488,8 +488,9 @@ void ActorSprite::loadTargetCursor(const std::string &filename, { // anim->addFrame(currentImageSet->get(i), 0, anim->addFrame(currentImageSet->get(i), 75, - (16 - (currentImageSet->getWidth() / 2)), - (16 - (currentImageSet->getHeight() / 2))); + (16 - (currentImageSet->getWidth() / 2)), + (16 - (currentImageSet->getHeight() / 2)), + 100); } SimpleAnimation *currentCursor = new SimpleAnimation(anim); diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index b9946fb1d..1069bcf47 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -142,30 +142,77 @@ bool AnimatedSprite::updateCurrentAnimation(unsigned int time) mFrameTime += time; - while (mFrameTime > static_cast<unsigned>(mFrame->delay) - && mFrame->delay > 0) + while ((mFrameTime > static_cast<unsigned>(mFrame->delay) + && mFrame->delay > 0) || mFrame->type != Frame::ANIMATION) { + bool fail(true); mFrameTime -= static_cast<unsigned>(mFrame->delay); mFrameIndex++; - if (mFrameIndex == mAnimation->getLength()) + if (mFrameIndex >= mAnimation->getLength()) mFrameIndex = 0; mFrame = mAnimation->getFrame(mFrameIndex); - if (Animation::isTerminator(*mFrame)) + if (mFrame->type == Frame::LABEL && !mFrame->nextAction.empty()) { - mAnimation = 0; - mFrame = 0; - return false; + fail = true; + } + else if (mFrame->type == Frame::GOTO && !mFrame->nextAction.empty()) + { + if (mFrame->rand == 100 || rand() % 100 <= mFrame->rand) + { + for (int i = 0; i < mAnimation->getLength(); i ++) + { + Frame *frame = mAnimation->getFrame(i); + if (frame->type == Frame::LABEL + && mFrame->nextAction == frame->nextAction) + { + mFrameTime = 0; + mFrameIndex = i; + if (mFrameIndex >= mAnimation->getLength()) + mFrameIndex = 0; + + mFrame = mAnimation->getFrame(mFrameIndex); + + fail = true; + break; + } + } + } + } + else if (mFrame->type == Frame::JUMP && !mFrame->nextAction.empty()) + { + if (mFrame->rand == 100 || rand() % 100 <= mFrame->rand) + { + play(mFrame->nextAction); + return true; + } + } + else if (Animation::isTerminator(*mFrame)) + { + if (mFrame->rand == 100 || rand() % 100 <= mFrame->rand) + { + mAnimation = 0; + mFrame = 0; + return false; + } } - if (mFrame->type == Frame::JUMP && !mFrame->nextAction.empty()) + else { - play(mFrame->nextAction); - return true; + if (mFrame->rand == 100 || mFrameIndex >= mAnimation->getLength()) + { + fail = false; + } + else + { + if (rand() % 100 <= mFrame->rand) + fail = false; + } } + if (fail) + mFrameTime = mFrame->delay + 1; } - return true; } diff --git a/src/gui/widgets/progressindicator.cpp b/src/gui/widgets/progressindicator.cpp index 936e36ada..af48d0649 100644 --- a/src/gui/widgets/progressindicator.cpp +++ b/src/gui/widgets/progressindicator.cpp @@ -41,7 +41,7 @@ ProgressIndicator::ProgressIndicator() if (images) { for (ImageSet::size_type i = 0; i < images->size(); ++i) - anim->addFrame(images->get(i), 100, 0, 0); + anim->addFrame(images->get(i), 100, 0, 0, 100); mIndicator = new SimpleAnimation(anim); diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index b3f8f40d7..1c3e63f30 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -215,6 +215,7 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); int offsetY = XML::getProperty(frameNode, "offsetY", 0); + int rand = XML::getProperty(frameNode, "rand", 100); if (!imageset) { logger->log1("Error: no valid imageset"); @@ -242,7 +243,8 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, continue; } - mParticleRotation.addFrame(img, delay, offsetX, offsetY); + mParticleRotation.addFrame(img, delay, + offsetX, offsetY, rand); } else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { @@ -266,13 +268,13 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, } mParticleRotation.addFrame(img, delay, - offsetX, offsetY); + offsetX, offsetY, rand); start++; } } else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { - mParticleRotation.addTerminator(); + mParticleRotation.addTerminator(rand); } } // for frameNode } @@ -296,6 +298,7 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); int offsetY = XML::getProperty(frameNode, "offsetY", 0); + int rand = XML::getProperty(frameNode, "rand", 100); offsetY -= imageset->getHeight() - 32; offsetX -= imageset->getWidth() / 2 - 16; @@ -317,7 +320,8 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, continue; } - mParticleAnimation.addFrame(img, delay, offsetX, offsetY); + mParticleAnimation.addFrame(img, delay, + offsetX, offsetY, rand); } else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { @@ -341,13 +345,13 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, } mParticleAnimation.addFrame(img, delay, - offsetX, offsetY); + offsetX, offsetY, rand); start++; } } else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { - mParticleAnimation.addTerminator(); + mParticleAnimation.addTerminator(rand); } } // for frameNode } diff --git a/src/resources/animation.cpp b/src/resources/animation.cpp index 98ea19f2a..1154d9c9d 100644 --- a/src/resources/animation.cpp +++ b/src/resources/animation.cpp @@ -29,25 +29,38 @@ Animation::Animation(): { } -void Animation::addFrame(Image *image, int delay, int offsetX, int offsetY) +void Animation::addFrame(Image *image, int delay, int offsetX, int offsetY, + int rand) { - Frame frame = { image, delay, offsetX, offsetY, Frame::ANIMATION, "" }; + Frame frame = { image, delay, offsetX, offsetY, rand, Frame::ANIMATION, "" }; mFrames.push_back(frame); mDuration += delay; } -void Animation::addTerminator() +void Animation::addTerminator(int rand) { - addFrame(NULL, 0, 0, 0); + addFrame(NULL, 0, 0, 0, rand); } bool Animation::isTerminator(const Frame &candidate) { - return (candidate.image == NULL); + return (candidate.image == NULL && candidate.type == Frame::ANIMATION); } -void Animation::addJump(std::string name) +void Animation::addJump(std::string name, int rand) { - Frame frame = { 0, 0, 0, 0, Frame::JUMP, name }; + Frame frame = { 0, 0, 0, 0, rand, Frame::JUMP, name }; + mFrames.push_back(frame); +} + +void Animation::addLabel(std::string name) +{ + Frame frame = { 0, 0, 0, 0, 100, Frame::LABEL, name }; + mFrames.push_back(frame); +} + +void Animation::addGoto(std::string name, int rand) +{ + Frame frame = { 0, 0, 0, 0, rand, Frame::GOTO, name }; mFrames.push_back(frame); } diff --git a/src/resources/animation.h b/src/resources/animation.h index 5130bc8dd..0c6f45681 100644 --- a/src/resources/animation.h +++ b/src/resources/animation.h @@ -39,12 +39,14 @@ struct Frame { ANIMATION = 0, JUMP, + GOTO, LABEL }; Image *image; int delay; int offsetX; int offsetY; + int rand; FrameType type; std::string nextAction; }; @@ -61,13 +63,14 @@ class Animation /** * Appends a new animation at the end of the sequence. */ - void addFrame(Image *image, int delay, int offsetX, int offsetY); + void addFrame(Image *image, int delay, int offsetX, int offsetY, + int rand); /** * Appends an animation terminator that states that the animation * should not loop. */ - void addTerminator(); + void addTerminator(int rand); /** * Returns the frame at the specified index. @@ -87,7 +90,11 @@ class Animation int getDuration() const { return mDuration; } - void addJump(std::string name); + void addJump(std::string name, int rand); + + void addLabel(std::string name); + + void addGoto(std::string name, int rand); /** * Determines whether the given animation frame is a terminator. diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index d2bcde06d..3bd77315a 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -705,11 +705,12 @@ Tileset *MapReader::readTileset(xmlNodePtr node, const std::string &path, "animation-frame" + toString(i)); iDelay = tileProperties.find( "animation-delay" + toString(i)); + // possible need add random attribute? if (iFrame != tileProperties.end() && iDelay != tileProperties.end()) { ani->addFrame(set->get(iFrame->second), - iDelay->second, 0, 0); + iDelay->second, 0, 0, 100); } else { diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index e6a65926e..1eea6547d 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -225,6 +225,8 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode, imageSet->getOffsetX(); int offsetY = XML::getProperty(frameNode, "offsetY", 0) + imageSet->getOffsetY(); + int rand = XML::getProperty(frameNode, "rand", 100); + offsetY -= imageSet->getHeight() - 32; offsetX -= imageSet->getWidth() / 2 - 16; @@ -246,7 +248,7 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode, continue; } - animation->addFrame(img, delay, offsetX, offsetY); + animation->addFrame(img, delay, offsetX, offsetY, rand); } else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { @@ -282,7 +284,7 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode, continue; } - animation->addFrame(img, delay, offsetX, offsetY); + animation->addFrame(img, delay, offsetX, offsetY, rand); pos ++; } repeat --; @@ -290,11 +292,24 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode, } else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { - animation->addTerminator(); + animation->addTerminator(rand); } else if (xmlStrEqual(frameNode->name, BAD_CAST "jump")) { - animation->addJump(XML::getProperty(frameNode, "action", "")); + animation->addJump(XML::getProperty( + frameNode, "action", ""), rand); + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "label")) + { + std::string name = XML::getProperty(frameNode, "name", ""); + if (!name.empty()) + animation->addLabel(name); + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "goto")) + { + std::string name = XML::getProperty(frameNode, "label", ""); + if (!name.empty()) + animation->addGoto(name, rand); } } // for frameNode } diff --git a/src/simpleanimation.cpp b/src/simpleanimation.cpp index 9931f491c..8d86583eb 100644 --- a/src/simpleanimation.cpp +++ b/src/simpleanimation.cpp @@ -155,6 +155,7 @@ void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode) int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); int offsetY = XML::getProperty(frameNode, "offsetY", 0); + int rand = XML::getProperty(frameNode, "rand", 100); offsetY -= imageset->getHeight() - 32; offsetX -= imageset->getWidth() / 2 - 16; @@ -177,7 +178,7 @@ void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode) } if (mAnimation) - mAnimation->addFrame(img, delay, offsetX, offsetY); + mAnimation->addFrame(img, delay, offsetX, offsetY, rand); } else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { @@ -201,14 +202,14 @@ void SimpleAnimation::initializeAnimation(xmlNodePtr animationNode) } if (mAnimation) - mAnimation->addFrame(img, delay, offsetX, offsetY); + mAnimation->addFrame(img, delay, offsetX, offsetY, rand); start++; } } else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { if (mAnimation) - mAnimation->addTerminator(); + mAnimation->addTerminator(rand); } } |