Textur2D.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "Textur2D.h"
  2. #include "Animation.h"
  3. #include "Bild.h"
  4. using namespace Framework;
  5. // inhalt der Textur2D Klasse aus Textur2D.h
  6. // Konstructor
  7. Textur2D::Textur2D()
  8. : ReferenceCounter()
  9. {
  10. circularAnimation = 0;
  11. animationIndex = -1;
  12. txt = 0;
  13. animData = new Array<Animation*>();
  14. }
  15. // Destructor
  16. Textur2D::~Textur2D()
  17. {
  18. if (txt) txt->release();
  19. for (auto i : *animData)
  20. {
  21. i->data->release();
  22. delete i;
  23. }
  24. animData->release();
  25. }
  26. // Legt fest, ob die animation sich automatisch wiederhohlen soll
  27. // ca: 1, falls sich die animation automatisch wiederhohlen soll
  28. void Textur2D::setCircularAnimation(bool ca)
  29. {
  30. circularAnimation = ca;
  31. }
  32. // setzt einen Zeiger auf die Textur (fals nicht animiert)
  33. // textur: Der Zeiger auf das Bild
  34. void Textur2D::setTexturZ(Bild* textur)
  35. {
  36. if (txt) txt->release();
  37. txt = textur;
  38. }
  39. // fügt eine Animation hinzu
  40. // textur: Der Zeiger auf die Animationsdaten
  41. void Textur2D::addAnimationZ(Animation2DData* textur)
  42. {
  43. animData->add(new Animation{textur, 0, 0});
  44. }
  45. // setzt die aktuelle Annimation
  46. // index: Der Index der Animation
  47. void Textur2D::setAnimation(int index)
  48. {
  49. if (animationIndex == index) return;
  50. if (animationIndex != -1)
  51. {
  52. animData->get(animationIndex)->jetzt = 0;
  53. animData->get(animationIndex)->ausgleich = 0;
  54. }
  55. animationIndex = index;
  56. int anz = animData->getEintragAnzahl();
  57. if (animationIndex >= anz && (!circularAnimation || anz == 0))
  58. animationIndex = -1;
  59. else if (animationIndex >= anz)
  60. animationIndex = 0;
  61. }
  62. // aktiviert die nachfolgende animation
  63. void Textur2D::nextAnimation()
  64. {
  65. if (animationIndex != -1)
  66. {
  67. animData->get(animationIndex)->jetzt = 0;
  68. animData->get(animationIndex)->ausgleich = 0;
  69. }
  70. animationIndex++;
  71. int anz = animData->getEintragAnzahl();
  72. if (animationIndex >= anz && (!circularAnimation || anz == 0))
  73. animationIndex = -1;
  74. else if (animationIndex >= anz)
  75. animationIndex = 0;
  76. }
  77. // setzt die vergangene Zeit seit dem letzten Aufruf
  78. // t: die vergangene Zeit in sekunden
  79. bool Textur2D::tick(double t)
  80. {
  81. if (animationIndex != -1)
  82. {
  83. Animation* a = animData->get(animationIndex);
  84. a->ausgleich += t;
  85. int tmp = a->jetzt;
  86. int tmp2 = animationIndex;
  87. a->data->lock();
  88. if (a->ausgleich >= 1.0 / a->data->getFPS())
  89. {
  90. a->ausgleich -= 1.0 / a->data->getFPS();
  91. if (++(a->jetzt) >= a->data->getBildAnzahl())
  92. {
  93. a->jetzt = 0;
  94. if (!a->data->istWiederhohlend()) nextAnimation();
  95. }
  96. }
  97. a->data->unlock();
  98. if (tmp != a->jetzt || tmp2 != animationIndex) return 1;
  99. }
  100. return 0;
  101. }
  102. // gibt die aktuelle Textur zurück
  103. Bild* Textur2D::zTextur() const
  104. {
  105. if (animationIndex != -1)
  106. return animData->get(animationIndex)
  107. ->data->zBild(animData->get(animationIndex)->jetzt);
  108. return txt;
  109. }