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::Graphics
19 {
20 
28  {
29  public:
30 
39  explicit AnimationSequence(const TextureHandle& textureHandle);
40 
52  AnimationSequence(const SpriteMap& spriteMap, const std::vector<size_t>& frames);
53 
65  AnimationSequence(const SpriteMap& spriteMap, const size_t& startFrameIndex, const size_t& frameCount);
66 
71 
79  void AddFrame(const SpriteFrame& frame);
80 
91  void AddFrame(const PixelSpace& frameX, const PixelSpace& frameY, const PixelSpace& frameWidth, const PixelSpace& frameHeight);
92 
96  size_t GetFrameCount(void) const;
97 
103  const SpriteFrame& GetFrame(const size_t& frameIndex) const;
104 
105  private:
106  //Animation Size: 36 (bytes per frame) * frames + 8 (bytes minimum for this)
107  //This could greatly reduce size by hold SpriteFrame references, but added cost of complexity and easy usage.
108  TextureHandle mTexture;
109  std::vector<SpriteFrame> mAnimationFrames;
110  };
111 
112 
117  class AnimatedSprite : public Sprite
118  {
119  public:
127  static const float& kDefaultTimePerFrame;
128 
132  static void SetAnimationFrameRate(const int framesPerSecond);
133 
141  explicit AnimatedSprite(const SpriteFrame& spriteFrame);
142 
143  explicit AnimatedSprite(const String& textureFile, const PixelSpace& frameX = 0, const PixelSpace& frameY = 0,
144  const PixelSpace& frameWidth = 0, const PixelSpace& frameHeight = 0, const size_t& frameCount = 1);
145 
156  AnimatedSprite(const String& spriteSheetName, const String& spriteName);
157 
164 
172 
176  virtual ~AnimatedSprite(void);
177 
188  void AddSequence(const String& sequenceName, const AnimationSequence& sequence);
189 
201  void AddMappedSequence(const String& sequenceName, const SpriteMap& spriteMap, const std::vector<size_t>& frames);
202 
215  void AddMappedSequence(const String& sequenceName, const SpriteMap& spriteMap, const size_t& startFrameIndex,
216  const size_t& frameCount);
217 
234  void PlayAnimation(const String& sequenceName, const bool isLooping, const bool isForward = true,
235  const float timePerFrame = kDefaultTimePerFrame);
236 
243  void PlayAnimation(const String& sequenceName);
244 
253  void StopAnimation(void);
254 
259  bool IsAnimationPlaying(void) const;
260 
268  bool IsAnimationPlaying(const String& sequenceName) const;
269 
276  size_t GetFrameIndex(void) const { return mCurrentFrameIndex; }
277 
278  protected:
279 
284  virtual void OnUpdate(const float deltaTime) override;
285 
286  private:
287  String GetNameOfCurrentSequence(void) const;
288  void SetCurrentSequenceTo(const String& sequenceName);
289 
290  typedef std::map<String, AnimationSequence> AnimationContainer;
291  AnimationContainer mAnimationSequences;
292 
293  const AnimationSequence* mCurrentSequence;
294  size_t mCurrentFrameIndex;
295  float mTimePerFrame;
296  float mFrameTimer;
297  bool mIsPlaying;
298  bool mIsLooping;
299  bool mIsForward;
300 
301  //The above could become the following for implementation to save space if it ever becomes a concern, will aim
302  //for mobile at some point with a few, reasonable? restrictions: Animation speed must be 1fps or faster and no
303  //animation can contain more than 256 frames.
304  //
305  // 4 bits: playing, looping, forward, pingpong
306  // 8 bits: currentFrameIndex (0-255)
307  // 10 bits: timePerFrame (milliseconds)
308  // 10 bits: frameTimer (milliseconds)
309  };
310 
311 }; /* namespace TurtleBrains::Graphics */
312 
314 
315 #endif /* TurtleBrains_AnimatedSprite_hpp */
316 
317 
318 /*
319 
320  The AnimatedSprite was designed for thse following usage patterns:
321 
322  //Essentially just load it up in a table and create an animated sprite. (data driven, most likely use case)
323  void FooSimple(void)
324  //Initialization
325  mPlayerSprite = tbGraphics::theSpriteManager.GetAnimatedSprite("player_sheet", "player");
326 
327  //Usage
328  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
329  mPlayerSprite.StopAnimation();
330 
331 
332  //Must support developer creating sprite frames themeselves:
333 
334  void FooMinimal(void)
335  //Initialization
336  mPlayerSprite = tbGraphics::theSpriteManager.GetSprite("player_sheet", "player");
337  AnimationSequence idleSequence();
338  //idleSequence.AddFrame(locationX, locationY, width, height);
339  idleSequence.AddFrame(0, 0, 32, 32);
340  idleSequence.AddFrame(32, 0, 32, 32);
341  idleSequence.AddFrame(64, 0, 32, 32);
342  idleSequence.AddFrame(0, 32, 64, 64); //This method allows size and location differences.
343  mPlayerSprite.AddSequence("idle", idleSequence);
344 
345  AnimationSequence shootSequence;
346  // blah blah, shootSequence.AddFrames()
347  mPlayerSprite.AddSequence("shoot", shootSequence);
348 
349  //Usage
350  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
351  mPlayerSprite.StopAnimation();
352 
353 
354 
355  void FooBetterMin(void)
356  //Initialization
357  mPlayerSprite = GetSprite("player_sheet", "player");
358  //Create a sequence of 3 - 32x32 frames starting at frame 0 on the sheet.
359 
360  //Too much effort
361  // AnimationSequence idleSequence();
362  // idleSequence.AddMappedFrames();
363  // mPlayerSprite.AddSequence("idle", idleSequence);
364 
365  mPlayerSprite.AddSequence("idle", tbGraphics::CreateMappedAnimationSequence(32, 32, 0, 3));
366  //mPlayerSprite.AddSequence("shoot", AnimationSequence(32, 32, { 0, 1, 3, 4 }));
367  mPlayerSprite.AddMappedSequence("shoot", 32, 32, { 0, 1, 3, 4});
368 
369  //Usage
370  mPlayerSprite.PlayAnimation("idle"); / LoopAnimation("idle")
371  mPlayerSprite.StopAnimation();
372  */
Definition: tb_animated_sprite.hpp:118
void PlayAnimation(const String &sequenceName)
static const float & kDefaultTimePerFrame
Definition: tb_animated_sprite.hpp:127
AnimatedSprite & operator=(const AnimatedSprite &other)
void AddSequence(const String &sequenceName, const AnimationSequence &sequence)
virtual void OnUpdate(const float deltaTime) override
size_t GetFrameIndex(void) const
Definition: tb_animated_sprite.hpp:276
bool IsAnimationPlaying(const String &sequenceName) const
void AddMappedSequence(const String &sequenceName, const SpriteMap &spriteMap, const std::vector< size_t > &frames)
AnimatedSprite(const AnimatedSprite &other)
void PlayAnimation(const String &sequenceName, const bool isLooping, const bool isForward=true, const float timePerFrame=kDefaultTimePerFrame)
AnimatedSprite(const SpriteFrame &spriteFrame)
static void SetAnimationFrameRate(const int framesPerSecond)
void AddMappedSequence(const String &sequenceName, const SpriteMap &spriteMap, const size_t &startFrameIndex, const size_t &frameCount)
AnimatedSprite(const String &spriteSheetName, const String &spriteName)
Definition: tb_animated_sprite.hpp:28
AnimationSequence(const TextureHandle &textureHandle)
AnimationSequence(const SpriteMap &spriteMap, const size_t &startFrameIndex, const size_t &frameCount)
const SpriteFrame & GetFrame(const size_t &frameIndex) const
void AddFrame(const SpriteFrame &frame)
void AddFrame(const PixelSpace &frameX, const PixelSpace &frameY, const PixelSpace &frameWidth, const PixelSpace &frameHeight)
AnimationSequence(const SpriteMap &spriteMap, const std::vector< size_t > &frames)
Definition: tb_sprite.hpp:135
Definition: tb_sprite_map.hpp:22
Give the GameScene and Entities something to display, Text, Sprites and AnimatedSprites help bring th...
tbCore::uint16 PixelSpace
Definition: tb_texture_manager.hpp:34
Definition: tb_sprite.hpp:28