TurtleBrains  0.3.5
High quality, portable, C++ framework for rapid 2D game development.
tb_animated_sprite.hpp
1 
9 #ifndef TurtleBrains_AnimatedSprite_hpp
10 #define TurtleBrains_AnimatedSprite_hpp
11 
12 #include <turtle_brains/graphics/tb_sprite.hpp>
13 #include <turtle_brains/graphics/tb_sprite_map.hpp>
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 
145  explicit AnimatedSprite(const tbCore::tbString& textureFile, const PixelSpace& frameX = 0, const PixelSpace& frameY = 0,
146  const PixelSpace& frameWidth = 0, const PixelSpace& frameHeight = 0, const size_t& frameCount = 1);
147 
158  AnimatedSprite(const tbCore::tbString& spriteSheetName, const tbCore::tbString& spriteName);
159 
165  AnimatedSprite(const AnimatedSprite& other);
166 
173  AnimatedSprite& operator=(const AnimatedSprite& other);
174 
178  virtual ~AnimatedSprite(void);
179 
190  void AddSequence(const tbCore::tbString& sequenceName, const AnimationSequence& sequence);
191 
203  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const std::vector<size_t>& frames);
204 
217  void AddMappedSequence(const tbCore::tbString& sequenceName, const SpriteMap& spriteMap, const size_t& startFrameIndex,
218  const size_t& frameCount);
219 
236  void PlayAnimation(const tbCore::tbString& sequenceName, const bool isLooping, const bool isForward = true,
237  const float timePerFrame = kDefaultTimePerFrame);
238 
245  void PlayAnimation(const tbCore::tbString& sequenceName);
246 
255  void StopAnimation(void);
256 
261  bool IsAnimationPlaying(void) const;
262 
270  bool IsAnimationPlaying(const tbCore::tbString& sequenceName) const;
271 
278  size_t GetFrameIndex(void) const { return mCurrentFrameIndex; }
279 
280  protected:
281 
286  virtual void OnUpdate(const float deltaTime) override;
287 
288  private:
289  tbCore::tbString GetNameOfCurrentSequence(void) const;
290  void SetCurrentSequenceTo(const tbCore::tbString& sequenceName);
291 
292  typedef std::map<tbCore::tbString, AnimationSequence> AnimationContainer;
293  AnimationContainer mAnimationSequences;
294 
295  const AnimationSequence* mCurrentSequence;
296  size_t mCurrentFrameIndex;
297  float mTimePerFrame;
298  float mFrameTimer;
299  bool mIsPlaying;
300  bool mIsLooping;
301  bool mIsForward;
302 
303  //The above could become the following for implementation to save space if it ever becomes a concern, will aim
304  //for mobile at some point with a few, reasonable? restrictions: Animation speed must be 1fps or faster and no
305  //animation can contain more than 256 frames.
306  //
307  // 4 bits: playing, looping, forward, pingpong
308  // 8 bits: currentFrameIndex (0-255)
309  // 10 bits: timePerFrame (milliseconds)
310  // 10 bits: frameTimer (milliseconds)
311  };
312 
313  }; /* namespace Graphics */
314 }; /* namespace TurtleBrains */
315 
317 
318 #endif /* TurtleBrains_AnimatedSprite_hpp */
319 
320 
321 /*
322 
323  The AnimatedSprite was designed for thse following usage patterns:
324 
325  //Essentially just load it up in a table and create an animated sprite. (data driven, most likely use case)
326  void FooSimple(void)
327  //Initialization
328  mPlayerSprite = tbGraphics::theSpriteManager.GetAnimatedSprite("player_sheet", "player");
329 
330  //Usage
331  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
332  mPlayerSprite.StopAnimation();
333 
334 
335  //Must support developer creating sprite frames themeselves:
336 
337  void FooMinimal(void)
338  //Initialization
339  mPlayerSprite = tbGraphics::theSpriteManager.GetSprite("player_sheet", "player");
340  AnimationSequence idleSequence();
341  //idleSequence.AddFrame(locationX, locationY, width, height);
342  idleSequence.AddFrame(0, 0, 32, 32);
343  idleSequence.AddFrame(32, 0, 32, 32);
344  idleSequence.AddFrame(64, 0, 32, 32);
345  idleSequence.AddFrame(0, 32, 64, 64); //This method allows size and location differences.
346  mPlayerSprite.AddSequence("idle", idleSequence);
347 
348  AnimationSequence shootSequence;
349  // blah blah, shootSequence.AddFrames()
350  mPlayerSprite.AddSequence("shoot", shootSequence);
351 
352  //Usage
353  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
354  mPlayerSprite.StopAnimation();
355 
356 
357 
358  void FooBetterMin(void)
359  //Initialization
360  mPlayerSprite = GetSprite("player_sheet", "player");
361  //Create a sequence of 3 - 32x32 frames starting at frame 0 on the sheet.
362 
363  //Too much effort
364  // AnimationSequence idleSequence();
365  // idleSequence.AddMappedFrames();
366  // mPlayerSprite.AddSequence("idle", idleSequence);
367 
368  mPlayerSprite.AddSequence("idle", tbGraphics::CreateMappedAnimationSequence(32, 32, 0, 3));
369  //mPlayerSprite.AddSequence("shoot", AnimationSequence(32, 32, { 0, 1, 3, 4 }));
370  mPlayerSprite.AddMappedSequence("shoot", 32, 32, { 0, 1, 3, 4});
371 
372  //Usage
373  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
374  mPlayerSprite.StopAnimation();
375  */
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.hpp:29
void PlayAnimation(const tbCore::tbString &sequenceName, const bool isLooping, const bool isForward=true, const float timePerFrame=kDefaultTimePerFrame)
Here is some information about the primary namespace.
Definition: tb_application_dialog.hpp:21
Definition: tb_animated_sprite.hpp:29
static const float & kDefaultTimePerFrame
Definition: tb_animated_sprite.hpp:129
tbCore::uint16 PixelSpace
Definition: tb_texture_manager.hpp:36
Definition: tb_sprite_map.hpp: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.hpp:335
void AddSequence(const tbCore::tbString &sequenceName, const AnimationSequence &sequence)
Definition: tb_animated_sprite.hpp:119
Definition: tb_sprite.hpp:136
size_t GetFrameIndex(void) const
Definition: tb_animated_sprite.hpp:278