SpielObjekt.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include "SpielObjekt.h"
  2. #include "../Define.h"
  3. #include "../../Initialisierung/Initialisierung.h"
  4. #include <Textur2D.h>
  5. // Inhalt der SpielObjekt Klasse aus SpielObjekt.h
  6. // Konstruktor
  7. SpielObjekt::SpielObjekt( ObjektStr *zStr, Schrift *zSchrift )
  8. : Model2DObject()
  9. {
  10. id = zStr->id;
  11. style = zStr->style;
  12. stabilität = zStr->maxStabilität;
  13. energie = zStr->maxEnergie;
  14. maxStabilität = zStr->maxStabilität;
  15. maxEnergie = zStr->maxEnergie;
  16. energieRadius = zStr->energieRadius;
  17. reparatur = zStr->reparatur;
  18. akkuLeistung = zStr->akkuLeistung;
  19. zteam = 0;
  20. amLeben = 1;
  21. level = 1;
  22. ep = 0;
  23. nextSkillEp = 80;
  24. setCollision( ( style | 0x4 ) == style );
  25. deadPlayer = 0;
  26. nText = initTextFeld( 0, 0, 152, 30, zSchrift, TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::Center |
  27. TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha, "" );
  28. save();
  29. }
  30. // Destruktor
  31. SpielObjekt::~SpielObjekt()
  32. {
  33. nText->release();
  34. if( deadPlayer )
  35. deadPlayer->release();
  36. }
  37. // nicht constant
  38. void SpielObjekt::save()
  39. {
  40. last.rSpeed = rSpeed;
  41. last.pos = position;
  42. last.speed = speed;
  43. last.rotation = rotation;
  44. last.amLeben = amLeben;
  45. last.akkuAbk = akkuAbk;
  46. last.repAbk = repAbk;
  47. last.energie = energie;
  48. last.stabilität = stabilität;
  49. last.reparatur = reparatur;
  50. last.akkuLeistung = akkuLeistung;
  51. last.maxEnergie = maxEnergie;
  52. last.maxStabilität = maxStabilität;
  53. last.level = level;
  54. }
  55. void SpielObjekt::load()
  56. {
  57. rSpeed = last.rSpeed;
  58. position = last.pos;
  59. speed = last.speed;
  60. rotation = last.rotation;
  61. amLeben = last.amLeben;
  62. akkuAbk = last.akkuAbk;
  63. repAbk = last.repAbk;
  64. energie = last.energie;
  65. stabilität = last.stabilität;
  66. reparatur = last.reparatur;
  67. akkuLeistung = last.akkuLeistung;
  68. maxEnergie = last.maxEnergie;
  69. maxStabilität = last.maxStabilität;
  70. level = last.level;
  71. }
  72. void SpielObjekt::setTextur( Bild * textur )
  73. {
  74. Textur2D *t = new Textur2D();
  75. t->setTexturZ( textur );
  76. __super::setTextur( t );
  77. }
  78. void SpielObjekt::setTeam( Team * team )
  79. {
  80. this->zteam = team;
  81. nText->setHintergrundFarbe( 0xA0000000 | ( zteam->farbe & 0x00FFFFFF ) );
  82. nText->setRahmenFarbe( zteam->farbe );
  83. }
  84. bool SpielObjekt::tick( const WeltInfo & info, double zeit )
  85. {
  86. if( !amLeben )
  87. return 0;
  88. repAbk -= zeit;
  89. if( repAbk < 0 )
  90. repAbk = 0;
  91. akkuAbk -= zeit;
  92. if( akkuAbk < 0 )
  93. akkuAbk = 0;
  94. if( !repAbk )
  95. {
  96. stabilität += reparatur * zeit;
  97. if( stabilität > maxStabilität )
  98. stabilität = maxStabilität;
  99. }
  100. if( !akkuAbk )
  101. {
  102. if( !zteam )
  103. {
  104. energie -= akkuLeistung * zeit;
  105. if( energie < 0 )
  106. energie = 0;
  107. }
  108. else
  109. {
  110. energie += akkuLeistung * zeit;
  111. if( energie > maxEnergie )
  112. energie = maxEnergie;
  113. }
  114. }
  115. if( ( style | 0x2 ) != style )
  116. {
  117. speed.x = 0;
  118. speed.y = 0;
  119. rSpeed = 0;
  120. }
  121. return Model2DObject::tick( info, zeit );
  122. }
  123. void SpielObjekt::render( Mat3<float> & kamMat, Bild & zRObj, const char *kamName )
  124. {
  125. if( !amLeben )
  126. return;
  127. Model2DObject::render( kamMat, zRObj, kamName );
  128. if( Text( "minimap" ).istGleich( kamName ) )
  129. return;
  130. nText->setPosition( (Punkt)( kamMat * ( getPosition() - Punkt( 76, (int)( zModel()->maxP.y * getSize() ) + 30 ) ) ) );
  131. nText->setText( Text( " (" ) + level + ")" );
  132. nText->render( zRObj );
  133. int teamF = zteam ? zteam->farbe : 0;
  134. double teamStab = zteam ? zteam->maxStabilität : 0;
  135. double teamEner = zteam ? zteam->maxEnergie : 0;
  136. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, teamF );
  137. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, teamF );
  138. int l = (int)( stabilität * 100 / ( maxStabilität + teamStab ) * 1.5 + 0.5 );
  139. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 1, l, 0xFF00FF00 );
  140. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 2, l, 0xFF00FF00 );
  141. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 3, l, 0xFF00FF00 );
  142. int e = (int)( energie * 100 / ( maxEnergie + teamEner ) * 1.5 + 0.5 );
  143. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 26, e, 0xFFFFFF00 );
  144. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 27, e, 0xFFFFFF00 );
  145. zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 28, e, 0xFFFFFF00 );
  146. }
  147. void SpielObjekt::nimmSchaden( double &intensity, int sLevel )
  148. {
  149. if( ( style | 0x1 ) != style )
  150. {
  151. intensity = 0;
  152. return;
  153. }
  154. double originalIntens = intensity;
  155. /*double schieldVal = intensity - intensity / calculateEnergieSchild();
  156. double schieldEVal = schieldVal / ( calculateEnergieSchildEffizienz() / 100 );
  157. if( schieldEVal > energie )
  158. {
  159. schieldEVal = energie;
  160. schieldVal = schieldEVal * ( calculateEnergieSchildEffizienz() / 100 );
  161. }
  162. intensity -= schieldVal;
  163. energie -= schieldEVal;*/
  164. stabilität -= intensity;
  165. akkuAbk = 1.5;
  166. repAbk = 2;
  167. if( stabilität > 0 && doesShotAddEp() )
  168. {
  169. float levelFactor = (float)sLevel / (float)level;
  170. addEp( ( (float)originalIntens / 20 ) * levelFactor );
  171. }
  172. }
  173. void SpielObjekt::addEp( float ep )
  174. {
  175. this->ep += ep;
  176. while( this->ep >= nextSkillEp )
  177. {
  178. level++;
  179. this->ep -= nextSkillEp;
  180. nextSkillEp *= 1.025f;
  181. }
  182. }
  183. void SpielObjekt::calcDeadPlayerObject( Laser * zSchuss )
  184. {
  185. Vertex hp;
  186. Polygon2D a;
  187. Polygon2D b;
  188. Punkt pa;
  189. Punkt pb;
  190. if( calcHitPoint( zSchuss->getPosition() - zSchuss->getSpeed(), zSchuss->getSpeed(), hp ) )
  191. {
  192. zModel()->split( getObjectPos( hp ), getObjectDir( zSchuss->getSpeed() ) * 0.1f, "ship", a, b, pa, pb, []()
  193. {
  194. return rand() / (double)RAND_MAX;
  195. } );
  196. hp = ( hp * getSize() ).rotation( getDrehung() ) + getPosition();
  197. pa = pa.rotation( getDrehung() ) + getPosition();
  198. pb = pb.rotation( getDrehung() ) + getPosition();
  199. Array< Polygon2D > *npaA = new Array< Polygon2D >();
  200. npaA->add( a );
  201. Model2DData *npdA = new Model2DData();
  202. npdA->erstelleModell( npaA );
  203. Array< Polygon2D > *npaB = new Array< Polygon2D >();
  204. npaB->add( b );
  205. Model2DData *npdB = new Model2DData();
  206. npdB->erstelleModell( npaB );
  207. if( deadPlayer )
  208. deadPlayer->release();
  209. deadPlayer = new DeadPlayer( npdA, npdB, pa, pb, getSpeed() * ( rand() / (float)RAND_MAX ), getSpeed() * ( rand() / (float)RAND_MAX ), getDrehung(), getDrehung(), getDrehungSpeed() * ( rand() / (float)RAND_MAX ), getDrehungSpeed() * ( rand() / (float)RAND_MAX ), zTextur( "ship" ) );
  210. }
  211. }
  212. DeadPlayer * SpielObjekt::sterben()
  213. {
  214. amLeben = 0;
  215. setCollision( 0 );
  216. stabilität = 0;
  217. return deadPlayer ? (DeadPlayer *)deadPlayer->getThis() : 0;
  218. }
  219. // constant
  220. Team *SpielObjekt::zTeam() const
  221. {
  222. if( ( style | 0x10 ) == style )
  223. return 0;
  224. return zteam;
  225. }
  226. bool SpielObjekt::doesShotAddEp() const
  227. {
  228. return ( style | 0x20 ) == style;;
  229. }
  230. int SpielObjekt::getLevel() const
  231. {
  232. return level;
  233. }
  234. int SpielObjekt::getObjektId() const
  235. {
  236. return id;
  237. }