SpielObjekt.cpp 7.4 KB

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