CCreatureAnimation.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * CCreatureAnimation.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "../../lib/FunctionList.h"
  12. #include "../widgets/Images.h"
  13. #include "../gui/CAnimation.h"
  14. class CIntObject;
  15. class CCreatureAnimation;
  16. /// Namespace for some common controls of animations
  17. namespace AnimationControls
  18. {
  19. /// get SDL_Color for creature selection borders
  20. SDL_Color getBlueBorder();
  21. SDL_Color getGoldBorder();
  22. SDL_Color getNoBorder();
  23. /// creates animation object with preset speed control
  24. CCreatureAnimation * getAnimation(const CCreature * creature);
  25. /// returns animation speed of specific group, taking in mind game setting (in frames per second)
  26. float getCreatureAnimationSpeed(const CCreature * creature, const CCreatureAnimation * anim, size_t groupID);
  27. /// returns how far projectile should move each frame
  28. /// TODO: make it time-based
  29. float getProjectileSpeed();
  30. /// returns speed of any spell effects, including any special effects like morale (in frames per second)
  31. float getSpellEffectSpeed();
  32. /// returns duration of full movement animation, in seconds. Needed to move animation on screen
  33. float getMovementDuration(const CCreature * creature);
  34. /// Returns distance on which flying creatures should during one animation loop
  35. float getFlightDistance(const CCreature * creature);
  36. }
  37. /// Class which manages animations of creatures/units inside battles
  38. /// TODO: split into constant image container and class that does *control* of animation
  39. class CCreatureAnimation : public CIntObject
  40. {
  41. public:
  42. typedef std::function<float(CCreatureAnimation *, size_t)> TSpeedController;
  43. private:
  44. std::string name;
  45. std::shared_ptr<CAnimation> forward;
  46. std::shared_ptr<CAnimation> reverse;
  47. int fullWidth;
  48. int fullHeight;
  49. // speed of animation, measure in frames per second
  50. float speed;
  51. // currently displayed frame. Float to allow H3-style animations where frames
  52. // don't display for integer number of frames
  53. float currentFrame;
  54. // cumulative, real-time duration of animation. Used for effects like selection border
  55. float elapsedTime;
  56. CCreatureAnim::EAnimType type; //type of animation being displayed
  57. // border color, disabled if alpha = 0
  58. SDL_Color border;
  59. TSpeedController speedController;
  60. bool once; // animation will be played once and the reset to idling
  61. void endAnimation();
  62. void genBorderPalette(IImage::BorderPallete & target);
  63. public:
  64. // function(s) that will be called when animation ends, after reset to 1st frame
  65. // NOTE that these function will be fired only once
  66. CFunctionList<void()> onAnimationReset;
  67. int getWidth() const;
  68. int getHeight() const;
  69. /// Constructor
  70. /// name - path to .def file, relative to SPRITES/ directory
  71. /// controller - function that will return for how long *each* frame
  72. /// in specified group of animation should be played, measured in seconds
  73. CCreatureAnimation(const std::string & name_, TSpeedController speedController);
  74. void setType(CCreatureAnim::EAnimType type); //sets type of animation and cleares framecount
  75. CCreatureAnim::EAnimType getType() const; //returns type of animation
  76. void nextFrame(SDL_Surface * dest, bool attacker);
  77. // should be called every frame, return true when animation was reset to beginning
  78. bool incrementFrame(float timePassed);
  79. void setBorderColor(SDL_Color palette);
  80. float getCurrentFrame() const; // Gets the current frame ID relative to frame group.
  81. void playOnce(CCreatureAnim::EAnimType type); //plays once given stage of animation, then resets to 2
  82. int framesInGroup(CCreatureAnim::EAnimType group) const; //retirns number of fromes in given group
  83. void pause();
  84. void play();
  85. //helpers. TODO: move them somewhere else
  86. bool isDead() const;
  87. bool isIdle() const;
  88. bool isMoving() const;
  89. bool isShooting() const;
  90. };