Map.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #include "Map.h"
  2. #include <Rahmen.h>
  3. #include <InitDatei.h>
  4. #include <Text.h>
  5. #include <Zeit.h>
  6. #include <KSGTDatei.h>
  7. // Inhalt der Map Klasse aus Map.h
  8. // Konstruktor
  9. Map::Map()
  10. {
  11. gegner = new RCArray< Spieler >();
  12. ziele = new RCArray< Spieler >();
  13. spieler = 0;
  14. feld = new LRahmen();
  15. feld->setFarbe( 0xFFFFFFFF );
  16. kam = new LRahmen();
  17. kam->setFarbe( 0xFF777777 );
  18. map = new LRahmen();
  19. map->setFarbe( 0xFFFFFFFF );
  20. map->setPosition( 10, 10 );
  21. map->setSize( 200, 200 );
  22. beendet = 1;
  23. sr = 1;
  24. ref = 1;
  25. }
  26. // Destruktor
  27. Map::~Map()
  28. {
  29. speichern();
  30. gegner->release();
  31. ziele->release();
  32. if( spieler )
  33. spieler->release();
  34. feld->release();
  35. kam->release();
  36. map->release();
  37. }
  38. // nicht constant
  39. void Map::reset()
  40. {
  41. beendet = 0;
  42. score = 0;
  43. gegner->leeren();
  44. ziele->leeren();
  45. if( spieler )
  46. spieler = spieler->release();
  47. ziele->leeren();
  48. InitDatei *opd = new InitDatei( "data/Minigames/Fangen/data/optionen.ini" );
  49. if( !opd->laden() )
  50. DateiPfadErstellen( "data/Minigames/Fangen/data/optionen.ini" );
  51. breite = 800;
  52. if( opd->wertExistiert( "Breite" ) )
  53. breite = (int)*opd->zWert( "Breite" );
  54. else
  55. opd->addWert( "Breite", "800" );
  56. höhe = 500;
  57. if( opd->wertExistiert( "Höhe" ) )
  58. höhe = (int)*opd->zWert( "Höhe" );
  59. else
  60. opd->addWert( "Höhe", "500" );
  61. zAnzahl = 1;
  62. if( opd->wertExistiert( "Ziele" ) )
  63. zAnzahl = (int)*opd->zWert( "Ziele" );
  64. else
  65. opd->addWert( "Ziele", "1" );
  66. neuGegner = 3;
  67. if( opd->wertExistiert( "+Gegner" ) )
  68. neuGegner = (int)*opd->zWert( "+Gegner" );
  69. else
  70. opd->addWert( "+Gegner", "3" );
  71. geschwindigkeit = 1000;
  72. if( opd->wertExistiert( "Geschwindigkeit" ) )
  73. geschwindigkeit = (int)*opd->zWert( "Geschwindigkeit" );
  74. else
  75. opd->addWert( "Geschwindigkeit", "1000" );
  76. bool fortsetzen = 0;
  77. if( opd->wertExistiert( "Fortsetzen" ) )
  78. fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0;
  79. else
  80. opd->addWert( "Fortsetzen", "0" );
  81. opd->speichern();
  82. opd->release();
  83. kamX = 0;
  84. kamY = 0;
  85. if( breite > 80 )
  86. kamX = breite / 2 - 400;
  87. if( höhe > 50 )
  88. kamY = höhe / 2 - 250;
  89. if( fortsetzen && DateiExistiert( "data/Minigames/Fangen/data/game.save" ) )
  90. {
  91. Datei *save = new Datei();
  92. save->setDatei( "data/Minigames/Fangen/data/game.save" );
  93. save->open( Datei::Style::lesen );
  94. int br = 0;
  95. int hö = 0;
  96. save->lese( (char*)&br, 4 );
  97. save->lese( (char*)&hö, 4 );
  98. if( br == breite && hö == höhe )
  99. {
  100. save->lese( (char*)&score, 4 );
  101. spieler = new Spieler( SPIELER, save );
  102. int anz = 0;
  103. save->lese( (char*)&anz, 4 );
  104. for( int i = 0; i < anz; i++ )
  105. gegner->add( new Spieler( GEGNER, save ) );
  106. save->lese( (char*)&anz, 4 );
  107. for( int i = 0; i < anz; i++ )
  108. ziele->add( new Spieler( ZIEL, save ) );
  109. }
  110. save->close();
  111. save->release();
  112. }
  113. if( !spieler )
  114. spieler = new Spieler( SPIELER, breite, höhe );
  115. if( !gegner->getEintragAnzahl() )
  116. {
  117. for( int i = 0; i < neuGegner; i++ )
  118. gegner->add( new Spieler( GEGNER, breite, höhe ) );
  119. }
  120. if( !ziele->getEintragAnzahl() )
  121. {
  122. for( int i = 0; i < zAnzahl; i++ )
  123. ziele->add( new Spieler( ZIEL, breite, höhe ) );
  124. }
  125. }
  126. void Map::doMausEreignis( MausEreignis &me )
  127. {
  128. }
  129. void Map::doTastaturEreignis( TastaturEreignis &te )
  130. {
  131. }
  132. bool Map::tick( double tickVal )
  133. {
  134. if( beendet || !spieler )
  135. return 0;
  136. if( sr )
  137. srand( (unsigned int)time( 0 ) );
  138. sr = 0;
  139. double t = tickVal * geschwindigkeit / 1000;
  140. spieler->tick( t, breite, höhe );
  141. int anz = gegner->getEintragAnzahl();
  142. for( int i = 0; i < anz; i++ )
  143. {
  144. gegner->z( i )->tick( t, breite, höhe );
  145. if( gegner->z( i )->berührt( spieler->getX(), spieler->getY() ) )
  146. beendet = 1;
  147. }
  148. anz = ziele->getEintragAnzahl();
  149. for( int i = 0; i < anz; i++ )
  150. {
  151. ziele->z( i )->tick( t, breite, höhe );
  152. if( ziele->z( i )->berührt( spieler->getX(), spieler->getY() ) )
  153. {
  154. score++;
  155. ziele->leeren();
  156. for( int i = 0; i < zAnzahl; i++ )
  157. ziele->add( new Spieler( ZIEL, breite, höhe ) );
  158. for( int i = 0; i < neuGegner; i++ )
  159. gegner->add( new Spieler( GEGNER, breite, höhe ) );
  160. }
  161. }
  162. if( breite > 800 )
  163. {
  164. kamX = (int)spieler->getX() - 400;
  165. if( kamX < 0 )
  166. kamX = 0;
  167. if( kamX + 800 > breite )
  168. kamX = breite - 800;
  169. }
  170. if( höhe > 500 )
  171. {
  172. kamY = (int)spieler->getY() - 250;
  173. if( kamY < 0 )
  174. kamY = 0;
  175. if( kamY + 500 > höhe )
  176. kamY = höhe - 500;
  177. }
  178. if( beendet )
  179. {
  180. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Fangen/data/score.ksgt" );
  181. if( !stb->laden() )
  182. DateiPfadErstellen( "data/Minigames/Fangen/data/score.ksgt" );
  183. RCArray< Text > *zeile = new RCArray< Text >();
  184. Zeit *zeit = getZeit();
  185. zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
  186. zeit->release();
  187. Text *scoreT = new Text();
  188. scoreT->append( score );
  189. zeile->add( scoreT );
  190. Text *breiteT = new Text();
  191. breiteT->append( breite );
  192. zeile->add( breiteT );
  193. Text *höheT = new Text();
  194. höheT->append( höhe );
  195. zeile->add( höheT );
  196. Text *geschwindigkeitT = new Text();
  197. geschwindigkeitT->append( geschwindigkeit );
  198. zeile->add( geschwindigkeitT );
  199. Text *zAnzahlT = new Text();
  200. zAnzahlT->append( zAnzahl );
  201. zeile->add( zAnzahlT );
  202. Text *nAnzahlT = new Text();
  203. nAnzahlT->append( neuGegner );
  204. zeile->add( nAnzahlT );
  205. stb->addZeile( 7, zeile );
  206. zeile->release();
  207. stb->speichern();
  208. stb->release();
  209. DateiRemove( "data/Minigames/Fangen/data/game.save" );
  210. }
  211. return 1;
  212. }
  213. void Map::render( Bild &zRObj )
  214. {
  215. if( !spieler )
  216. return;
  217. int xStart = 0;
  218. int yStart = 0;
  219. if( breite < 800 )
  220. xStart = 400 - breite / 2;
  221. else
  222. xStart -= kamX;
  223. if( höhe < 500 )
  224. yStart = 250 - höhe / 2;
  225. else
  226. yStart -= kamY;
  227. feld->setPosition( xStart, yStart );
  228. feld->setSize( breite, höhe );
  229. feld->render( zRObj );
  230. bool rMap = breite > 800 || höhe > 500;
  231. zRObj.addScrollOffset( -xStart, -yStart );
  232. spieler->render( zRObj );
  233. int gAnz = gegner->getEintragAnzahl();
  234. for( int i = 0; i < gAnz; i++ )
  235. gegner->z( i )->render( zRObj );
  236. int zAnz = ziele->getEintragAnzahl();
  237. for( int i = 0; i < zAnz; i++ )
  238. ziele->z( i )->render( zRObj );
  239. zRObj.addScrollOffset( xStart, yStart );
  240. if( rMap )
  241. {
  242. const Punkt &dOff = zRObj.getDrawOff();
  243. map->render( zRObj );
  244. zRObj.setPixelDP( 10 + ( 200 * spieler->getX() ) / breite + dOff.x, 10 + ( 200 * spieler->getY() ) / höhe + dOff.y, 0xFF00FF00 );
  245. for( int i = 0; i < gAnz; i++ )
  246. zRObj.setPixelDP( 10 + ( 200 * gegner->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * gegner->z( i )->getY() ) / höhe + dOff.y, 0xFFFF0000 );
  247. for( int i = 0; i < zAnz; i++ )
  248. zRObj.setPixelDP( 10 + ( 200 * ziele->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * ziele->z( i )->getY() ) / höhe + dOff.y, 0xFF00FFFF );
  249. kam->setPosition( 10 + ( 200 * kamX ) / breite, 10 + ( 200 * kamY ) / höhe );
  250. kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe );
  251. if( kam->getBreite() > 200 )
  252. kam->setSize( 200, kam->getHeight() );
  253. if( kam->getHeight() > 200 )
  254. kam->setSize( kam->getBreite(), 200 );
  255. kam->render( zRObj );
  256. }
  257. }
  258. // constant
  259. void Map::speichern() const
  260. {
  261. if( !beendet && spieler )
  262. {
  263. Datei *d = new Datei();
  264. d->setDatei( "data/Minigames/Fangen/data/game.save" );
  265. d->erstellen();
  266. d->open( Datei::Style::schreiben );
  267. d->schreibe( (char*)&breite, 4 );
  268. d->schreibe( (char*)&höhe, 4 );
  269. d->schreibe( (char*)&score, 4 );
  270. spieler->save( d );
  271. int anz = gegner->getEintragAnzahl();
  272. d->schreibe( (char*)&anz, 4 );
  273. for( int i = 0; i < anz; i++ )
  274. gegner->z( i )->save( d );
  275. anz = ziele->getEintragAnzahl();
  276. d->schreibe( (char*)&anz, 4 );
  277. for( int i = 0; i < anz; i++ )
  278. ziele->z( i )->save( d );
  279. d->close();
  280. d->release();
  281. }
  282. else
  283. DateiRemove( "data/Minigames/Fangen/data/game.save" );
  284. }
  285. int Map::getScore() const
  286. {
  287. return score;
  288. }
  289. bool Map::istBeendet() const
  290. {
  291. return beendet;
  292. }
  293. // Reference Counting
  294. Map *Map::getThis()
  295. {
  296. ref++;
  297. return this;
  298. }
  299. Map *Map::release()
  300. {
  301. ref--;
  302. if( !ref )
  303. delete this;
  304. return 0;
  305. }