Textur2D.cpp 3.4 KB

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