+public:
+ void SetSprite(const Sprite *s) { sprite = s; }
+ void SetFrameTime(int t) { frameTime = t; }
+ void SetRepeat(bool r) { repeat = r; }
+
+public:
+ virtual int NumFrames() const = 0;
+ virtual int Col(int frame) const = 0;
+ virtual int Row(int frame) const = 0;
+ virtual math::Vector<int> Offset(int frame) const { return math::Vector<int>(); }
+
+ static void CreateTypeDescription();
+
+protected:
+ static void AddFields(loader::TypeDescription &, const Animation &, std::ptrdiff_t offset);
+
+private:
+ const Sprite *sprite;
+ int frameTime;
+ bool repeat;
+
+};
+
+
+class AnimationRunner {
+
+public:
+ explicit AnimationRunner(const Animation *a = 0, int colOffset = 0, int rowOffset = 0)
+ : animation(a), sprite(0), frameShift(0), colOffset(colOffset), rowOffset(rowOffset) { }
+
+public:
+ bool Valid() const { return animation; }
+ void Clear() { animation = 0; timer = app::Timer<Uint32>(); }
+
+ void Start(app::State &ctrl);
+ void Start(app::Application &ctrl);
+ void Stop();
+ bool Started() const;
+ bool Running() const;
+ bool Finished() const;
+ bool JustFinished() const;
+
+ const app::Timer<Uint32> &GetTimer() { return timer; }
+
+ void SetFrameShift(int offset) { frameShift = offset; }
+ int FrameShift() const { return frameShift; }