Geschoss.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include "Geschoss.h"
  2. #include "Spiel.h"
  3. Geschoss::Geschoss( ResourceRegistry *zResources, int id, float speed, GeschossTyp typ, Richtung r, int x, int y, Spieler *besitzer )
  4. : GameObject( GESCHOSS, x, y, 15, 15 )
  5. {
  6. this->speed = speed;
  7. this->richtung = r;
  8. this->besitzer = besitzer;
  9. resources = zResources->getThis();
  10. tunnelBenutzt = 0;
  11. umgelenkt = 0;
  12. geschosseGetroffen = 0;
  13. schalter = 0;
  14. texturScale = 1;
  15. this->id = id;
  16. setTyp( typ );
  17. }
  18. Geschoss::~Geschoss()
  19. {
  20. if( besitzer )
  21. besitzer->release();
  22. resources->release();
  23. }
  24. void Geschoss::invertDirection()
  25. {
  26. richtung = invert( richtung );
  27. }
  28. void Geschoss::addUmlenkung( Spiel *zSpiel )
  29. {
  30. zSpiel->setGeschossZuletztUmgelenkt( (Geschoss *)getThis() );
  31. umgelenkt++;
  32. }
  33. void Geschoss::addGeschossTreffer( Spiel *zSpiel )
  34. {
  35. zSpiel->setGeschossZuletztGeschossGetroffen( (Geschoss *)getThis() );
  36. geschosseGetroffen++;
  37. }
  38. void Geschoss::addTunnel( Spiel *zSpiel )
  39. {
  40. zSpiel->setGeschossZuletztTunnelBenutzt( (Geschoss *)getThis() );
  41. schalter++;
  42. }
  43. void Geschoss::addSchalter()
  44. {
  45. id++;
  46. }
  47. void Geschoss::setSpeed( float speed )
  48. {
  49. this->speed = speed;
  50. }
  51. void Geschoss::setBesitzer( Spieler *besitzer )
  52. {
  53. if( this->besitzer )
  54. this->besitzer->release();
  55. this->besitzer = besitzer;
  56. }
  57. void Geschoss::setTyp( GeschossTyp typ )
  58. {
  59. if( textur )
  60. textur->release();
  61. this->typ = typ;
  62. if( typ == GESCHOSS_PFEIL )
  63. {
  64. if( richtung == RECHTS )
  65. textur = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages()->getThis();
  66. else if( richtung == LINKS )
  67. {
  68. Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages();
  69. this->textur = new Bild();
  70. this->textur->neuBild( r->getBreite(), r->getHeight(), 0 );
  71. this->textur->drawBild180( 0, 0, r->getBreite(), r->getHeight(), *r );
  72. }
  73. else
  74. {
  75. Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages();
  76. this->textur = new Bild();
  77. this->textur->neuBild( r->getHeight(), r->getBreite(), 0 );
  78. if( richtung == UNTEN )
  79. this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r );
  80. else
  81. this->textur->drawBild270( 0, 0, r->getHeight(), r->getBreite(), *r );
  82. }
  83. if( richtung == OBEN || richtung == UNTEN )
  84. {
  85. setWidth( 7 );
  86. setHeight( 30 );
  87. }
  88. else
  89. {
  90. setWidth( 30 );
  91. setHeight( 7 );
  92. }
  93. }
  94. else if( typ == GESCHOSS_FEUERBALL )
  95. {
  96. setWidth( 20 );
  97. setHeight( 20 );
  98. currentImage = 0;
  99. nextImage = 0.075;
  100. textur = resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImages()->getThis();
  101. }
  102. else
  103. {
  104. setWidth( 15 );
  105. setHeight( 15 );
  106. if( typ == GESCHOSS_DRACHENAUGE )
  107. {
  108. currentImage = 0;
  109. nextImage = 0.075;
  110. textur = resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImages()->getThis();
  111. }
  112. if( typ == GESCHOSS_KUGEL )
  113. textur = resources->zResource( R_KUGEL_GESCHOSS, 0 )->getImages()->getThis();
  114. if( typ == GESCHOSS_MINE )
  115. textur = resources->zResource( R_MINE_GESCHOSS, 0 )->getImages()->getThis();
  116. }
  117. }
  118. void Geschoss::setRichtung( Richtung r )
  119. {
  120. richtung = r;
  121. }
  122. void Geschoss::tick( double zeit )
  123. {
  124. switch( richtung )
  125. {
  126. case OBEN:
  127. y -= (float)zeit * speed;
  128. break;
  129. case UNTEN:
  130. y += (float)zeit * speed;
  131. break;
  132. case RECHTS:
  133. x += (float)zeit * speed;
  134. break;
  135. case LINKS:
  136. x -= (float)zeit * speed;
  137. break;
  138. default:
  139. break;
  140. }
  141. if( typ == GESCHOSS_FEUERBALL )
  142. {
  143. nextImage -= zeit;
  144. if( nextImage <= 0 )
  145. {
  146. nextImage += 0.075;
  147. currentImage++;
  148. if( resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImageCount() >= currentImage )
  149. currentImage = 0;
  150. textur->release();
  151. textur = resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImage( currentImage );
  152. }
  153. }
  154. if( typ == GESCHOSS_DRACHENAUGE )
  155. {
  156. nextImage -= zeit;
  157. if( nextImage <= 0 )
  158. {
  159. nextImage += 0.075;
  160. currentImage++;
  161. if( resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImageCount() >= currentImage )
  162. currentImage = 0;
  163. textur->release();
  164. textur = resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImage( currentImage );
  165. }
  166. }
  167. }
  168. GeschossTyp Geschoss::getTyp() const
  169. {
  170. return typ;
  171. }
  172. Spieler *Geschoss::zBesitzer() const
  173. {
  174. return besitzer;
  175. }
  176. Spieler *Geschoss::getBesitzer() const
  177. {
  178. return besitzer ? (Spieler *)besitzer->getThis() : 0;
  179. }
  180. Richtung Geschoss::getRichtung() const
  181. {
  182. return richtung;
  183. }
  184. FeuerballTreffer::FeuerballTreffer( ResourceRegistry *zResources, int id, int x, int y, Spieler *besitzer, int maxZeit )
  185. : GameObject( FEUERBALL_TREFFER, x - 75, y - 75, 150, 150 )
  186. {
  187. this->id = id;
  188. this->besitzer = besitzer;
  189. this->timeLeft = (float)maxZeit;
  190. count = 0;
  191. animation = zResources->getResource( R_FEUERBALL_TREFFER, 0 );
  192. currentImage = 0;
  193. texturScale = 1;
  194. nextImage = 0.075;
  195. textur = animation->getImage( currentImage );
  196. }
  197. FeuerballTreffer::~FeuerballTreffer()
  198. {
  199. besitzer->release();
  200. animation->release();
  201. }
  202. void FeuerballTreffer::tick( double zeit )
  203. {
  204. timeLeft -= (float)zeit;
  205. count++;
  206. nextImage -= zeit;
  207. if( nextImage <= 0 )
  208. {
  209. nextImage += 0.075;
  210. currentImage++;
  211. if( currentImage >= animation->getImageCount() )
  212. currentImage = 0;
  213. textur->release();
  214. textur = animation->getImage( currentImage );
  215. }
  216. }
  217. bool FeuerballTreffer::isOver() const
  218. {
  219. return timeLeft <= 0;
  220. }
  221. bool FeuerballTreffer::makeDamage() const
  222. {
  223. return count % 2;
  224. }
  225. Spieler *FeuerballTreffer::zVerursacher() const
  226. {
  227. return besitzer;
  228. }