Menü.cpp 36 KB

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