]> git.localhorst.tv Git - l2e.git/blobdiff - src/graphics/Animation.cpp
added capsule attack/animation handling
[l2e.git] / src / graphics / Animation.cpp
index d4a17d950e127ed0f0316c37b0bd2ce8dba5bd58..f55a9aa9fc6520b7c46e1532f8c83fccd9dece55 100644 (file)
@@ -1,9 +1,13 @@
 #include "Animation.h"
 
 #include "Sprite.h"
+#include "../app/Application.h"
+#include "../app/State.h"
 #include "../loader/Interpreter.h"
 #include "../loader/TypeDescription.h"
 
+#include <cassert>
+
 using loader::FieldDescription;
 using loader::Interpreter;
 using loader::TypeDescription;
@@ -22,4 +26,69 @@ void Animation::AddFields(TypeDescription &td, const Animation &a, std::ptrdiff_
        td.AddField("repeat", FieldDescription(((char *)&a.repeat) - ((char *)&a) - offset, Interpreter::BOOLEAN_ID).SetDescription("whether the animation should start over at the beginning after reaching the last frame"));
 }
 
+
+void AnimationRunner::Start(app::State &ctrl) {
+       assert(animation);
+       timer = ctrl.GraphicsTimers().StartInterval(animation->FrameTime());
+}
+
+void AnimationRunner::Start(app::Application &ctrl) {
+       assert(animation);
+       timer = ctrl.GlobalTimers().StartInterval(animation->FrameTime());
+}
+
+void AnimationRunner::Stop() {
+       timer = app::Timer<Uint32>();
+}
+
+bool AnimationRunner::Started() const {
+       return timer.Started();
+}
+
+bool AnimationRunner::Running() const {
+       return animation
+                       && timer.Running()
+                       && (animation->Repeat()
+                                       || timer.Iteration() < animation->NumFrames());
+}
+
+bool AnimationRunner::Finished() const {
+       return Started() && !Running();
+}
+
+bool AnimationRunner::JustFinished() const {
+       return animation
+                       && timer.JustHit()
+                       && timer.Iteration() == animation->NumFrames();
+}
+
+
+void AnimationRunner::Draw(SDL_Surface *dest, geometry::Vector<int> position) const {
+       GetSprite()->Draw(dest,
+                       position + animation->Offset(Frame()),
+                       animation->Col(Frame()) + ColOffset(),
+                       animation->Row(Frame()) + RowOffset());
+}
+
+void AnimationRunner::DrawTopRight(SDL_Surface *dest, geometry::Vector<int> position) const {
+       geometry::Vector<int> offset(-GetSprite()->Width(), 0);
+       Draw(dest, position + offset);
+}
+
+void AnimationRunner::DrawCenter(SDL_Surface *dest, geometry::Vector<int> position) const {
+       Draw(dest, position - (GetSprite()->Size() / 2));
+}
+
+void AnimationRunner::DrawCenterBottom(SDL_Surface *dest, geometry::Vector<int> position) const {
+       geometry::Vector<int> offset(-GetSprite()->Width() / 2, -GetSprite()->Height());
+       Draw(dest, position + offset);
+}
+
+int AnimationRunner::Frame() const {
+       return Running()
+                       ? ((timer.Iteration() + frameShift) % animation->NumFrames())
+                       : 0;
+}
+
+
 }