TurtleBrains  0.2.1
High quality, portable, C++ API for native application and game development.
tb_animated_sprite.h
1 
9 #ifndef _TurtleBrains_AnimatedSprite_h_
10 #define _TurtleBrains_AnimatedSprite_h_
11 
12 #include "tb_sprite.h"
13 #include "tb_sprite_map.h"
14 #include <vector>
15 #include <map>
16 
17 namespace TurtleBrains
18 {
19  namespace Graphics
20  {
21 
29  {
30  public:
31 
40  explicit AnimationSequence(const TextureHandle& textureHandle);
41 
53  AnimationSequence(const SpriteMap& spriteMap, const std::vector<size_t> frames);
54 
66  AnimationSequence(const SpriteMap& spriteMap, const size_t& startFrameIndex, const size_t& frameCount);
67 
71  ~AnimationSequence(void);
72 
80  void AddFrame(const SpriteFrame& frame);
81 
92  void AddFrame(const PixelSpace& frameX, const PixelSpace& frameY, const PixelSpace& frameWidth, const PixelSpace& frameHeight);
93 
97  size_t GetFrameCount(void) const;
98 
104  const SpriteFrame& GetFrame(const size_t& frameIndex) const;
105 
106  private:
107  //Animation Size: 36 (bytes per frame) * frames + 8 (bytes minimum for this)
108  //This could greatly reduce size by hold SpriteFrame references, but added cost of complexity and easy usage.
109  TextureHandle mTexture;
110  std::vector<SpriteFrame> mAnimationFrames;
111  };
112 
113 
118  class AnimatedSprite : public Sprite
119  {
120  public:
128  static const float kDefaultTimePerFrame;
129 
137  explicit AnimatedSprite(const SpriteFrame& spriteFrame);
138 
144  AnimatedSprite(const AnimatedSprite& other);
145 
152  AnimatedSprite& operator=(const AnimatedSprite& other);
153 
157  virtual ~AnimatedSprite(void);
158 
169  void AddSequence(const tbCore::tbString& sequenceName, const AnimationSequence& sequence);
170 
182  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const std::vector<size_t> frames);
183 
196  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const size_t& startFrameIndex,
197  const size_t& frameCount);
198 
215  void PlayAnimation(const tbCore::tbString& sequenceName, const bool isLooping, const bool isForward = true,
216  const float timePerFrame = kDefaultTimePerFrame);
217 
224  void PlayAnimation(const tbCore::tbString& sequenceName);
225 
234  void StopAnimation(void);
235 
240  bool IsAnimationPlaying(void) const;
241 
247  size_t GetFrameIndex(void) const { return mCurrentFrameIndex; }
248 
254  bool IsPlayingAnimation(const tbCore::tbString& sequenceName) const;
255 
256  protected:
257 
262  virtual void OnUpdate(const float deltaTime) override;
263 
264  private:
265  typedef std::map<tbCore::tbString, AnimationSequence> AnimationContainer;
266  AnimationContainer mAnimationSequences;
267 
268  const AnimationSequence* mCurrentSequence;
269  size_t mCurrentFrameIndex;
270  float mTimePerFrame;
271  float mFrameTimer;
272  bool mIsPlaying;
273  bool mIsLooping;
274  bool mIsForward;
275 
276  //The above could become the following for implementation to save space if it ever becomes a concern, will aim
277  //for mobile at some point with a few, reasonable? restrictions: Animation speed must be 1fps or faster and no
278  //animation can contain more than 256 frames.
279  //
280  // 4 bits: playing, looping, forward, pingpong
281  // 8 bits: currentFrameIndex (0-255)
282  // 10 bits: timePerFrame (milliseconds)
283  // 10 bits: frameTimer (milliseconds)
284  };
285 
286  }; /* namespace Graphics */
287 }; /* namespace TurtleBrains */
288 
290 
291 #endif /* _TurtleBrains_AnimatedSprite_h_ */
292 
293 
294 /*
295 
296  The AnimatedSprite was designed for thse following usage patterns:
297 
298  //Essentially just load it up in a table and create an animated sprite. (data driven, most likely use case)
299  void FooSimple(void)
300  //Initialization
301  mPlayerSprite = tbGraphics::theSpriteManager.GetAnimatedSprite("player_sheet", "player");
302 
303  //Usage
304  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
305  mPlayerSprite.StopAnimation();
306 
307 
308  //Must support developer creating sprite frames themeselves:
309 
310  void FooMinimal(void)
311  //Initialization
312  mPlayerSprite = tbGraphics::theSpriteManager.GetSprite("player_sheet", "player");
313  AnimationSequence idleSequence();
314  //idleSequence.AddFrame(locationX, locationY, width, height);
315  idleSequence.AddFrame(0, 0, 32, 32);
316  idleSequence.AddFrame(32, 0, 32, 32);
317  idleSequence.AddFrame(64, 0, 32, 32);
318  idleSequence.AddFrame(0, 32, 64, 64); //This method allows size and location differences.
319  mPlayerSprite.AddSequence("idle", idleSequence);
320 
321  AnimationSequence shootSequence;
322  // blah blah, shootSequence.AddFrames()
323  mPlayerSprite.AddSequence("shoot", shootSequence);
324 
325  //Usage
326  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
327  mPlayerSprite.StopAnimation();
328 
329 
330 
331  void FooBetterMin(void)
332  //Initialization
333  mPlayerSprite = GetSprite("player_sheet", "player");
334  //Create a sequence of 3 - 32x32 frames starting at frame 0 on the sheet.
335 
336  //Too much effort
337  // AnimationSequence idleSequence();
338  // idleSequence.AddMappedFrames();
339  // mPlayerSprite.AddSequence("idle", idleSequence);
340 
341  mPlayerSprite.AddSequence("idle", tbGraphics::CreateMappedAnimationSequence(32, 32, 0, 3));
342  //mPlayerSprite.AddSequence("shoot", AnimationSequence(32, 32, { 0, 1, 3, 4 }));
343  mPlayerSprite.AddMappedSequence("shoot", 32, 32, { 0, 1, 3, 4});
344 
345  //Usage
346  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
347  mPlayerSprite.StopAnimation();
348  */
void AddMappedSequence(const tbCore::tbString &sequenceName, const SpriteMap &spriteMap, const std::vector< size_t > frames)
AnimatedSprite(const SpriteFrame &spriteFrame)
Give the GameScene and Entities something to display, Text, Sprites and AnimatedSprites help bring th...
virtual void OnUpdate(const float deltaTime) override
Definition: tb_sprite.h:30
static const float kDefaultTimePerFrame
Definition: tb_animated_sprite.h:128
unsigned int TextureHandle
Definition: tb_texture_manager.h:41
void PlayAnimation(const tbCore::tbString &sequenceName, const bool isLooping, const bool isForward=true, const float timePerFrame=kDefaultTimePerFrame)
Contains all functions, classes and helpers related to game/application development written by Tim "B...
Definition: tb_application_dialog.h:21
Definition: tb_animated_sprite.h:28
tbCore::uint16 PixelSpace
Definition: tb_texture_manager.h:33
bool IsPlayingAnimation(const tbCore::tbString &sequenceName) const
Definition: tb_sprite_map.h:23
void AddFrame(const SpriteFrame &frame)
AnimationSequence(const TextureHandle &textureHandle)
AnimatedSprite & operator=(const AnimatedSprite &other)
const SpriteFrame & GetFrame(const size_t &frameIndex) const
std::string tbString
Definition: tb_string.h:293
void AddSequence(const tbCore::tbString &sequenceName, const AnimationSequence &sequence)
Definition: tb_animated_sprite.h:118
Definition: tb_sprite.h:145
size_t GetFrameIndex(void) const
Definition: tb_animated_sprite.h:247