Bariere.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "Bariere.h"
  2. #include "Spiel.h"
  3. #include "Ereignis.h"
  4. Bariere::Bariere( ResourceRegistry *zResources, int id, int x, int y, int breite, int height, int style, int verschiebungWeite, int autoSchaltungMaxTime, Team *team )
  5. : GameObject( BARIERE, x, y, breite, height )
  6. {
  7. this->id = id;
  8. this->style = style;
  9. this->autoSchaltungMaxTime = autoSchaltungMaxTime;
  10. autoSchaltungCurrentTime = (float)autoSchaltungMaxTime;
  11. this->verschiebungWeite = verschiebungWeite;
  12. currentWeite = 0;
  13. verschiebungAnzahl = 0;
  14. schaltungAnzahl = 0;
  15. this->team = team;
  16. this->resources = dynamic_cast<ResourceRegistry *>( zResources->getThis() );
  17. if( breite > height )
  18. this->textur = dynamic_cast<Bild *>( resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages()->getThis() );
  19. else
  20. {
  21. Bild *r = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages();
  22. this->textur = new Bild();
  23. this->textur->neuBild( r->getHeight(), r->getBreite(), 0 );
  24. this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r );
  25. }
  26. }
  27. Bariere::~Bariere()
  28. {
  29. if( team )
  30. team->release();
  31. resources->release();
  32. }
  33. void Bariere::setStyle( int style, bool add, Spiel *zSpiel )
  34. {
  35. if( add )
  36. {
  37. if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) != this->style )
  38. zSpiel->setZuletztEingeschalteteBariere( dynamic_cast<Bariere *>( getThis() ) );
  39. this->style |= style;
  40. }
  41. else
  42. {
  43. if( ( style | Style::Aktiv ) == style && ( this->style | Style::Aktiv ) == this->style )
  44. zSpiel->setZuletztAusgeschalteteBariere( dynamic_cast<Bariere *>( getThis() ) );
  45. this->style &= ~style;
  46. }
  47. }
  48. void Bariere::setAutoVerschiebungWeite( int pixel )
  49. {
  50. verschiebungWeite = pixel;
  51. }
  52. void Bariere::startAutoVerschiebung( Spiel *zSpiel )
  53. {
  54. if( !hatStyle( Style::AutoVerschiebung ) || hatStyle( Style::InVerschiebung ) )
  55. return;
  56. zSpiel->setZuletztBewegteBariere( dynamic_cast<Bariere *>( getThis() ) );
  57. currentWeite = 0;
  58. setStyle( Style::InVerschiebung, 1, zSpiel );
  59. Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN );
  60. e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
  61. e->addParameter( "Status", new String( "Start" ) );
  62. zSpiel->throwEvent( e );
  63. }
  64. void Bariere::setAutoSchaltungMaxTime( int seconds )
  65. {
  66. autoSchaltungMaxTime = seconds;
  67. }
  68. void Bariere::startAutoSchaltung( Spiel *zSpiel )
  69. {
  70. if( !hatStyle( Style::AutoSchaltung ) || hatStyle( Style::InSchaltung ) )
  71. return;
  72. autoSchaltungCurrentTime = (float)autoSchaltungMaxTime;
  73. setStyle( Style::InSchaltung, 1, zSpiel );
  74. }
  75. void Bariere::setTeam( Team *team )
  76. {
  77. if( this->team )
  78. this->team->release();
  79. this->team = team;
  80. if( this->textur )
  81. this->textur->release();
  82. if( w > h )
  83. this->textur = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImage( 0 );
  84. else
  85. {
  86. Bild *r = resources->zResource( R_BARIERE, team ? team->getFarbe() : 0 )->getImages();
  87. this->textur = new Bild();
  88. this->textur->neuBild( r->getHeight(), r->getBreite(), 0 );
  89. this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r );
  90. }
  91. }
  92. void Bariere::tick( double time, Spiel *zSpiel )
  93. {
  94. if( hatStyle( Style::InSchaltung ) )
  95. {
  96. autoSchaltungCurrentTime -= (float)time;
  97. if( autoSchaltungCurrentTime < 0 )
  98. {
  99. setStyle( Style::InSchaltung, 0, zSpiel );
  100. setStyle( Style::Aktiv, !hatStyle( Style::Aktiv ), zSpiel );
  101. schaltungAnzahl++;
  102. Ereignis *e = new Ereignis( BARIERE_SWITCHED );
  103. e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
  104. zSpiel->throwEvent( e );
  105. }
  106. }
  107. if( hatStyle( Style::InVerschiebung ) )
  108. {
  109. float last = currentWeite;
  110. currentWeite += (float)time * 10;
  111. if( currentWeite >= verschiebungWeite )
  112. {
  113. currentWeite = (float)verschiebungWeite;
  114. setStyle( Style::InVerschiebung, 0, zSpiel );
  115. setStyle( Style::NextVerschiebungLinksOben, !hatStyle( Style::NextVerschiebungLinksOben ), zSpiel );
  116. verschiebungAnzahl++;
  117. Ereignis *e = new Ereignis( BARIERE_WIRD_VERSCHOBEN );
  118. e->addParameter( "Betroffene Bariere", dynamic_cast<Bariere *>( getThis() ) );
  119. e->addParameter( "Status", new String( "Feritg" ) );
  120. zSpiel->throwEvent( e );
  121. }
  122. if( hatStyle( Style::VerschiebungWaagerecht ) )
  123. {
  124. if( hatStyle( Style::NextVerschiebungLinksOben ) )
  125. setX( getX() + last - currentWeite );
  126. else
  127. setX( getX() - last + currentWeite );
  128. }
  129. else
  130. {
  131. if( hatStyle( Style::NextVerschiebungLinksOben ) )
  132. setY( getY() + last - currentWeite );
  133. else
  134. setY( getY() - last + currentWeite );
  135. }
  136. }
  137. }
  138. void Bariere::render( Bild &rObj )
  139. {
  140. if( !hatStyle( Style::Aktiv ) )
  141. rObj.setAlpha( 0x77 );
  142. GameObject::render( rObj );
  143. if( !hatStyle( Style::Aktiv ) )
  144. rObj.releaseAlpha();
  145. }
  146. bool Bariere::hatStyle( int style ) const
  147. {
  148. return ( this->style | style ) == this->style;
  149. }
  150. int Bariere::getVerschiebungAnzahl() const
  151. {
  152. return verschiebungAnzahl;
  153. }
  154. int Bariere::getSchaltungAnzahl() const
  155. {
  156. return schaltungAnzahl;
  157. }
  158. int Bariere::getId() const
  159. {
  160. return id;
  161. }
  162. Team *Bariere::getTeam() const
  163. {
  164. if( !team )
  165. return 0;
  166. return dynamic_cast<Team *>( team->getThis() );
  167. }
  168. Team *Bariere::zTeam() const
  169. {
  170. return team;
  171. }