From 843c216fec572902bfae1fce95671b0d17aef946 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 20 Aug 2012 23:12:04 +0200 Subject: [PATCH] split animation running from animation definition --- src/graphics/Animation.h | 64 +++++++++++++++++++++------------ src/graphics/ComplexAnimation.h | 9 ++--- src/graphics/SimpleAnimation.h | 4 +-- 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/graphics/Animation.h b/src/graphics/Animation.h index 6af75d0..14966e9 100644 --- a/src/graphics/Animation.h +++ b/src/graphics/Animation.h @@ -24,17 +24,45 @@ class Animation { public: Animation() - : sprite(0), frameTime(0), colOffset(0), rowOffset(0), repeat(false) { } + : sprite(0), frameTime(0), repeat(false) { } Animation(const Sprite *sprite, int frameTime, bool repeat = false) - : sprite(sprite), frameTime(frameTime), colOffset(0), rowOffset(0), repeat(repeat) { } + : sprite(sprite), frameTime(frameTime), repeat(repeat) { } virtual ~Animation() { }; public: + + const Sprite *GetSprite() const { return sprite; } + void ChangeSprite(const Sprite *s) { sprite = s; } + int FrameTime() const { return frameTime; } + bool Repeat() const { return repeat; } + +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(); } + +private: + const Sprite *sprite; + int frameTime; + bool repeat; + +}; + + +class AnimationRunner { + +public: + explicit AnimationRunner(const Animation *a = 0) + : animation(a), colOffset(0), rowOffset(0) { } + +public: + bool Valid() const { return animation; } void Start(app::State &ctrl) { - timer = ctrl.GraphicsTimers().StartInterval(frameTime); + timer = ctrl.GraphicsTimers().StartInterval(animation->FrameTime()); } void Start(app::Application &ctrl) { - timer = ctrl.GlobalTimers().StartInterval(frameTime); + timer = ctrl.GlobalTimers().StartInterval(animation->FrameTime()); } void Stop() { timer = app::Timer(); @@ -43,13 +71,13 @@ public: return timer.Started(); } bool Running() const { - return timer.Running() && (repeat || timer.Iteration() < NumFrames()); + return timer.Running() && (animation->Repeat() || timer.Iteration() < animation->NumFrames()); } bool Finished() const { return Started() && !Running(); } bool JustFinished() const { - return timer.JustHit() && timer.Iteration() == NumFrames(); + return timer.JustHit() && timer.Iteration() == animation->NumFrames(); } const app::Timer &GetTimer() { return timer; } @@ -59,39 +87,29 @@ public: void SetRowOffset(int offset) { rowOffset = offset; } int RowOffset() const { return rowOffset; } - const Sprite *GetSprite() const { return sprite; } - void ChangeSprite(const Sprite *s) { sprite = s; } - - virtual void Draw(SDL_Surface *dest, geometry::Point position) const { - sprite->Draw(dest, position, Col() + ColOffset(), Row() + RowOffset()); + void Draw(SDL_Surface *dest, geometry::Point position) const { + animation->GetSprite()->Draw(dest, position + animation->Offset(Frame()), animation->Col(Frame()) + ColOffset(), animation->Row(Frame()) + RowOffset()); } void DrawTopRight(SDL_Surface *dest, geometry::Point position) const { - geometry::Vector offset(-sprite->Width(), 0); + geometry::Vector offset(-animation->GetSprite()->Width(), 0); Draw(dest, position + offset); } void DrawCenter(SDL_Surface *dest, geometry::Point position) const { - geometry::Vector offset(-sprite->Width() / 2, -sprite->Height() / 2); + geometry::Vector offset(-animation->GetSprite()->Width() / 2, -animation->GetSprite()->Height() / 2); Draw(dest, position + offset); } void DrawCenterBottom(SDL_Surface *dest, geometry::Point position) const { - geometry::Vector offset(-sprite->Width() / 2, -sprite->Height()); + geometry::Vector offset(-animation->GetSprite()->Width() / 2, -animation->GetSprite()->Height()); Draw(dest, position + offset); } - int Frame() const { return Running() ? (timer.Iteration() % NumFrames()) : 0; } - -protected: - virtual int Col() const = 0; - virtual int Row() const = 0; - virtual int NumFrames() const = 0; + int Frame() const { return Running() ? (timer.Iteration() % animation->NumFrames()) : 0; } private: - const Sprite *sprite; + const Animation *animation; app::Timer timer; - int frameTime; int colOffset; int rowOffset; - bool repeat; }; diff --git a/src/graphics/ComplexAnimation.h b/src/graphics/ComplexAnimation.h index a1ffaaa..2eeea94 100644 --- a/src/graphics/ComplexAnimation.h +++ b/src/graphics/ComplexAnimation.h @@ -32,14 +32,11 @@ public: } } - virtual void Draw(SDL_Surface *dest, geometry::Point position) const { - Animation::Draw(dest, position + frames[Frame()].disposition); - } - protected: - virtual int Col() const { return frames[Frame()].col; } - virtual int Row() const { return frames[Frame()].row; } virtual int NumFrames() const { return frames.size(); }; + virtual int Col(int frame) const { return frames[frame].col; } + virtual int Row(int frame) const { return frames[frame].row; } + virtual geometry::Vector Offset(int frame) const { return frames[frame].disposition; } private: struct FrameProp { diff --git a/src/graphics/SimpleAnimation.h b/src/graphics/SimpleAnimation.h index 3354328..d15c1d9 100644 --- a/src/graphics/SimpleAnimation.h +++ b/src/graphics/SimpleAnimation.h @@ -22,9 +22,9 @@ public: : Animation(sprite, frameTime, repeat), numFrames(numFrames), col(col), row(row) { } protected: - virtual int Col() const { return col; } - virtual int Row() const { return row + Frame(); } virtual int NumFrames() const { return numFrames; }; + virtual int Col(int frame) const { return col; } + virtual int Row(int frame) const { return row + frame; } private: int numFrames; -- 2.39.2