diff options
Diffstat (limited to 'src/components/animate.cpp')
-rw-r--r-- | src/components/animate.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/components/animate.cpp b/src/components/animate.cpp new file mode 100644 index 0000000..2ac1465 --- /dev/null +++ b/src/components/animate.cpp @@ -0,0 +1,106 @@ +#include <components/animate.hpp> + +void Limb::firstFrame(Frame& duckmyass) +{ + // loop through the spritedata of the sprite we wanna change + for (auto &d : duckmyass) { + // if the sprite data is the same limb as this limb + if (d.first.limb == limbID) { + // rotate through (for safety) the first frame to set the limb + for (auto &fa : frame.at(0)) { + if (fa.first.limb == limbID) { + d.first = fa.first; + d.second = fa.second; + } + } + } + } +} + +void Limb::nextFrame(Frame& duckmyass, float dt) { + updateCurrent -= dt; + if (updateCurrent <= 0) { + updateCurrent = updateRate; + } else { + return; + } + + if (index < frame.size() - 1) + index++; + else + index = 0; + + for (auto &d : duckmyass) { + if (d.first.limb == limbID) { + for (auto &fa : frame.at(index)) { + if (fa.first.limb == limbID) { + d.first = fa.first; + d.second = fa.second; + } + } + } + } +} + +void Animate::firstFrame(unsigned int updateType, Frame &sprite) +{ + unsigned int upid = updateType; //^see todo + for (auto &l : limb) { + if (l.updateType == upid) { + l.firstFrame(sprite); + } + } +} + +void Animate::updateAnimation(unsigned int updateType, Frame& sprite, float dt) +{ + unsigned int upid = updateType; //^see todo + for (auto &l : limb) { + if (l.updateType == upid) { + l.nextFrame(sprite, dt); + } + } +} + +void Animate::fromXML(XMLElement* imp, XMLElement* def) +{ + (void)imp; + + auto animx = def->FirstChildElement(); + unsigned int limbid = 0; + float limbupdate = 0; + unsigned int limbupdatetype = 0; + + while (animx != nullptr) { + if (std::string(animx->Name()) == "movement") { + limbupdatetype = 1; + + auto limbx = animx->FirstChildElement(); + while (limbx != nullptr) { + if (std::string(limbx->Name()) == "limb") { + auto frames = developFrame(limbx); + limb.push_back(Limb()); + auto& newLimb = limb.back(); + newLimb.updateType = limbupdatetype; + if (limbx->QueryUnsignedAttribute("id", &limbid) == XML_NO_ERROR) + newLimb.limbID = limbid; + if (limbx->QueryFloatAttribute("update", &limbupdate) == XML_NO_ERROR) + newLimb.updateRate = limbupdate; + + // place our newly developed frames in the entities animation stack + for (auto &f : frames) { + newLimb.addFrame(f); + for (auto &fr : newLimb.frame) { + for (auto &sd : fr) + sd.first.limb = limbid; + } + } + } + limbx = limbx->NextSiblingElement(); + } + } + + animx = animx->NextSiblingElement(); + } +} + |