Data.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include "Data.h"
  2. #include <M2Datei.h>
  3. // Konstructor
  4. GameData::GameData( const char *shipM2, const char *asteroidsM2 )
  5. {
  6. schuss = new RCArray< Schuss >();
  7. ship = 0;
  8. asteroid = new RCArray< Asteroid >();
  9. aData = new Model2DData*[ 7 ]();
  10. sData = new Model2DData*[ 2 ]();
  11. M2Datei m2d( asteroidsM2 );
  12. m2d.leseDaten();
  13. for( int i = 0; i < 7; i++ )
  14. {
  15. Text name = "";
  16. name.append( (char)( 'a' + i ) );
  17. aData[ i ] = m2d.ladeModel( name );
  18. }
  19. m2d.setPfad( shipM2 );
  20. m2d.leseDaten();
  21. for( int i = 0; i < 2; i++ )
  22. {
  23. Text name = "";
  24. name.append( (char)( 'a' + i ) );
  25. sData[ i ] = m2d.ladeModel( name );
  26. }
  27. shipN = 0;
  28. score = 0;
  29. scoreCheck = score * 11197;
  30. breite = 0;
  31. höhe = 0;
  32. aGröße = 0;
  33. maxTimer = 0;
  34. mTimer = 0;
  35. timer = 0;
  36. beendet = 1;
  37. rend = 0;
  38. gameTime = 0;
  39. tastenStände = 0;
  40. rGen = 0;
  41. ref = 1;
  42. }
  43. // Destructor
  44. GameData::~GameData()
  45. {
  46. schuss->release();
  47. if( ship )
  48. ship->release();
  49. asteroid->release();
  50. for( int i = 0; i < 7; i++ )
  51. aData[ i ]->release();
  52. for( int i = 0; i < 2; i++ )
  53. sData[ i ]->release();
  54. delete[] aData;
  55. delete[] sData;
  56. if( rGen )
  57. rGen->release();
  58. }
  59. // private
  60. Asteroid *GameData::createNewAsteroid()
  61. {
  62. int num = (int)( rGen->rand() * 7 );
  63. double sw = ( rGen->rand() * 360 ) / 180.0 * PI;
  64. Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
  65. speed *= (float)( rGen->rand() * 40 );
  66. Vec2< float > pos( -200.f, höhe / 2.f );
  67. if( speed.x < 0 )
  68. pos.x = (float)( breite + 200 );
  69. return new Asteroid( aData[ num ]->getThis(), 0, pos, speed, (float)( rGen->rand() * 100 ) / 75.f, (float)sw, aGröße / 1000.f, num );
  70. }
  71. // nicht constant
  72. void GameData::reset( Text *zOptionen )
  73. {
  74. gameTime = 0;
  75. timer = 0;
  76. beendet = 0;
  77. score = 0;
  78. scoreCheck = score * 11197;
  79. tastenStände = 0;
  80. if( ship )
  81. ship = ship->release();
  82. schuss->leeren();
  83. asteroid->leeren();
  84. Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=' ) + 1, zOptionen->positionVon( ',' ) );
  85. breite = *tmp;
  86. tmp->release();
  87. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 1 ) + 1, zOptionen->positionVon( ',', 1 ) );
  88. höhe = *tmp;
  89. tmp->release();
  90. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 2 ) + 1, zOptionen->positionVon( ',', 2 ) );
  91. aGröße = *tmp;
  92. tmp->release();
  93. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 3 ) + 1, zOptionen->positionVon( ',', 3 ) );
  94. maxTimer = *tmp;
  95. tmp->release();
  96. mTimer = maxTimer;
  97. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 4 ) + 1, zOptionen->positionVon( ',', 4 ) );
  98. shipN = *tmp;
  99. tmp->release();
  100. Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
  101. Vec2< float > shipSpeed( 0, 0 );
  102. float shipR = (float)-PI / 2;
  103. if( rGen )
  104. rGen = rGen->release();
  105. rGen = new RandomGenerator();
  106. if( zOptionen->positionVon( '=', 6 ) >= 0 )
  107. {
  108. tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
  109. rGen->setSeed( (__int64)*tmp );
  110. tmp->release();
  111. }
  112. ship = new Ship( sData[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
  113. }
  114. bool GameData::tick( double tickVal )
  115. {
  116. if( beendet )
  117. {
  118. bool ret = rend;
  119. rend = 0;
  120. return ret;
  121. }
  122. cs.lock();
  123. gameTime += tickVal;
  124. // Timer
  125. timer -= tickVal;
  126. if( timer <= 0 )
  127. {
  128. mTimer -= 25;
  129. if( mTimer < 500 )
  130. mTimer = 500;
  131. timer = mTimer / 1000.0;
  132. for( int i = 0; i < rGen->rand() * 1 + 1; i++ )
  133. {
  134. asteroid->add( createNewAsteroid() );
  135. }
  136. }
  137. // Update
  138. int aAnz = asteroid->getEintragAnzahl();
  139. for( int i = 0; i < aAnz; i++ )
  140. asteroid->z( i )->tick( tickVal, breite, höhe );
  141. int sAnz = schuss->getEintragAnzahl();
  142. for( int i = 0; i < sAnz; i++ )
  143. schuss->z( i )->tick( tickVal );
  144. ship->tick( tickVal, breite, höhe, tastenStände );
  145. for( int i = aAnz - 1; i >= 0; i-- )
  146. {
  147. if( !asteroid->z( i )->amLeben() )
  148. {
  149. score += asteroid->z( i )->getScore();
  150. scoreCheck = score * 11197;
  151. asteroid->remove( i );
  152. aAnz--;
  153. }
  154. }
  155. for( int i = sAnz - 1; i >= 0; i-- )
  156. {
  157. Vec2< float > pos = schuss->z( i )->getPos();
  158. if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
  159. {
  160. sAnz--;
  161. schuss->remove( i );
  162. }
  163. }
  164. // Collision
  165. for( int i = sAnz - 1; i >= 0; i-- )
  166. {
  167. Schuss *zs = schuss->z( i );
  168. bool b = 0;
  169. for( int j = 0; j < aAnz; j++ )
  170. {
  171. Polygon2D ap;
  172. Polygon2D bp;
  173. Punkt pa;
  174. Punkt pb;
  175. if( asteroid->z( j )->istGetroffen( zs, ap, bp, pa, pb, rGen ) )
  176. {
  177. Array< Polygon2D > *npaA = new Array< Polygon2D >();
  178. npaA->add( ap );
  179. Model2DData *npdA = new Model2DData();
  180. npdA->erstelleModell( npaA );
  181. float rot = asteroid->z( j )->zModel()->getDrehung();
  182. char id = asteroid->z( j )->getId();
  183. if( id >= 0 )
  184. id = -id - 1;
  185. asteroid->add( new Asteroid( npdA, asteroid->z( j )->getTextur(), pa.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize(), id ) );
  186. Array< Polygon2D > *npaB = new Array< Polygon2D >();
  187. npaB->add( bp );
  188. Model2DData *npdB = new Model2DData();
  189. npdB->erstelleModell( npaB );
  190. asteroid->add( new Asteroid( npdB, asteroid->z( j )->getTextur(), pb.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize(), id ) );
  191. b = 1;
  192. asteroid->z( j )->setDead();
  193. }
  194. }
  195. if( b )
  196. {
  197. schuss->remove( i );
  198. sAnz--;
  199. }
  200. }
  201. for( int i = 0; i < aAnz && !beendet; i++ )
  202. beendet |= ship->istTod( asteroid->z( i ) );
  203. beendet |= ( score * 11197 != scoreCheck );
  204. if( score * 11197 != scoreCheck )
  205. {
  206. score = 0;
  207. scoreCheck = 0;
  208. }
  209. cs.unlock();
  210. return 1;
  211. }
  212. // constant
  213. int GameData::getScore() const
  214. {
  215. return score;
  216. }
  217. bool GameData::istBeendet() const
  218. {
  219. return beendet;
  220. }
  221. // Reference Counting
  222. GameData *GameData::getThis()
  223. {
  224. ref++;
  225. return this;
  226. }
  227. GameData *GameData::release()
  228. {
  229. ref--;
  230. if( !ref )
  231. delete this;
  232. return 0;
  233. }