#ifndef GRAPHICS_SIMPLEANIMATION_H_
#define GRAPHICS_SIMPLEANIMATION_H_
-#include "Sprite.h"
-#include "../app/Application.h"
-#include "../app/State.h"
-#include "../app/Timer.h"
-#include "../geometry/Point.h"
-
-#include <SDL.h>
+#include "Animation.h"
namespace graphics {
-class SimpleAnimation {
+class SimpleAnimation
+: public Animation {
public:
SimpleAnimation()
- : sprite(0), frameTime(0), numFrames(0), col(0), row(0), repeat(false) { }
+ : numFrames(0), col(0), row(0) { }
SimpleAnimation(const Sprite *sprite, int frameTime, int numFrames, int col = 0, int row = 0, bool repeat = false)
- : sprite(sprite), frameTime(frameTime), numFrames(numFrames), col(col), row(row), repeat(repeat) { }
+ : Animation(sprite, frameTime, repeat), numFrames(numFrames), col(col), row(row) { }
public:
- void Start(app::State &ctrl) {
- timer = ctrl.GraphicsTimers().StartInterval(frameTime);
- }
- void Start(app::Application &ctrl) {
- timer = ctrl.GlobalTimers().StartInterval(frameTime);
- }
- void Stop() {
- timer = app::Timer<Uint32>();
- }
- bool Running() const {
- return timer.Running() && (repeat || timer.Iteration() < numFrames);
- }
- void Draw(SDL_Surface *dest, geometry::Point<int> position) {
- sprite->Draw(dest, position, col, Running() ? row + (timer.Iteration() % numFrames) : row);
- }
- void DrawCenterBottom(SDL_Surface *dest, geometry::Point<int> position) const {
- sprite->DrawCenterBottom(dest, position, col, Running() ? row + (timer.Iteration() % numFrames) : row);
- }
+ void SetNumFrames(int n) { numFrames = n; }
+ void SetCol(int c) { col = c; }
+ void SetRow(int r) { row = r; }
+
+ static void CreateTypeDescription();
+ static void Construct(void *);
+
+protected:
+ virtual int NumFrames() const { return numFrames; };
+ virtual int Col(int frame) const { return col; }
+ virtual int Row(int frame) const { return row + frame; }
private:
- const Sprite *sprite;
- app::Timer<Uint32> timer;
- int frameTime;
int numFrames;
int col;
int row;
- bool repeat;
};