Map.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #include "Map.h"
  2. #include <InitDatei.h>
  3. #include <Datei.h>
  4. #include <Text.h>
  5. #include <M2Datei.h>
  6. #include <DateiSystem.h>
  7. #include <TastaturEreignis.h>
  8. #include <KSGTDatei.h>
  9. #include <Zeit.h>
  10. #include <Rahmen.h>
  11. #include <Globals.h>
  12. // Inhalt der Map Klasse aus Map.h
  13. // Konstruktor
  14. Map::Map()
  15. {
  16. schuss = new RCArray< Schuss >();
  17. ship = 0;
  18. asteroid = new RCArray< Asteroid >();
  19. aData = new Model2DData*[ 7 ]();
  20. aTextur = new Bild*[ 7 ]();
  21. sData = new Model2DData*[ 2 ]();
  22. sTextur = new Bild*[ 2 ]();
  23. M2Datei m2d( "data/Minigames/Asteroids/models/asteroids.m2" );
  24. m2d.leseDaten();
  25. LTDBDatei td;
  26. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/asteroids.ltdb" ) );
  27. td.leseDaten( 0 );
  28. for( int i = 0; i < 7; i++ )
  29. {
  30. Text name = "";
  31. name.append( (char)( 'a' + i ) );
  32. aData[ i ] = m2d.ladeModel( name );
  33. aTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  34. }
  35. m2d.setPfad( "data/Minigames/Asteroids/models/ship.m2" );
  36. m2d.leseDaten();
  37. td.setDatei( new Text( "data/Minigames/Asteroids/bilder/ship.ltdb" ) );
  38. td.leseDaten( 0 );
  39. for( int i = 0; i < 2; i++ )
  40. {
  41. Text name = "";
  42. name.append( (char)( 'a' + i ) );
  43. sData[ i ] = m2d.ladeModel( name );
  44. sTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
  45. }
  46. kam = new LRahmen();
  47. kam->setFarbe( 0xFF777777 );
  48. map = new LRahmen();
  49. map->setFarbe( 0xFFFFFFFF );
  50. map->setPosition( 10, 10 );
  51. map->setSize( 200, 200 );
  52. shipN = 0;
  53. score = 0;
  54. breite = 0;
  55. höhe = 0;
  56. aGröße = 0;
  57. maxTimer = 0;
  58. mTimer = 0;
  59. timer = 0;
  60. beendet = 1;
  61. rend = 0;
  62. sr = 1;
  63. ref = 1;
  64. }
  65. // Destruktor
  66. Map::~Map()
  67. {
  68. speichern();
  69. schuss->release();
  70. if( ship )
  71. ship->release();
  72. asteroid->release();
  73. for( int i = 0; i < 7; i++ )
  74. {
  75. aData[ i ]->release();
  76. aTextur[ i ]->release();
  77. }
  78. for( int i = 0; i < 2; i++ )
  79. {
  80. sData[ i ]->release();
  81. sTextur[ i ]->release();
  82. }
  83. delete[] aData;
  84. delete[] aTextur;
  85. delete[] sData;
  86. delete[] sTextur;
  87. kam->release();
  88. map->release();
  89. }
  90. // nicht constant
  91. void Map::reset()
  92. {
  93. timer = 0;
  94. beendet = 0;
  95. score = 0;
  96. if( ship )
  97. ship = ship->release();
  98. schuss->leeren();
  99. asteroid->leeren();
  100. InitDatei *opd = new InitDatei( "data/Minigames/Asteroids/data/optionen.ini" );
  101. if( !opd->laden() )
  102. DateiPfadErstellen( "data/Minigames/Asteroids/data/optionen.ini" );
  103. breite = 800;
  104. if( opd->wertExistiert( "Breite" ) )
  105. breite = (int)*opd->zWert( "Breite" );
  106. else
  107. opd->addWert( "Breite", "800" );
  108. höhe = 500;
  109. if( opd->wertExistiert( "Höhe" ) )
  110. höhe = (int)*opd->zWert( "Höhe" );
  111. else
  112. opd->addWert( "Höhe", "500" );
  113. aGröße = 1000;
  114. if( opd->wertExistiert( "Größe" ) )
  115. aGröße = (int)*opd->zWert( "Größe" );
  116. else
  117. opd->addWert( "Größe", "1000" );
  118. maxTimer = 5000;
  119. if( opd->wertExistiert( "Timer" ) )
  120. maxTimer = (int)*opd->zWert( "Timer" );
  121. else
  122. opd->addWert( "Timer", "5000" );
  123. mTimer = maxTimer;
  124. shipN = 0;
  125. if( opd->wertExistiert( "Ship" ) )
  126. shipN = (int)*opd->zWert( "Ship" );
  127. else
  128. opd->addWert( "Ship", "0" );
  129. bool fortsetzen = 0;
  130. if( opd->wertExistiert( "Fortsetzen" ) )
  131. fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0;
  132. else
  133. opd->addWert( "Fortsetzen", "0" );
  134. opd->speichern();
  135. opd->release();
  136. Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
  137. Vec2< float > shipSpeed( 0, 0 );
  138. float shipR = (float)-PI / 2;
  139. if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) )
  140. {
  141. Datei *save = new Datei();
  142. save->setDatei( "data/Minigames/Asteroids/data/game.save" );
  143. save->open( Datei::Style::lesen );
  144. int br = 0;
  145. int hö = 0;
  146. int gr = 0;
  147. int shn = 0;
  148. save->lese( (char*)&br, 4 );
  149. save->lese( (char*)&hö, 4 );
  150. save->lese( (char*)&gr, 4 );
  151. save->lese( (char*)&shn, 4 );
  152. if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
  153. {
  154. save->lese( (char*)&score, 4 );
  155. save->lese( (char*)&mTimer, 4 );
  156. // Schiff laden
  157. save->lese( (char*)&shipPos.x, 4 );
  158. save->lese( (char*)&shipPos.y, 4 );
  159. save->lese( (char*)&shipSpeed.x, 4 );
  160. save->lese( (char*)&shipSpeed.y, 4 );
  161. save->lese( (char*)&shipR, 4 );
  162. int anz = 0;
  163. save->lese( (char*)&anz, 4 );
  164. for( int i = 0; i < anz; i++ )
  165. { // Asteroiden Laden
  166. char n = 0;
  167. float x = 0;
  168. float y = 0;
  169. float xs = 0;
  170. float ys = 0;
  171. float rs = 0;
  172. float r = 0;
  173. float gr = 0;
  174. save->lese( &n, 1 );
  175. save->lese( (char*)&x, 4 );
  176. save->lese( (char*)&y, 4 );
  177. save->lese( (char*)&xs, 4 );
  178. save->lese( (char*)&ys, 4 );
  179. save->lese( (char*)&rs, 4 );
  180. save->lese( (char*)&r, 4 );
  181. save->lese( (char*)&gr, 4 );
  182. asteroid->add( new Asteroid( aData[ n ]->getThis(), aTextur[ n ]->getThis(),
  183. Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
  184. }
  185. save->lese( (char*)&anz, 4 );
  186. for( int i = 0; i < anz; i++ )
  187. { // Schüsse Laden
  188. float x = 0;
  189. float y = 0;
  190. float xs = 0;
  191. float ys = 0;
  192. save->lese( (char*)&x, 4 );
  193. save->lese( (char*)&y, 4 );
  194. save->lese( (char*)&xs, 4 );
  195. save->lese( (char*)&ys, 4 );
  196. schuss->add( new Schuss( Vec2< float >( x, y ), Vec2< float >( xs, ys ) ) );
  197. }
  198. }
  199. save->close();
  200. save->release();
  201. }
  202. ship = new Ship( sData[ shipN ]->getThis(), sTextur[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
  203. }
  204. void Map::doMausEreignis( MausEreignis &me )
  205. {
  206. }
  207. void Map::doTastaturEreignis( TastaturEreignis &te )
  208. {
  209. if( te.taste == T_Space && te.id == TE_Press )
  210. schuss->add( ship->getSchuss() );
  211. }
  212. bool Map::tick( double tickVal )
  213. {
  214. if( beendet )
  215. {
  216. bool ret = rend;
  217. rend = 0;
  218. return ret;
  219. }
  220. if( sr )
  221. srand( (int)time( 0 ) );
  222. sr = 0;
  223. // Timer
  224. timer -= tickVal;
  225. if( timer <= 0 )
  226. {
  227. mTimer -= 25;
  228. if( mTimer < 500 )
  229. mTimer = 500;
  230. timer = mTimer / 1000.0;
  231. for( int i = 0; i < rand() % 4 + 1; i++ )
  232. {
  233. int num = rand() % 7;
  234. double sw = ( rand() % 360 ) / 180.0 * PI;
  235. Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
  236. speed *= (float)( rand() % 40 );
  237. Vec2< float > pos( -200.f, höhe / 2.f );
  238. if( speed.x < 0 )
  239. pos.x = (float)( breite + 200 );
  240. asteroid->add( new Asteroid( aData[ num ]->getThis(), aTextur[ num ]->getThis(), pos, speed, ( rand() % 100 ) / 75.f, (float)sw, aGröße / 1000.f, num ) );
  241. }
  242. }
  243. // Update
  244. int aAnz = asteroid->getEintragAnzahl();
  245. for( int i = 0; i < aAnz; i++ )
  246. asteroid->z( i )->tick( tickVal, breite, höhe );
  247. int sAnz = schuss->getEintragAnzahl();
  248. for( int i = 0; i < sAnz; i++ )
  249. schuss->z( i )->tick( tickVal );
  250. ship->tick( tickVal, breite, höhe );
  251. for( int i = aAnz - 1; i >= 0; i-- )
  252. {
  253. if( !asteroid->z( i )->amLeben() )
  254. {
  255. score++;
  256. asteroid->remove( i );
  257. aAnz--;
  258. }
  259. }
  260. for( int i = sAnz - 1; i >= 0; i-- )
  261. {
  262. Vec2< float > pos = schuss->z( i )->getPos();
  263. if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
  264. {
  265. sAnz--;
  266. schuss->remove( i );
  267. }
  268. }
  269. // Collision
  270. for( int i = sAnz - 1; i >= 0; i-- )
  271. {
  272. Schuss *zs = schuss->z( i );
  273. bool b = 0;
  274. for( int j = 0; j < aAnz; j++ )
  275. b |= asteroid->z( j )->istGetroffen( zs );
  276. if( b )
  277. {
  278. schuss->remove( i );
  279. sAnz--;
  280. }
  281. }
  282. for( int i = 0; i < aAnz && !beendet; i++ )
  283. beendet |= ship->istTod( asteroid->z( i ) );
  284. if( beendet )
  285. {
  286. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Asteroids/data/score.ksgt" );
  287. if( !stb->laden() )
  288. DateiPfadErstellen( "data/Minigames/Asteroids/data/score.ksgt" );
  289. RCArray< Text > *zeile = new RCArray< Text >();
  290. Zeit *zeit = getZeit();
  291. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  292. zeit->release();
  293. Text *scoreT = new Text();
  294. scoreT->append( score );
  295. zeile->add( scoreT );
  296. Text *breiteT = new Text();
  297. breiteT->append( breite );
  298. zeile->add( breiteT );
  299. Text *höheT = new Text();
  300. höheT->append( höhe );
  301. zeile->add( höheT );
  302. Text *timerT = new Text();
  303. timerT->append( maxTimer );
  304. zeile->add( timerT );
  305. Text *aGrößeT = new Text();
  306. aGrößeT->append( aGröße );
  307. zeile->add( aGrößeT );
  308. Text *shipT = new Text();
  309. shipT->append( shipN );
  310. zeile->add( shipT );
  311. stb->addZeile( 7, zeile );
  312. zeile->release();
  313. stb->speichern();
  314. stb->release();
  315. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  316. }
  317. return 1;
  318. }
  319. void Map::render( Bild &zRObj )
  320. {
  321. Punkt kamP = ship->getKamPos( breite, höhe );
  322. zRObj.addScrollOffset( kamP.x, kamP.y );
  323. int aAnz = asteroid->getEintragAnzahl();
  324. for( int i = 0; i < aAnz; i++ )
  325. asteroid->z( i )->render( zRObj );
  326. int sAnz = schuss->getEintragAnzahl();
  327. for( int i = 0; i < sAnz; i++ )
  328. schuss->z( i )->render( zRObj );
  329. ship->render( zRObj );
  330. zRObj.addScrollOffset( -kamP.x, -kamP.y );
  331. if( breite >= 800 || höhe >= 500 )
  332. { // Minimap
  333. const Punkt &dOff = zRObj.getDrawOff();
  334. map->render( zRObj );
  335. zRObj.setPixelDP( 10 + ( ship->getPos().x * 200 ) / breite + dOff.x, 10 + ( ship->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FF00 );
  336. for( int i = 0; i < aAnz; i++ )
  337. zRObj.setPixelDP( 10 + ( asteroid->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( asteroid->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFFFF0000 );
  338. for( int i = 0; i < sAnz; i++ )
  339. zRObj.setPixelDP( 10 + ( (int)schuss->z( i )->getPos().x * 200 ) / breite + dOff.x, 10 + ( (int)schuss->z( i )->getPos().y * 200 ) / höhe + dOff.y, 0xFF00FFFF );
  340. kam->setPosition( 10 + ( 200 * kamP.x ) / breite, 10 + ( 200 * kamP.y ) / höhe );
  341. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  342. if( kam->getBreite() > 200 )
  343. kam->setSize( 200, kam->getHeight() );
  344. if( kam->getHeight() > 200 )
  345. kam->setSize( kam->getBreite(), 200 );
  346. kam->render( zRObj );
  347. }
  348. }
  349. // constant
  350. void Map::speichern() const
  351. {
  352. if( !beendet )
  353. {
  354. Datei *d = new Datei();
  355. d->setDatei( "data/Minigames/Asteroids/data/game.save" );
  356. d->erstellen();
  357. d->open( Datei::Style::schreiben );
  358. d->schreibe( (char*)&breite, 4 );
  359. d->schreibe( (char*)&höhe, 4 );
  360. d->schreibe( (char*)&aGröße, 4 );
  361. d->schreibe( (char*)&shipN, 4 );
  362. d->schreibe( (char*)&score, 4 );
  363. d->schreibe( (char*)&mTimer, 4 );
  364. ship->save( d );
  365. int anz = asteroid->getEintragAnzahl();
  366. d->schreibe( (char*)&anz, 4 );
  367. for( int i = 0; i < anz; i++ )
  368. asteroid->z( i )->save( d );
  369. anz = schuss->getEintragAnzahl();
  370. d->schreibe( (char*)&anz, 4 );
  371. for( int i = 0; i < anz; i++ )
  372. schuss->z( i )->save( d );
  373. d->close();
  374. d->release();
  375. }
  376. else
  377. DateiRemove( "data/Minigames/Asteroids/data/game.save" );
  378. }
  379. int Map::getScore() const
  380. {
  381. return score;
  382. }
  383. bool Map::istBeendet() const
  384. {
  385. return beendet;
  386. }
  387. // Reference Counting
  388. Map *Map::getThis()
  389. {
  390. ref++;
  391. return this;
  392. }
  393. Map *Map::release()
  394. {
  395. ref--;
  396. if( !ref )
  397. delete this;
  398. return 0;
  399. }