-/*
- * Animation.cpp
- *
- * Created on: Sep 5, 2012
- * Author: holy
- */
-
#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;
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, math::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, math::Vector<int> position) const {
+ math::Vector<int> offset(-GetSprite()->Width(), 0);
+ Draw(dest, position + offset);
+}
+
+void AnimationRunner::DrawCenter(SDL_Surface *dest, math::Vector<int> position) const {
+ Draw(dest, position - (GetSprite()->Size() / 2));
+}
+
+void AnimationRunner::DrawCenterBottom(SDL_Surface *dest, math::Vector<int> position) const {
+ math::Vector<int> offset(-GetSprite()->Width() / 2, -GetSprite()->Height());
+ Draw(dest, position + offset);
+}
+
+int AnimationRunner::Frame() const {
+ return Running()
+ ? ((timer.Iteration() + frameShift) % animation->NumFrames())
+ : 0;
+}
+
+
}