Menü.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. #include "Menü.h"
  2. #include "Initialisierung.h"
  3. #include <MausEreignis.h>
  4. #include <Textfeld.h>
  5. #include <InitDatei.h>
  6. #include <Text.h>
  7. #include <Datei.h>
  8. #include <TastaturEreignis.h>
  9. #include <KSGTDatei.h>
  10. #include <Schrift.h>
  11. #include <DateiSystem.h>
  12. #include <Rahmen.h>
  13. #include <AsynchronCall.h>
  14. #include <Bildschirm.h>
  15. // Inhalt der MenüVerloren Klasse aus Menü.h
  16. // Kontruktor
  17. MenüVerloren::MenüVerloren( Schrift *zSchrift )
  18. {
  19. ram = new LRahmen();
  20. ram->setSize( 160, 100 );
  21. ram->setPosition( 320, 200 );
  22. ram->setFarbe( 0xFFFFFFFF );
  23. verloren = initTextFeld( 325, 210, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." );
  24. neu = initKnopf( 350, 240, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" );
  25. beenden = initKnopf( 350, 270, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" );
  26. ref = 1;
  27. }
  28. // Destruktor
  29. MenüVerloren::~MenüVerloren()
  30. {
  31. verloren->release();
  32. neu->release();
  33. beenden->release();
  34. ram->release();
  35. }
  36. // nicht constant
  37. int MenüVerloren::doMausEreignis( MausEreignis &me )
  38. {
  39. bool vera = me.verarbeitet;
  40. int ret = 0;
  41. neu->doMausEreignis( me );
  42. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  43. ret = 1;
  44. beenden->doMausEreignis( me );
  45. if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks )
  46. ret = 2;
  47. return ret;
  48. }
  49. bool MenüVerloren::tick( double tickVal )
  50. {
  51. bool ret = verloren->tick( tickVal );
  52. ret |= neu->tick( tickVal );
  53. ret |= beenden->tick( tickVal );
  54. return ret;
  55. }
  56. void MenüVerloren::render( Bild &zRObj )
  57. {
  58. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  59. verloren->render( zRObj );
  60. neu->render( zRObj );
  61. beenden->render( zRObj );
  62. ram->render( zRObj );
  63. }
  64. // Reference Counting
  65. MenüVerloren *MenüVerloren::getThis()
  66. {
  67. ref++;
  68. return this;
  69. }
  70. MenüVerloren *MenüVerloren::release()
  71. {
  72. ref--;
  73. if( !ref )
  74. delete this;
  75. return 0;
  76. }
  77. // Inhalt der MenüSpiel Klasse aus Menü.h
  78. // Konstruktor
  79. MenüSpiel::MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen, KSGClient::MinigameServerClient *klient )
  80. {
  81. scoreT = initTextFeld( 690, 10, 100, 20, zSchrift, TextFeld::Style::Text, "Score: 0" );
  82. beenden = initKnopf( 690, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
  83. map = new Map( klient );
  84. verloren = new MenüVerloren( zSchrift );
  85. beendet = 0;
  86. timePuffer = 0;
  87. ref = 1;
  88. }
  89. // Destruktor
  90. MenüSpiel::~MenüSpiel()
  91. {
  92. scoreT->release();
  93. beenden->release();
  94. map->release();
  95. verloren->release();
  96. }
  97. // nicht constant
  98. void MenüSpiel::reset()
  99. {
  100. InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
  101. if( !opd->laden() )
  102. DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
  103. Text optionen = "Width=";
  104. if( opd->wertExistiert( "Breite" ) )
  105. optionen += (int)*opd->zWert( "Breite" );
  106. else
  107. {
  108. opd->addWert( "Breite", "80" );
  109. optionen += 80;
  110. }
  111. optionen += ",Height=";
  112. if( opd->wertExistiert( "Höhe" ) )
  113. optionen += (int)*opd->zWert( "Höhe" );
  114. else
  115. {
  116. opd->addWert( "Höhe", "50" );
  117. optionen += 50;
  118. }
  119. optionen += ",Ziele=";
  120. if( opd->wertExistiert( "Ziele" ) )
  121. optionen += (int)*opd->zWert( "Ziele" );
  122. else
  123. {
  124. opd->addWert( "Ziele", "1" );
  125. optionen += 1;
  126. }
  127. optionen += ",Anhang=";
  128. if( opd->wertExistiert( "Anhängen" ) )
  129. optionen += (int)*opd->zWert( "Anhängen" );
  130. else
  131. {
  132. opd->addWert( "Anhängen", "10" );
  133. optionen += 10;
  134. }
  135. optionen += ",Speed=";
  136. if( opd->wertExistiert( "Geschwindigkeit" ) )
  137. optionen += (int)*opd->zWert( "Geschwindigkeit" );
  138. else
  139. {
  140. opd->addWert( "Geschwindigkeit", "10" );
  141. optionen += 10;
  142. }
  143. optionen += ",Fortsetzen=";
  144. if( opd->wertExistiert( "Fortsetzen" ) )
  145. optionen += (int)*opd->zWert( "Fortsetzen" ) != 0;
  146. else
  147. {
  148. opd->addWert( "Fortsetzen", "0" );
  149. optionen += 0;
  150. }
  151. opd->speichern();
  152. opd->release();
  153. optionen += ",Seed=0";
  154. map->reset( &optionen );
  155. beendet = 0;
  156. scoreT->setText( "Score: " );
  157. scoreT->zText()->append( map->getScore() );
  158. }
  159. void MenüSpiel::doMausEreignis( MausEreignis &me )
  160. {
  161. bool vera = me.verarbeitet;
  162. beenden->doMausEreignis( me );
  163. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  164. {
  165. map->speichern();
  166. beendet = 1;
  167. }
  168. map->doMausEreignis( me );
  169. if( map->istBeendet() )
  170. {
  171. int ak = verloren->doMausEreignis( me );
  172. if( ak == 1 )
  173. reset();
  174. if( ak == 2 )
  175. beendet = 1;
  176. }
  177. }
  178. void MenüSpiel::doTastaturEreignis( TastaturEreignis &te )
  179. {
  180. if( map->istBeendet() )
  181. {
  182. if( te.id == TE_Release && te.taste == T_Enter )
  183. reset();
  184. if( te.id == TE_Release && te.taste == T_BackSpace )
  185. beendet = 1;
  186. return;
  187. }
  188. map->doTastaturEreignis( te );
  189. }
  190. bool MenüSpiel::tick( double tickVal )
  191. {
  192. timePuffer += tickVal;
  193. bool ret = beenden->tick( tickVal );
  194. while( timePuffer >= 0.01 )
  195. {
  196. ret |= map->tick( 0.01 );
  197. timePuffer -= 0.01;
  198. }
  199. scoreT->setText( "Score: " );
  200. scoreT->zText()->append( map->getScore() );
  201. if( map->istBeendet() )
  202. ret |= verloren->tick( tickVal );
  203. return ret;
  204. }
  205. void MenüSpiel::render( Bild &zRObj )
  206. {
  207. scoreT->render( zRObj );
  208. beenden->render( zRObj );
  209. map->render( zRObj );
  210. if( map->istBeendet() )
  211. verloren->render( zRObj );
  212. }
  213. // constant
  214. bool MenüSpiel::istBeendet() const
  215. {
  216. return beendet;
  217. }
  218. // Reference Counting
  219. MenüSpiel *MenüSpiel::getThis()
  220. {
  221. ref++;
  222. return this;
  223. }
  224. MenüSpiel *MenüSpiel::release()
  225. {
  226. ref--;
  227. if( !ref )
  228. delete this;
  229. return 0;
  230. }
  231. // Inhalt der MenüWiederhohlung Klasse
  232. // Konstruktor
  233. MenüWiederhohlung::MenüWiederhohlung( Schrift *zSchrift, Bildschirm *zScreen, Datei *datei, Text *zOptionen )
  234. {
  235. scoreT = initTextFeld( 690, 10, 100, 20, zSchrift, TextFeld::Style::Text, "Score: 0" );
  236. beenden = initKnopf( 690, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
  237. this->datei = datei;
  238. if( !datei->istOffen() )
  239. datei->open( Datei::Style::lesen );
  240. __int64 seed;
  241. datei->lese( (char*)&seed, 8 );
  242. zOptionen->append( ",Fortsetzen=0,Seed=" );
  243. zOptionen->append( seed );
  244. map = new Map( 0 );
  245. map->reset( zOptionen );
  246. beendet = 0;
  247. nowTime = 0;
  248. nextTime = 0;
  249. datei->lese( (char*)&nextTime, 8 );
  250. timePuffer = 0;
  251. ref = 1;
  252. }
  253. // Destruktor
  254. MenüWiederhohlung::~MenüWiederhohlung()
  255. {
  256. scoreT->release();
  257. beenden->release();
  258. map->release();
  259. datei->close();
  260. datei->release();
  261. }
  262. // nicht constant
  263. void MenüWiederhohlung::doMausEreignis( MausEreignis &me )
  264. {
  265. bool vera = me.verarbeitet;
  266. beenden->doMausEreignis( me );
  267. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  268. beendet = 1;
  269. if( map->istBeendet() )
  270. beendet = 1;
  271. }
  272. void MenüWiederhohlung::doTastaturEreignis( TastaturEreignis &te )
  273. {}
  274. bool MenüWiederhohlung::tick( double tickVal )
  275. {
  276. bool ret = beenden->tick( tickVal );
  277. // TODO Replay Activity
  278. while( nextTime >= 0 && nowTime + tickVal >= nextTime )
  279. {
  280. while( nowTime < nextTime )
  281. {
  282. ret |= map->tick( 0.01 );
  283. tickVal -= 0.01;
  284. nowTime += 0.01;
  285. }
  286. char aktion;
  287. datei->lese( &aktion, 1 );
  288. if( datei->istEnde() )
  289. nextTime = -1;
  290. else
  291. datei->lese( (char*)&nextTime, 8 );
  292. TastaturEreignis te;
  293. te.taste = aktion;
  294. te.verarbeitet = 0;
  295. te.id = TE_Press;
  296. map->doTastaturEreignis( te );
  297. }
  298. timePuffer += tickVal;
  299. while( timePuffer > 0 )
  300. {
  301. ret |= map->tick( 0.01 );
  302. nowTime += 0.01;
  303. timePuffer -= 0.01;
  304. }
  305. scoreT->setText( "Score: " );
  306. scoreT->zText()->append( map->getScore() );
  307. return ret;
  308. }
  309. void MenüWiederhohlung::render( Bild &zRObj )
  310. {
  311. map->render( zRObj );
  312. scoreT->render( zRObj );
  313. beenden->render( zRObj );
  314. }
  315. // constant
  316. bool MenüWiederhohlung::istBeendet() const
  317. {
  318. return beendet;
  319. }
  320. // Reference Counting
  321. MenüWiederhohlung *MenüWiederhohlung::getThis()
  322. {
  323. ref++;
  324. return this;
  325. }
  326. MenüWiederhohlung *MenüWiederhohlung::release()
  327. {
  328. if( !--ref )
  329. delete this;
  330. return 0;
  331. }
  332. // Inhalt der MenüStatistik Klasse aus Menü.h
  333. // Konstruktor
  334. MenüStatistik::MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen, KSGClient::MinigameServerClient *klient )
  335. {
  336. this->klient = klient;
  337. wiederH = 0;
  338. screen = zScreen->getThis();
  339. ansichtT = initTextFeld( 245, 10, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" );
  340. ansicht = initAuswahlBox( 295, 10, 120, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } );
  341. optionen = initKontrollKnopf( 425, 10, 130, 20, zSchrift, KontrollKnopf::Style::Normal, "Optionen beachten" );
  342. worldBestT = initObjTabelle( 115, 40, 570, 120, zSchrift, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 60, 0, 0 },{ "Spieler", 100, 0, 0 },{ "Ansehen", 55, 0, 0 },{ "Breite", 70, 0, 0 },{ "Höhe", 70, 0, 0 },{ "Ziele", 70, 0, 0 },{ "Anhängen", 60, 0, 0 },{ "Tempo", 65, 0, 0 } }, 20 );
  343. gesammtT = initObjTabelle( 115, 170, 570, 290, zSchrift, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Ziele", 70, 0, 0 }, { "Anhängen", 65, 0, 0 }, { "Tempo", 60, 0, 0 } }, 20 );
  344. optionenT = initObjTabelle( 115, 170, 570, 290, zSchrift, ObjTabelle::Style::normal | ObjTabelle::Style::VScroll, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Ziele", 70, 0, 0 }, { "Anhängen", 65, 0, 0 }, { "Tempo", 60, 0, 0 } }, 20 );
  345. gesammtD = initLinienDiagramm( 100, 170, 600, 290, zSchrift, LDiag::Style::DatenRahmen, 0 );
  346. optionenD = initLinienDiagramm( 100, 170, 600, 290, zSchrift, LDiag::Style::DatenRahmen, 0 );
  347. releasen = initKnopf( 10, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurücksetzen" );
  348. zurück = initKnopf( 350, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurück" );
  349. schrift = zSchrift->getThis();
  350. tr = new TextRenderer( schrift->getThis() );
  351. asyncFinished = 1;
  352. }
  353. // Destruktor
  354. MenüStatistik::~MenüStatistik()
  355. {
  356. while( !asyncFinished )
  357. {
  358. Sleep( 100 );
  359. }
  360. tr->release();
  361. worldBestT->release();
  362. ansichtT->release();
  363. ansicht->release();
  364. optionen->release();
  365. gesammtT->release();
  366. optionenT->release();
  367. gesammtD->release();
  368. optionenD->release();
  369. releasen->release();
  370. zurück->release();
  371. schrift->release();
  372. klient->release();
  373. if( wiederH )
  374. wiederH->release();
  375. screen->release();
  376. }
  377. // nicht constant
  378. void MenüStatistik::reset()
  379. {
  380. if( wiederH )
  381. wiederH = wiederH->release();
  382. ObjTabelle *tmpWBT = ( ObjTabelle*)worldBestT->getThis();
  383. KSGClient::MinigameServerClient *tmpKlient = klient->getThis();
  384. Schrift *tmpSchrift = schrift->getThis();
  385. asyncFinished = 0;
  386. new AsynchronCall( [ this, tmpWBT, tmpKlient, tmpSchrift ]()
  387. {
  388. Array< int > score;
  389. RCArray< Text > player;
  390. RCArray< Text > option;
  391. int anz = tmpKlient->getMinigameBestscoreList( "Snake", &score, &player, &option );
  392. for( int i = 0; i < anz; i++ )
  393. {
  394. TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, Text( score.get( i ) ) );
  395. TextFeld *spielerT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, player.z( i )->getText() );
  396. Text optionen = option.z( i )->getText();
  397. Text *breite = optionen.getTeilText( optionen.positionVon( '=' ) + 1, optionen.positionVon( ',' ) );
  398. Text *höhe = optionen.getTeilText( optionen.positionVon( '=', 1 ) + 1, optionen.positionVon( ',', 1 ) );
  399. Text *ziele = optionen.getTeilText( optionen.positionVon( '=', 2 ) + 1, optionen.positionVon( ',', 2 ) );
  400. Text *anhang = optionen.getTeilText( optionen.positionVon( '=', 3 ) + 1, optionen.positionVon( ',', 3 ) );
  401. Text *tempo = optionen.getTeilText( optionen.positionVon( '=', 4 ) + 1 );
  402. TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, breite->getText() );
  403. breite->release();
  404. TextFeld *höheT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, höhe->getText() );
  405. höhe->release();
  406. TextFeld *zieleT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, ziele->getText() );
  407. ziele->release();
  408. TextFeld *anhangT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, anhang->getText() );
  409. anhang->release();
  410. TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, tmpSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, tempo->getText() );
  411. tempo->release();
  412. Knopf *ansehenK = initKnopf( 0, 0, 0, 0, tmpSchrift, Knopf::Style::Normal, "Ansehen" );
  413. ansehenK->setMausEreignis( [ this, optionen ]( void *p, void *obj, MausEreignis me ) -> bool
  414. {
  415. if( me.id == ME_RLinks && !me.verarbeitet )
  416. {
  417. ( (Knopf*)obj )->removeStyle( Knopf::Style::Erlaubt );
  418. getThis();
  419. new AsynchronCall( [ this, optionen, obj ]()
  420. {
  421. Datei *d = klient->downloadGameCapture( "Snake", optionen );
  422. ( (Knopf*)obj )->addStyle( Knopf::Style::Erlaubt );
  423. if( wiederH )
  424. wiederH = wiederH->release();
  425. Text options = optionen.getText();
  426. wiederH = new MenüWiederhohlung( schrift, screen, d, &options );
  427. release();
  428. } );
  429. }
  430. return 1;
  431. } );
  432. tmpWBT->addZeile( optionen.getText() );
  433. tmpWBT->setZeichnungZ( 0, i + 1, scoreT );
  434. tmpWBT->setZeichnungZ( 1, i + 1, spielerT );
  435. tmpWBT->setZeichnungZ( 2, i + 1, ansehenK );
  436. tmpWBT->setZeichnungZ( 3, i + 1, breiteT );
  437. tmpWBT->setZeichnungZ( 4, i + 1, höheT );
  438. tmpWBT->setZeichnungZ( 5, i + 1, zieleT );
  439. tmpWBT->setZeichnungZ( 6, i + 1, anhangT );
  440. tmpWBT->setZeichnungZ( 7, i + 1, tempoT );
  441. }
  442. tmpKlient->release();
  443. tmpWBT->release();
  444. tmpSchrift->release();
  445. }, &asyncFinished );
  446. InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
  447. opd->laden();
  448. if( !opd->wertExistiert( "Breite" ) )
  449. opd->addWert( "Breite", "80" );
  450. if( !opd->wertExistiert( "Höhe" ) )
  451. opd->addWert( "Höhe", "50" );
  452. if( !opd->wertExistiert( "Ziele" ) )
  453. opd->addWert( "Ziele", "1" );
  454. if( !opd->wertExistiert( "Anhängen" ) )
  455. opd->addWert( "Anhängen", "10" );
  456. if( !opd->wertExistiert( "Geschwindigkeit" ) )
  457. opd->addWert( "Geschwindigkeit", "10" );
  458. if( !opd->wertExistiert( "Fortsetzen" ) )
  459. opd->addWert( "Fortsetzen", "0" );
  460. opd->speichern();
  461. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" );
  462. stb->laden();
  463. int anz = stb->getZeilenAnzahl();
  464. bool *fertig = new bool[ anz ];
  465. ZeroMemory( fertig, anz );
  466. int mS = 0;
  467. int omS = 0;
  468. int oAnz = 0;
  469. for( int i = 0; i < anz; i++ )
  470. {
  471. int maxScore = -1;
  472. int p = -1;
  473. for( int j = 0; j < anz; j++ )
  474. {
  475. if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) )
  476. {
  477. p = j;
  478. maxScore = (int)*stb->zFeld( j, 1 );
  479. }
  480. }
  481. if( p >= 0 )
  482. {
  483. fertig[ p ] = 1;
  484. TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() );
  485. TextFeld *datumT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() );
  486. TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() );
  487. TextFeld *höheT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() );
  488. TextFeld *zieleT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() );
  489. TextFeld *appendT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 6 )->getText() );
  490. TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() );
  491. gesammtT->addZeile( Text() += p );
  492. gesammtT->setZeichnungZ( 0, i + 1, scoreT );
  493. gesammtT->setZeichnungZ( 1, i + 1, datumT );
  494. gesammtT->setZeichnungZ( 2, i + 1, breiteT );
  495. gesammtT->setZeichnungZ( 3, i + 1, höheT );
  496. gesammtT->setZeichnungZ( 4, i + 1, zieleT );
  497. gesammtT->setZeichnungZ( 5, i + 1, appendT );
  498. gesammtT->setZeichnungZ( 6, i + 1, tempoT );
  499. if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) &&
  500. höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) &&
  501. zieleT->zText()->istGleich( opd->zWert( "Ziele" )->getText() ) &&
  502. appendT->zText()->istGleich( opd->zWert( "Anhängen" )->getText() ) &&
  503. tempoT->zText()->istGleich( opd->zWert( "Geschwindigkeit" )->getText() ) )
  504. {
  505. optionenT->addZeile( Text() += p );
  506. int n = optionenT->getZeilenNummer( Text() += p );
  507. optionenT->setZeichnungZ( 0, n, scoreT );
  508. optionenT->setZeichnungZ( 1, n, datumT );
  509. optionenT->setZeichnungZ( 2, n, breiteT );
  510. optionenT->setZeichnungZ( 3, n, höheT );
  511. optionenT->setZeichnungZ( 4, n, zieleT );
  512. optionenT->setZeichnungZ( 5, n, appendT );
  513. optionenT->setZeichnungZ( 6, n, tempoT );
  514. if( !omS )
  515. omS = maxScore;
  516. oAnz++;
  517. }
  518. }
  519. if( !mS )
  520. mS = maxScore;
  521. }
  522. delete[] fertig;
  523. DiagDaten *gd = new DiagDaten();
  524. gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
  525. gd->hIntervallFarbe = 0xFFFFFFFF;
  526. gd->hIntervallName->setText( "Spiel" );
  527. gd->rasterDicke = 1;
  528. gd->rasterFarbe = 0xFF505050;
  529. gd->vIntervallFarbe = 0xFFFFFFFF;
  530. gd->vIntervallName->setText( "Score" );
  531. gesammtD->setDiagDatenZ( gd );
  532. gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) );
  533. gesammtD->addVIntervallText( 0, "0" );
  534. gesammtD->addHIntervallText( 0, "1" );
  535. if( anz > 1 )
  536. gesammtD->addHIntervallText( anz - 1, Text() += anz );
  537. gesammtD->addWert( "Score" );
  538. gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
  539. gesammtD->setWertFarbe( 0, 0xFF00FF00 );
  540. gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050;
  541. DiagDaten *od = new DiagDaten();
  542. od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
  543. od->hIntervallFarbe = 0xFFFFFFFF;
  544. od->hIntervallName->setText( "Spiel" );
  545. od->rasterDicke = 1;
  546. od->rasterFarbe = 0xFF505050;
  547. od->vIntervallFarbe = 0xFFFFFFFF;
  548. od->vIntervallName->setText( "Score" );
  549. optionenD->setDiagDatenZ( od );
  550. optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) );
  551. optionenD->addVIntervallText( 0, "0" );
  552. optionenD->addHIntervallText( 0, "1" );
  553. if( oAnz > 1 )
  554. optionenD->addHIntervallText( oAnz - 1, Text() += oAnz );
  555. optionenD->addWert( "Score" );
  556. optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
  557. optionenD->setWertFarbe( 0, 0xFF00FF00 );
  558. optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050;
  559. int j = 0;
  560. for( int i = 0; i < anz; i++ )
  561. {
  562. gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) );
  563. if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
  564. (int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
  565. (int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) &&
  566. (int)*stb->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) &&
  567. (int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
  568. {
  569. optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) );
  570. j++;
  571. }
  572. }
  573. stb->release();
  574. opd->release();
  575. beendet = 0;
  576. }
  577. void MenüStatistik::doMausEreignis( MausEreignis &me )
  578. {
  579. if( wiederH )
  580. {
  581. wiederH->doMausEreignis( me );
  582. return;
  583. }
  584. ansicht->doMausEreignis( me );
  585. optionen->doMausEreignis( me );
  586. gesammtT->doMausEreignis( me );
  587. optionenT->doMausEreignis( me );
  588. worldBestT->doMausEreignis( me );
  589. bool vera = me.verarbeitet;
  590. releasen->doMausEreignis( me );
  591. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  592. { // Statistik releasen
  593. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  594. { // nur bestimmte Statistik releasen
  595. InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
  596. opd->laden();
  597. KSGTDatei *score = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" );
  598. score->laden();
  599. int zeilen = score->getZeilenAnzahl();
  600. for( int i = 0; i < zeilen; i++ )
  601. {
  602. if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
  603. (int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
  604. (int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) &&
  605. (int)*score->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) &&
  606. (int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
  607. {
  608. score->removeZeile( i );
  609. i--;
  610. zeilen--;
  611. }
  612. }
  613. score->speichern();
  614. score->release();
  615. opd->release();
  616. }
  617. else // alles releasen
  618. DateiRemove( "data/Minigames/Snake/data/score.ksgt" );
  619. reset();
  620. }
  621. vera = me.verarbeitet;
  622. zurück->doMausEreignis( me );
  623. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  624. beendet = 1;
  625. }
  626. bool MenüStatistik::tick( double tickVal )
  627. {
  628. if( wiederH )
  629. {
  630. bool ret = wiederH->tick( tickVal );
  631. if( wiederH->istBeendet() )
  632. wiederH = wiederH->release();
  633. return ret;
  634. }
  635. bool ret = ansicht->tick( tickVal );
  636. ret |= optionen->tick( tickVal );
  637. ret |= releasen->tick( tickVal );
  638. ret |= zurück->tick( tickVal );
  639. ret |= gesammtT->tick( tickVal );
  640. ret |= optionenT->tick( tickVal );
  641. ret |= gesammtD->tick( tickVal );
  642. ret |= optionenD->tick( tickVal );
  643. ret |= worldBestT->tick( tickVal );
  644. return ret;
  645. }
  646. void MenüStatistik::render( Bild &zRObj )
  647. {
  648. if( wiederH )
  649. {
  650. wiederH->render( zRObj );
  651. return;
  652. }
  653. tr->setSchriftSize( 12 );
  654. Text weltScore = "Welt Score:";
  655. tr->renderText( 10, 40, weltScore, zRObj, 0xFFFFFFFF );
  656. Text localScore = "Dein Score:";
  657. tr->renderText( 10, 170, localScore, zRObj, 0xFFFFFFFF );
  658. worldBestT->render( zRObj );
  659. if( !ansicht->getAuswahl() )
  660. {
  661. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  662. optionenT->render( zRObj );
  663. else
  664. gesammtT->render( zRObj );
  665. }
  666. else
  667. {
  668. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  669. optionenD->render( zRObj );
  670. else
  671. gesammtD->render( zRObj );
  672. }
  673. ansichtT->render( zRObj );
  674. ansicht->render( zRObj );
  675. optionen->render( zRObj );
  676. releasen->render( zRObj );
  677. zurück->render( zRObj );
  678. }
  679. // constant
  680. bool MenüStatistik::istBeendet() const
  681. {
  682. return beendet;
  683. }
  684. bool MenüStatistik::istWiederhohlung() const
  685. {
  686. return wiederH != 0;
  687. }
  688. // Reference Counting
  689. MenüStatistik *MenüStatistik::getThis()
  690. {
  691. ref++;
  692. return this;
  693. }
  694. MenüStatistik *MenüStatistik::release()
  695. {
  696. ref--;
  697. if( !ref )
  698. delete this;
  699. return 0;
  700. }
  701. // Inhalt der MenüOptionen aus Menü.h
  702. // Konstruktor
  703. MenüOptionen::MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen )
  704. {
  705. breiteT = initTextFeld( 310, 120, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" );
  706. breite = initTextFeld( 440, 120, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  707. breite->setTastaturEreignis( _nurNummernTE );
  708. höheT = initTextFeld( 310, 160, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" );
  709. höhe = initTextFeld( 440, 160, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  710. höhe->setTastaturEreignis( _nurNummernTE );
  711. zAnzahlT = initTextFeld( 310, 200, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Verschiedene Ziele:" );
  712. zAnzahl = initTextFeld( 440, 200, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  713. zAnzahl->setTastaturEreignis( _nurNummernTE );
  714. nAnzahlT = initTextFeld( 310, 240, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Länge Hinzufügen:" );
  715. nAnzahl = initTextFeld( 440, 240, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  716. nAnzahl->setTastaturEreignis( _nurNummernTE );
  717. tempoT = initTextFeld( 310, 280, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Geschwindigkeit:" );
  718. tempo = initTextFeld( 440, 280, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  719. tempo->setTastaturEreignis( _nurNummernTE );
  720. fortsetzen = initKontrollKnopf( 310, 320, 180, 20, zSchrift, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" );
  721. fortsetzen->setMausEreignis( _ret1ME );
  722. abbrechen = initKnopf( 310, 360, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
  723. ok = initKnopf( 405, 360, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Ok" );
  724. beendet = 0;
  725. ref = 1;
  726. }
  727. // Destruktor
  728. MenüOptionen::~MenüOptionen()
  729. {
  730. breiteT->release();
  731. breite->release();
  732. höheT->release();
  733. höhe->release();
  734. zAnzahlT->release();
  735. zAnzahl->release();
  736. nAnzahlT->release();
  737. nAnzahl->release();
  738. tempoT->release();
  739. tempo->release();
  740. fortsetzen->release();
  741. abbrechen->release();
  742. ok->release();
  743. }
  744. // nicht constant
  745. void MenüOptionen::reset()
  746. {
  747. InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
  748. if( !opd->laden() )
  749. DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
  750. breite->setText( "80" );
  751. if( opd->wertExistiert( "Breite" ) )
  752. breite->setText( Text() += (int)*opd->zWert( "Breite" ) );
  753. else
  754. opd->addWert( "Breite", "80" );
  755. höhe->setText( "50" );
  756. if( opd->wertExistiert( "Höhe" ) )
  757. höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) );
  758. else
  759. opd->addWert( "Höhe", "50" );
  760. zAnzahl->setText( "1" );
  761. if( opd->wertExistiert( "Ziele" ) )
  762. zAnzahl->setText( Text() += (int)*opd->zWert( "Ziele" ) );
  763. else
  764. opd->addWert( "Ziele", "1" );
  765. nAnzahl->setText( "10" );
  766. if( opd->wertExistiert( "Anhängen" ) )
  767. nAnzahl->setText( Text() += (int)*opd->zWert( "Anhängen" ) );
  768. else
  769. opd->addWert( "Anhängen", "10" );
  770. tempo->setText( "10" );
  771. if( opd->wertExistiert( "Geschwindigkeit" ) )
  772. tempo->setText( Text() += (int)*opd->zWert( "Geschwindigkeit" ) );
  773. else
  774. opd->addWert( "Geschwindigkeit", "10" );
  775. fortsetzen->removeStyle( KontrollKnopf::Style::Selected );
  776. if( opd->wertExistiert( "Fortsetzen" ) )
  777. fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 );
  778. else
  779. opd->addWert( "Fortsetzen", "0" );
  780. beendet = 0;
  781. opd->speichern();
  782. opd->release();
  783. }
  784. void MenüOptionen::doMausEreignis( MausEreignis &me )
  785. {
  786. breite->doMausEreignis( me );
  787. höhe->doMausEreignis( me );
  788. zAnzahl->doMausEreignis( me );
  789. nAnzahl->doMausEreignis( me );
  790. tempo->doMausEreignis( me );
  791. fortsetzen->doMausEreignis( me );
  792. bool vera = me.verarbeitet;
  793. abbrechen->doMausEreignis( me );
  794. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  795. beendet = 1;
  796. vera = me.verarbeitet;
  797. ok->doMausEreignis( me );
  798. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  799. {
  800. InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
  801. if( !opd->laden() )
  802. DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
  803. if( (int)*breite->zText() > 1000 )
  804. breite->setText( "1000" );
  805. if( (int)*breite->zText() < 20 )
  806. breite->setText( "20" );
  807. if( opd->wertExistiert( "Breite" ) )
  808. opd->setWert( "Breite", Text() += (int)*breite->zText() );
  809. else
  810. opd->addWert( "Breite", Text() += (int)*breite->zText() );
  811. if( (int)*höhe->zText() > 1000 )
  812. höhe->setText( "1000" );
  813. if( (int)*höhe->zText() < 20 )
  814. höhe->setText( "20" );
  815. if( opd->wertExistiert( "Höhe" ) )
  816. opd->setWert( "Höhe", Text() += (int)*höhe->zText() );
  817. else
  818. opd->addWert( "Höhe", Text() += (int)*höhe->zText() );
  819. if( (int)*zAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 )
  820. zAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) );
  821. if( (int)*zAnzahl->zText() < 1 )
  822. zAnzahl->setText( "1" );
  823. if( opd->wertExistiert( "Ziele" ) )
  824. opd->setWert( "Ziele", Text() += (int)*zAnzahl->zText() );
  825. else
  826. opd->addWert( "Ziele", Text() += (int)*zAnzahl->zText() );
  827. if( (int)*nAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 )
  828. nAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) );
  829. if( (int)*nAnzahl->zText() < 1 )
  830. nAnzahl->setText( "1" );
  831. if( opd->wertExistiert( "Anhängen" ) )
  832. opd->setWert( "Anhängen", Text() += (int)*nAnzahl->zText() );
  833. else
  834. opd->addWert( "Anhängen", Text() += (int)*nAnzahl->zText() );
  835. if( (int)*tempo->zText() < 1 )
  836. tempo->setText( "1" );
  837. if( (int)*tempo->zText() > 10 )
  838. tempo->setText( "10" );
  839. if( opd->wertExistiert( "Geschwindigkeit" ) )
  840. opd->setWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
  841. else
  842. opd->addWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
  843. if( opd->wertExistiert( "Fortsetzen" ) )
  844. opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
  845. else
  846. opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
  847. opd->speichern();
  848. opd->release();
  849. beendet = 1;
  850. }
  851. }
  852. void MenüOptionen::doTastaturEreignis( TastaturEreignis &te )
  853. {
  854. breite->doTastaturEreignis( te );
  855. höhe->doTastaturEreignis( te );
  856. zAnzahl->doTastaturEreignis( te );
  857. nAnzahl->doTastaturEreignis( te );
  858. tempo->doTastaturEreignis( te );
  859. }
  860. bool MenüOptionen::tick( double tickVal )
  861. {
  862. bool ret = breite->tick( tickVal );
  863. ret |= höhe->tick( tickVal );
  864. ret |= zAnzahl->tick( tickVal );
  865. ret |= nAnzahl->tick( tickVal );
  866. ret |= tempo->tick( tickVal );
  867. ret |= fortsetzen->tick( tickVal );
  868. ret |= abbrechen->tick( tickVal );
  869. ret |= ok->tick( tickVal );
  870. return ret;
  871. }
  872. void MenüOptionen::render( Bild &zRObj )
  873. {
  874. breiteT->render( zRObj );
  875. breite->render( zRObj );
  876. höheT->render( zRObj );
  877. höhe->render( zRObj );
  878. zAnzahlT->render( zRObj );
  879. zAnzahl->render( zRObj );
  880. nAnzahlT->render( zRObj );
  881. nAnzahl->render( zRObj );
  882. tempoT->render( zRObj );
  883. tempo->render( zRObj );
  884. fortsetzen->render( zRObj );
  885. abbrechen->render( zRObj );
  886. ok->render( zRObj );
  887. }
  888. // constant
  889. bool MenüOptionen::istBeendet() const
  890. {
  891. return beendet;
  892. }
  893. // Reference Counting
  894. MenüOptionen *MenüOptionen::getThis()
  895. {
  896. ref++;
  897. return this;
  898. }
  899. MenüOptionen *MenüOptionen::release()
  900. {
  901. ref--;
  902. if( !ref )
  903. delete this;
  904. return 0;
  905. }
  906. // Inhalt der Menü Klasse aus Menü.h
  907. // Konstruktor
  908. Menü::Menü( Schrift *zSchrift, Bildschirm *zScreen, KSGClient::MinigameServerClient *klient )
  909. {
  910. spielen = initKnopf( 350, 180, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Spielen" );
  911. spielenF = new MenüSpiel( zSchrift, zScreen, klient->getThis() );
  912. optionen = initKnopf( 350, 220, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Optionen" );
  913. optionenF = new MenüOptionen( zSchrift, zScreen );
  914. statistik = initKnopf( 350, 260, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Statistik" );
  915. statistikF = new MenüStatistik( zSchrift, zScreen, klient );
  916. beenden = initKnopf( 350, 300, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
  917. ram = new LRahmen();
  918. ram->setFarbe( 0xFFFFFFFF );
  919. beendet = 0;
  920. status = 0;
  921. LTDBDatei *bgd = new LTDBDatei();
  922. bgd->setDatei( new Text( "data/Minigames/Snake/bilder/hintergrund.ltdb" ) );
  923. bgd->leseDaten( 0 );
  924. hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) );
  925. bgd->release();
  926. ref = 1;
  927. }
  928. // Destruktor
  929. Menü::~Menü()
  930. {
  931. spielen->release();
  932. spielenF->release();
  933. optionen->release();
  934. optionenF->release();
  935. statistik->release();
  936. statistikF->release();
  937. beenden->release();
  938. if( hintergrund )
  939. hintergrund->release();
  940. ram->release();
  941. }
  942. // nicht constant
  943. void Menü::reset()
  944. {
  945. status = 0;
  946. beendet = 0;
  947. }
  948. void Menü::doMausEreignis( MausEreignis &me )
  949. {
  950. switch( status )
  951. {
  952. case 0:
  953. if( 1 )
  954. {
  955. bool vera = me.verarbeitet;
  956. spielen->doMausEreignis( me );
  957. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  958. {
  959. spielenF->reset();
  960. status = 3;
  961. }
  962. vera = me.verarbeitet;
  963. optionen->doMausEreignis( me );
  964. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  965. {
  966. optionenF->reset();
  967. status = 1;
  968. }
  969. vera = me.verarbeitet;
  970. statistik->doMausEreignis( me );
  971. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  972. {
  973. statistikF->reset();
  974. status = 2;
  975. }
  976. vera = me.verarbeitet;
  977. beenden->doMausEreignis( me );
  978. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  979. beendet = 1;
  980. }
  981. break;
  982. case 1:
  983. optionenF->doMausEreignis( me );
  984. break;
  985. case 2:
  986. statistikF->doMausEreignis( me );
  987. break;
  988. case 3:
  989. spielenF->doMausEreignis( me );
  990. }
  991. }
  992. void Menü::doTastaturEreignis( TastaturEreignis &te )
  993. {
  994. if( status == 1 )
  995. optionenF->doTastaturEreignis( te );
  996. if( status == 3 )
  997. spielenF->doTastaturEreignis( te );
  998. }
  999. bool Menü::tick( double z )
  1000. {
  1001. switch( status )
  1002. {
  1003. case 0:
  1004. if( 1 )
  1005. {
  1006. bool ret = spielen->tick( z );
  1007. ret |= statistik->tick( z );
  1008. ret |= optionen->tick( z );
  1009. ret |= beenden->tick( z );
  1010. return ret;
  1011. }
  1012. case 1:
  1013. if( optionenF->istBeendet() )
  1014. {
  1015. status = 0;
  1016. return 1;
  1017. }
  1018. return optionenF->tick( z );
  1019. case 2:
  1020. if( statistikF->istBeendet() )
  1021. {
  1022. status = 0;
  1023. return 1;
  1024. }
  1025. return statistikF->tick( z );
  1026. case 3:
  1027. if( spielenF->istBeendet() )
  1028. {
  1029. status = 0;
  1030. return 1;
  1031. }
  1032. return spielenF->tick( z );
  1033. }
  1034. return 0;
  1035. }
  1036. void Menü::render( Bild &zRObj )
  1037. {
  1038. if( status != 3 && hintergrund && ( status != 2 || !statistikF->istWiederhohlung() ) )
  1039. zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund );
  1040. switch( status )
  1041. {
  1042. case 0:
  1043. ram->setPosition( 300, 170 );
  1044. ram->setSize( 200, 160 );
  1045. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  1046. ram->render( zRObj );
  1047. spielen->render( zRObj );
  1048. statistik->render( zRObj );
  1049. optionen->render( zRObj );
  1050. beenden->render( zRObj );
  1051. break;
  1052. case 1:
  1053. ram->setPosition( 300, 110 );
  1054. ram->setSize( 200, 280 );
  1055. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  1056. ram->render( zRObj );
  1057. optionenF->render( zRObj );
  1058. break;
  1059. case 2:
  1060. if( hintergrund && !statistikF->istWiederhohlung() )
  1061. zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 );
  1062. statistikF->render( zRObj );
  1063. break;
  1064. case 3:
  1065. spielenF->render( zRObj );
  1066. }
  1067. }
  1068. // constant
  1069. bool Menü::istBeendet() const
  1070. {
  1071. return beendet;
  1072. }
  1073. // Reference Counting
  1074. Menü *Menü::getThis()
  1075. {
  1076. ref++;
  1077. return this;
  1078. }
  1079. Menü *Menü::release()
  1080. {
  1081. ref--;
  1082. if( !ref )
  1083. delete this;
  1084. return 0;
  1085. }