X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FAnimation.h;h=a224f548590c4af16edad31b32c1ab596881df3d;hb=bace3ec042d1d7bdb2cea48f06d0af4dacbcc375;hp=50330957ab9d28412cb1314c70596f86d75ead1f;hpb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;p=l2e.git diff --git a/src/graphics/Animation.h b/src/graphics/Animation.h index 5033095..a224f54 100644 --- a/src/graphics/Animation.h +++ b/src/graphics/Animation.h @@ -1,18 +1,24 @@ #ifndef GRAPHICS_ANIMATION_H_ #define GRAPHICS_ANIMATION_H_ -#include "Sprite.h" -#include "../app/Application.h" -#include "../app/State.h" +namespace app { + class Application; + class State; +} +namespace loader { + class TypeDescription; +} + #include "../app/Timer.h" -#include "../loader/fwd.h" -#include "../geometry/Vector.h" +#include "../math/Vector.h" #include #include namespace graphics { +class Sprite; + class Animation { public: @@ -39,7 +45,7 @@ public: virtual int NumFrames() const = 0; virtual int Col(int frame) const = 0; virtual int Row(int frame) const = 0; - virtual geometry::Vector Offset(int frame) const { return geometry::Vector(); } + virtual math::Vector Offset(int frame) const { return math::Vector(); } static void CreateTypeDescription(); @@ -64,27 +70,14 @@ public: bool Valid() const { return animation; } void Clear() { animation = 0; timer = app::Timer(); } - void Start(app::State &ctrl) { - timer = ctrl.GraphicsTimers().StartInterval(animation->FrameTime()); - } - void Start(app::Application &ctrl) { - timer = ctrl.GlobalTimers().StartInterval(animation->FrameTime()); - } - void Stop() { - timer = app::Timer(); - } - bool Started() const { - return timer.Started(); - } - bool Running() const { - return timer.Running() && (animation->Repeat() || timer.Iteration() < animation->NumFrames()); - } - bool Finished() const { - return Started() && !Running(); - } - bool JustFinished() const { - return timer.JustHit() && timer.Iteration() == animation->NumFrames(); - } + void Start(app::State &ctrl); + void Start(app::Application &ctrl); + void Synchronize(const AnimationRunner &other) { timer = other.timer; } + void Stop(); + bool Started() const; + bool Running() const; + bool Finished() const; + bool JustFinished() const; const app::Timer &GetTimer() { return timer; } @@ -101,22 +94,12 @@ public: void ChangeSprite(const Sprite *s) { sprite = s; } const Sprite *GetSprite() const { return sprite ? sprite : animation->GetSprite(); } - void Draw(SDL_Surface *dest, geometry::Vector position) const { - GetSprite()->Draw(dest, position + animation->Offset(Frame()), animation->Col(Frame()) + ColOffset(), animation->Row(Frame()) + RowOffset()); - } - void DrawTopRight(SDL_Surface *dest, geometry::Vector position) const { - geometry::Vector offset(-GetSprite()->Width(), 0); - Draw(dest, position + offset); - } - void DrawCenter(SDL_Surface *dest, geometry::Vector position) const { - Draw(dest, position - (GetSprite()->Size() / 2)); - } - void DrawCenterBottom(SDL_Surface *dest, geometry::Vector position) const { - geometry::Vector offset(-GetSprite()->Width() / 2, -GetSprite()->Height()); - Draw(dest, position + offset); - } - - int Frame() const { return Running() ? ((timer.Iteration() + frameShift) % animation->NumFrames()) : 0; } + void Draw(SDL_Surface *dest, math::Vector position) const; + void DrawTopRight(SDL_Surface *dest, math::Vector position) const; + void DrawCenter(SDL_Surface *dest, math::Vector position) const; + void DrawCenterBottom(SDL_Surface *dest, math::Vector position) const; + + int Frame() const; private: const Animation *animation; @@ -130,4 +113,4 @@ private: } -#endif /* GRAPHICS_SIMPLEANIMATION_H_ */ +#endif