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 
15 #include <vector>
16 #include <map>
17 
18 namespace TurtleBrains
19 {
20  namespace Graphics
21  {
22 
30  {
31  public:
32 
41  explicit AnimationSequence(const TextureHandle& textureHandle);
42 
54  AnimationSequence(const SpriteMap& spriteMap, const std::vector<size_t> frames);
55 
67  AnimationSequence(const SpriteMap& spriteMap, const size_t& startFrameIndex, const size_t& frameCount);
68 
72  ~AnimationSequence(void);
73 
81  void AddFrame(const SpriteFrame& frame);
82 
93  void AddFrame(const PixelSpace& frameX, const PixelSpace& frameY, const PixelSpace& frameWidth, const PixelSpace& frameHeight);
94 
98  size_t GetFrameCount(void) const;
99 
105  const SpriteFrame& GetFrame(const size_t& frameIndex) const;
106 
107  private:
108  //Animation Size: 36 (bytes per frame) * frames + 8 (bytes minimum for this)
109  //This could greatly reduce size by hold SpriteFrame references, but added cost of complexity and easy usage.
110  TextureHandle mTexture;
111  std::vector<SpriteFrame> mAnimationFrames;
112  };
113 
114 
119  class AnimatedSprite : public Sprite
120  {
121  public:
129  static const float& kDefaultTimePerFrame;
130 
134  static void SetAnimationFrameRate(const int framesPerSecond);
135 
143  explicit AnimatedSprite(const SpriteFrame& spriteFrame);
144 
155  AnimatedSprite(const tbCore::tbString& spriteSheetName, const tbCore::tbString& spriteName);
156 
162  AnimatedSprite(const AnimatedSprite& other);
163 
170  AnimatedSprite& operator=(const AnimatedSprite& other);
171 
175  virtual ~AnimatedSprite(void);
176 
187  void AddSequence(const tbCore::tbString& sequenceName, const AnimationSequence& sequence);
188 
200  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const std::vector<size_t> frames);
201 
214  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const size_t& startFrameIndex,
215  const size_t& frameCount);
216 
233  void PlayAnimation(const tbCore::tbString& sequenceName, const bool isLooping, const bool isForward = true,
234  const float timePerFrame = kDefaultTimePerFrame);
235 
242  void PlayAnimation(const tbCore::tbString& sequenceName);
243 
252  void StopAnimation(void);
253 
258  bool IsAnimationPlaying(void) const;
259 
267  bool IsAnimationPlaying(const tbCore::tbString& sequenceName) const;
268 
275  size_t GetFrameIndex(void) const { return mCurrentFrameIndex; }
276 
277  protected:
278 
283  virtual void OnUpdate(const float deltaTime) override;
284 
285  private:
286  typedef std::map<tbCore::tbString, AnimationSequence> AnimationContainer;
287  AnimationContainer mAnimationSequences;
288 
289  const AnimationSequence* mCurrentSequence;
290  size_t mCurrentFrameIndex;
291  float mTimePerFrame;
292  float mFrameTimer;
293  bool mIsPlaying;
294  bool mIsLooping;
295  bool mIsForward;
296 
297  //The above could become the following for implementation to save space if it ever becomes a concern, will aim
298  //for mobile at some point with a few, reasonable? restrictions: Animation speed must be 1fps or faster and no
299  //animation can contain more than 256 frames.
300  //
301  // 4 bits: playing, looping, forward, pingpong
302  // 8 bits: currentFrameIndex (0-255)
303  // 10 bits: timePerFrame (milliseconds)
304  // 10 bits: frameTimer (milliseconds)
305  };
306 
307  }; /* namespace Graphics */
308 }; /* namespace TurtleBrains */
309 
311 
312 #endif /* _TurtleBrains_AnimatedSprite_h_ */
313 
314 
315 /*
316 
317  The AnimatedSprite was designed for thse following usage patterns:
318 
319  //Essentially just load it up in a table and create an animated sprite. (data driven, most likely use case)
320  void FooSimple(void)
321  //Initialization
322  mPlayerSprite = tbGraphics::theSpriteManager.GetAnimatedSprite("player_sheet", "player");
323 
324  //Usage
325  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
326  mPlayerSprite.StopAnimation();
327 
328 
329  //Must support developer creating sprite frames themeselves:
330 
331  void FooMinimal(void)
332  //Initialization
333  mPlayerSprite = tbGraphics::theSpriteManager.GetSprite("player_sheet", "player");
334  AnimationSequence idleSequence();
335  //idleSequence.AddFrame(locationX, locationY, width, height);
336  idleSequence.AddFrame(0, 0, 32, 32);
337  idleSequence.AddFrame(32, 0, 32, 32);
338  idleSequence.AddFrame(64, 0, 32, 32);
339  idleSequence.AddFrame(0, 32, 64, 64); //This method allows size and location differences.
340  mPlayerSprite.AddSequence("idle", idleSequence);
341 
342  AnimationSequence shootSequence;
343  // blah blah, shootSequence.AddFrames()
344  mPlayerSprite.AddSequence("shoot", shootSequence);
345 
346  //Usage
347  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
348  mPlayerSprite.StopAnimation();
349 
350 
351 
352  void FooBetterMin(void)
353  //Initialization
354  mPlayerSprite = GetSprite("player_sheet", "player");
355  //Create a sequence of 3 - 32x32 frames starting at frame 0 on the sheet.
356 
357  //Too much effort
358  // AnimationSequence idleSequence();
359  // idleSequence.AddMappedFrames();
360  // mPlayerSprite.AddSequence("idle", idleSequence);
361 
362  mPlayerSprite.AddSequence("idle", tbGraphics::CreateMappedAnimationSequence(32, 32, 0, 3));
363  //mPlayerSprite.AddSequence("shoot", AnimationSequence(32, 32, { 0, 1, 3, 4 }));
364  mPlayerSprite.AddMappedSequence("shoot", 32, 32, { 0, 1, 3, 4});
365 
366  //Usage
367  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
368  mPlayerSprite.StopAnimation();
369  */
static void SetAnimationFrameRate(const int framesPerSecond)
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:29
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:29
static const float & kDefaultTimePerFrame
Definition: tb_animated_sprite.h:129
tbCore::uint16 PixelSpace
Definition: tb_texture_manager.h:33
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:335
void AddSequence(const tbCore::tbString &sequenceName, const AnimationSequence &sequence)
Definition: tb_animated_sprite.h:119
Definition: tb_sprite.h:128
size_t GetFrameIndex(void) const
Definition: tb_animated_sprite.h:275