X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FAnimation.h;h=ddbf095f185e06d552cc38b4a0153a3c3db53aaa;hb=HEAD;hp=fc9de19c352f36f898a06a74cdb285cc146d7eb3;hpb=572a3272ba5c470252b2c13384b5913aa023d70a;p=l2e.git diff --git a/src/graphics/Animation.h b/src/graphics/Animation.h index fc9de19..ddbf095 100644 --- a/src/graphics/Animation.h +++ b/src/graphics/Animation.h @@ -1,59 +1,119 @@ -/* - * Animation.h - * - * Created on: Aug 11, 2012 - * Author: holy - */ - #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 "../geometry/Point.h" +#include "../math/Vector.h" +#include "../loader/noinit.h" +#include #include namespace graphics { +class Sprite; + class Animation { +public: + static const int TYPE_ID = 401; + public: Animation() - : sprite(0), frameTime(0), numFrames(0), col(0), row(0), repeat(false) { } - Animation(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) { } + : sprite(0), frameTime(0), repeat(false) { } + Animation(const Sprite *sprite, int frameTime, bool repeat = false) + : sprite(sprite), frameTime(frameTime), repeat(repeat) { } + virtual ~Animation() { }; +protected: + Animation(loader::noinit_t); + +public: + const Sprite *GetSprite() const { return sprite; } + int FrameTime() const { return frameTime; } + bool Repeat() const { return repeat; } + +public: + void SetSprite(const Sprite *s) { sprite = s; } + void SetFrameTime(int t) { frameTime = t; } + void SetRepeat(bool r) { repeat = r; } 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(); - } - bool Running() const { - return timer.Running() && (repeat || timer.Iteration() < numFrames); - } - void Draw(SDL_Surface *dest, geometry::Point position) { - sprite->Draw(dest, position, col, Running() ? row + (timer.Iteration() % numFrames) : row); - } + virtual int NumFrames() const = 0; + virtual int Col(int frame) const = 0; + virtual int Row(int frame) const = 0; + virtual math::Vector Offset(int frame) const { return math::Vector(); } + + static void CreateTypeDescription(); + +protected: + static void AddFields(loader::TypeDescription &, const Animation &, std::ptrdiff_t offset); private: const Sprite *sprite; - app::Timer timer; int frameTime; - int numFrames; - int col; - int row; 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(); } + + 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; } + + void SetFrameShift(int offset) { frameShift = offset; } + int FrameShift() const { return frameShift; } + void SetColOffset(int offset) { colOffset = offset; } + int ColOffset() const { return colOffset; } + void SetRowOffset(int offset) { rowOffset = offset; } + int RowOffset() const { return rowOffset; } + + void ChangeAnimation(const Animation *a) { animation = a; } + const Animation *GetAnimation() const { return animation; } + + void ChangeSprite(const Sprite *s) { sprite = s; } + const Sprite *GetSprite() const { return sprite ? sprite : animation->GetSprite(); } + + 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; + const graphics::Sprite *sprite; + app::Timer timer; + int frameShift; + int colOffset; + int rowOffset; + +}; + } -#endif /* GRAPHICS_ANIMATION_H_ */ +#endif