Data.cpp 7.6 KB

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