Menü.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  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. // Inhalt der MenüVerloren Klasse aus Menü.h
  14. // Kontruktor
  15. MenüVerloren::MenüVerloren( Schrift *zSchrift )
  16. {
  17. ram = new LRahmen();
  18. ram->setSize( 160, 100 );
  19. ram->setPosition( 320, 200 );
  20. ram->setFarbe( 0xFFFFFFFF );
  21. verloren = initTextFeld( 325, 210, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." );
  22. neu = initKnopf( 350, 240, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" );
  23. beenden = initKnopf( 350, 270, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" );
  24. ref = 1;
  25. }
  26. // Destruktor
  27. MenüVerloren::~MenüVerloren()
  28. {
  29. verloren->release();
  30. neu->release();
  31. beenden->release();
  32. ram->release();
  33. }
  34. // nicht constant
  35. int MenüVerloren::doMausEreignis( MausEreignis &me )
  36. {
  37. bool vera = me.verarbeitet;
  38. int ret = 0;
  39. neu->doMausEreignis( me );
  40. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  41. ret = 1;
  42. beenden->doMausEreignis( me );
  43. if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks )
  44. ret = 2;
  45. return ret;
  46. }
  47. bool MenüVerloren::tick( double tickVal )
  48. {
  49. bool ret = verloren->tick( tickVal );
  50. ret |= neu->tick( tickVal );
  51. ret |= beenden->tick( tickVal );
  52. return ret;
  53. }
  54. void MenüVerloren::render( Bild &zRObj )
  55. {
  56. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  57. verloren->render( zRObj );
  58. neu->render( zRObj );
  59. beenden->render( zRObj );
  60. ram->render( zRObj );
  61. }
  62. // Reference Counting
  63. MenüVerloren *MenüVerloren::getThis()
  64. {
  65. ref++;
  66. return this;
  67. }
  68. MenüVerloren *MenüVerloren::release()
  69. {
  70. ref--;
  71. if( !ref )
  72. delete this;
  73. return 0;
  74. }
  75. // Inhalt der MenüSpiel Klasse aus Menü.h
  76. // Konstruktor
  77. MenüSpiel::MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen )
  78. {
  79. scoreT = initTextFeld( 690, 10, 100, 20, zSchrift, TextFeld::Style::Text, "Score: 0" );
  80. beenden = initKnopf( 690, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
  81. map = new Map();
  82. verloren = new MenüVerloren( zSchrift );
  83. beendet = 0;
  84. ref = 1;
  85. }
  86. // Destruktor
  87. MenüSpiel::~MenüSpiel()
  88. {
  89. scoreT->release();
  90. beenden->release();
  91. map->release();
  92. verloren->release();
  93. }
  94. // nicht constant
  95. void MenüSpiel::reset()
  96. {
  97. map->reset();
  98. beendet = 0;
  99. scoreT->setText( "Score: " );
  100. scoreT->zText()->append( map->getScore() );
  101. }
  102. void MenüSpiel::doMausEreignis( MausEreignis &me )
  103. {
  104. bool vera = me.verarbeitet;
  105. beenden->doMausEreignis( me );
  106. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  107. {
  108. map->speichern();
  109. beendet = 1;
  110. }
  111. map->doMausEreignis( me );
  112. if( map->istBeendet() )
  113. {
  114. int ak = verloren->doMausEreignis( me );
  115. if( ak == 1 )
  116. reset();
  117. if( ak == 2 )
  118. beendet = 1;
  119. }
  120. }
  121. void MenüSpiel::doTastaturEreignis( TastaturEreignis &te )
  122. {
  123. if( map->istBeendet() )
  124. {
  125. if( te.id == TE_Release && te.taste == T_Enter )
  126. reset();
  127. if( te.id == TE_Release && te.taste == T_BackSpace )
  128. beendet = 1;
  129. return;
  130. }
  131. map->doTastaturEreignis( te );
  132. }
  133. bool MenüSpiel::tick( double tickVal )
  134. {
  135. bool ret = beenden->tick( tickVal );
  136. ret |= map->tick( tickVal );
  137. scoreT->setText( "Score: " );
  138. scoreT->zText()->append( map->getScore() );
  139. if( map->istBeendet() )
  140. ret |= verloren->tick( tickVal );
  141. return ret;
  142. }
  143. void MenüSpiel::render( Bild &zRObj )
  144. {
  145. map->render( zRObj );
  146. scoreT->render( zRObj );
  147. beenden->render( zRObj );
  148. if( map->istBeendet() )
  149. verloren->render( zRObj );
  150. }
  151. // constant
  152. bool MenüSpiel::istBeendet() const
  153. {
  154. return beendet;
  155. }
  156. // Reference Counting
  157. MenüSpiel *MenüSpiel::getThis()
  158. {
  159. ref++;
  160. return this;
  161. }
  162. MenüSpiel *MenüSpiel::release()
  163. {
  164. ref--;
  165. if( !ref )
  166. delete this;
  167. return 0;
  168. }
  169. // Inhalt der MenüStatistik Klasse aus Menü.h
  170. // Konstruktor
  171. MenüStatistik::MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen )
  172. {
  173. ansichtT = initTextFeld( 245, 10, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" );
  174. ansicht = initAuswahlBox( 295, 10, 120, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } );
  175. optionen = initKontrollKnopf( 425, 10, 130, 20, zSchrift, KontrollKnopf::Style::Normal, "Optionen beachten" );
  176. gesammtT = initObjTabelle( 150, 40, 500, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "+Tempo", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
  177. optionenT = initObjTabelle( 150, 40, 500, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "+Tempo", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
  178. gesammtD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
  179. optionenD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
  180. removen = initKnopf( 10, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurücksetzen" );
  181. zurück = initKnopf( 350, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurück" );
  182. schrift = zSchrift->getThis();
  183. }
  184. // Destruktor
  185. MenüStatistik::~MenüStatistik()
  186. {
  187. int anz = gesammtT->getZeilenAnzahl();
  188. for( int i = 0; i < anz; i++ )
  189. {
  190. for( int j = 0; j < 6; j++ )
  191. ( (TextFeld*)gesammtT->zZeichnung( j, 0 ) )->release();
  192. gesammtT->removeZeile( 0 );
  193. }
  194. for( int j = 0; j < 6; j++ )
  195. ( (TextFeld*)optionenT->zZeichnung( j, 0 ) )->release();
  196. ansichtT->release();
  197. ansicht->release();
  198. optionen->release();
  199. gesammtT->release();
  200. optionenT->release();
  201. gesammtD->release();
  202. optionenD->release();
  203. removen->release();
  204. zurück->release();
  205. schrift->release();
  206. }
  207. // nicht constant
  208. void MenüStatistik::reset()
  209. {
  210. int anz = gesammtT->getZeilenAnzahl();
  211. for( int i = 1; i < anz; i++ )
  212. {
  213. for( int j = 0; j < 6; j++ )
  214. ( (TextFeld*)gesammtT->zZeichnung( j, 1 ) )->release();
  215. gesammtT->removeZeile( 1 );
  216. }
  217. anz = optionenT->getZeilenAnzahl();
  218. for( int i = 1; i < anz; i++ )
  219. optionenT->removeZeile( 1 );
  220. InitDatei *opd = new InitDatei( "data/Minigames/Tetris/data/optionen.ini" );
  221. opd->laden();
  222. if( !opd->wertExistiert( "Breite" ) )
  223. opd->addWert( "Breite", "15" );
  224. if( !opd->wertExistiert( "Höhe" ) )
  225. opd->addWert( "Höhe", "25" );
  226. if( !opd->wertExistiert( "+Geschwindigkeit" ) )
  227. opd->addWert( "+Geschwindigkeit", "50" );
  228. if( !opd->wertExistiert( "Geschwindigkeit" ) )
  229. opd->addWert( "Geschwindigkeit", "1000" );
  230. if( !opd->wertExistiert( "Fortsetzen" ) )
  231. opd->addWert( "Fortsetzen", "0" );
  232. opd->speichern();
  233. KSGTDatei *stb = new KSGTDatei( "data/Minigames/Tetris/data/score.ksgt" );
  234. stb->laden();
  235. anz = stb->getZeilenAnzahl();
  236. bool *fertig = new bool[ anz ];
  237. ZeroMemory( fertig, anz );
  238. int mS = 0;
  239. int omS = 0;
  240. int oAnz = 0;
  241. for( int i = 0; i < anz; i++ )
  242. {
  243. int maxScore = -1;
  244. int p = -1;
  245. for( int j = 0; j < anz; j++ )
  246. {
  247. if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) )
  248. {
  249. p = j;
  250. maxScore = (int)*stb->zFeld( j, 1 );
  251. }
  252. }
  253. if( p >= 0 )
  254. {
  255. fertig[ p ] = 1;
  256. TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() );
  257. TextFeld *datumT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() );
  258. TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() );
  259. TextFeld *höheT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() );
  260. TextFeld *schnellerT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() );
  261. TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() );
  262. gesammtT->addZeile( Text() += p );
  263. gesammtT->setZeichnungZ( 0, i + 1, scoreT );
  264. gesammtT->setZeichnungZ( 1, i + 1, datumT );
  265. gesammtT->setZeichnungZ( 2, i + 1, breiteT );
  266. gesammtT->setZeichnungZ( 3, i + 1, höheT );
  267. gesammtT->setZeichnungZ( 4, i + 1, schnellerT );
  268. gesammtT->setZeichnungZ( 5, i + 1, tempoT );
  269. if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) &&
  270. höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) &&
  271. schnellerT->zText()->istGleich( opd->zWert( "+Geschwindigkeit" )->getText() ) &&
  272. tempoT->zText()->istGleich( opd->zWert( "Geschwindigkeit" )->getText() ) )
  273. {
  274. optionenT->addZeile( Text() += p );
  275. int n = optionenT->getZeilenNummer( Text() += p );
  276. optionenT->setZeichnungZ( 0, n, scoreT );
  277. optionenT->setZeichnungZ( 1, n, datumT );
  278. optionenT->setZeichnungZ( 2, n, breiteT );
  279. optionenT->setZeichnungZ( 3, n, höheT );
  280. optionenT->setZeichnungZ( 4, n, schnellerT );
  281. optionenT->setZeichnungZ( 5, n, tempoT );
  282. if( !omS )
  283. omS = maxScore;
  284. oAnz++;
  285. }
  286. }
  287. if( !mS )
  288. mS = maxScore;
  289. }
  290. delete[] fertig;
  291. DiagDaten *gd = new DiagDaten();
  292. gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
  293. gd->hIntervallFarbe = 0xFFFFFFFF;
  294. gd->hIntervallName->setText( "Spiel" );
  295. gd->rasterDicke = 1;
  296. gd->rasterFarbe = 0xFF505050;
  297. gd->vIntervallFarbe = 0xFFFFFFFF;
  298. gd->vIntervallName->setText( "Score" );
  299. gesammtD->setDiagDatenZ( gd );
  300. gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) );
  301. gesammtD->addVIntervallText( 0, "0" );
  302. gesammtD->addHIntervallText( 0, "1" );
  303. if( anz > 1 )
  304. gesammtD->addHIntervallText( anz - 1, Text() += anz );
  305. gesammtD->addWert( "Score" );
  306. gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
  307. gesammtD->setWertFarbe( 0, 0xFF00FF00 );
  308. gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050;
  309. DiagDaten *od = new DiagDaten();
  310. od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
  311. od->hIntervallFarbe = 0xFFFFFFFF;
  312. od->hIntervallName->setText( "Spiel" );
  313. od->rasterDicke = 1;
  314. od->rasterFarbe = 0xFF505050;
  315. od->vIntervallFarbe = 0xFFFFFFFF;
  316. od->vIntervallName->setText( "Score" );
  317. optionenD->setDiagDatenZ( od );
  318. optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) );
  319. optionenD->addVIntervallText( 0, "0" );
  320. optionenD->addHIntervallText( 0, "1" );
  321. if( oAnz > 1 )
  322. optionenD->addHIntervallText( oAnz - 1, Text() += oAnz );
  323. optionenD->addWert( "Score" );
  324. optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
  325. optionenD->setWertFarbe( 0, 0xFF00FF00 );
  326. optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050;
  327. int j = 0;
  328. for( int i = 0; i < anz; i++ )
  329. {
  330. gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) );
  331. if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
  332. (int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
  333. (int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "+Geschwindigkeit" ) &&
  334. (int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
  335. {
  336. optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) );
  337. j++;
  338. }
  339. }
  340. stb->release();
  341. opd->release();
  342. beendet = 0;
  343. }
  344. void MenüStatistik::doMausEreignis( MausEreignis &me )
  345. {
  346. ansicht->doMausEreignis( me );
  347. optionen->doMausEreignis( me );
  348. bool vera = me.verarbeitet;
  349. removen->doMausEreignis( me );
  350. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  351. { // Statistik removen
  352. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  353. { // nur bestimmte Statistik removen
  354. InitDatei *opd = new InitDatei( "data/Minigames/Tetris/data/optionen.ini" );
  355. opd->laden();
  356. KSGTDatei *score = new KSGTDatei( "data/Minigames/Tetris/data/score.ksgt" );
  357. score->laden();
  358. int zeilen = score->getZeilenAnzahl();
  359. for( int i = 0; i < zeilen; i++ )
  360. {
  361. if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
  362. (int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
  363. (int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "+Geschwindigkeit" ) &&
  364. (int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
  365. {
  366. score->removeZeile( i );
  367. i--;
  368. zeilen--;
  369. }
  370. }
  371. score->speichern();
  372. score->release();
  373. opd->release();
  374. }
  375. else // alles removen
  376. DateiRemove( "data/Minigames/Tetris/data/score.ksgt" );
  377. reset();
  378. }
  379. vera = me.verarbeitet;
  380. zurück->doMausEreignis( me );
  381. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  382. beendet = 1;
  383. }
  384. bool MenüStatistik::tick( double tickVal )
  385. {
  386. bool ret = ansicht->tick( tickVal );
  387. ret |= optionen->tick( tickVal );
  388. ret |= removen->tick( tickVal );
  389. ret |= zurück->tick( tickVal );
  390. ret |= gesammtT->tick( tickVal );
  391. ret |= optionenT->tick( tickVal );
  392. ret |= gesammtD->tick( tickVal );
  393. ret |= optionenD->tick( tickVal );
  394. return ret;
  395. }
  396. void MenüStatistik::render( Bild &zRObj )
  397. {
  398. if( !ansicht->getAuswahl() )
  399. {
  400. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  401. optionenT->render( zRObj );
  402. else
  403. gesammtT->render( zRObj );
  404. }
  405. else
  406. {
  407. if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
  408. optionenD->render( zRObj );
  409. else
  410. gesammtD->render( zRObj );
  411. }
  412. ansichtT->render( zRObj );
  413. ansicht->render( zRObj );
  414. optionen->render( zRObj );
  415. removen->render( zRObj );
  416. zurück->render( zRObj );
  417. }
  418. // constant
  419. bool MenüStatistik::istBeendet() const
  420. {
  421. return beendet;
  422. }
  423. // Reference Counting
  424. MenüStatistik *MenüStatistik::getThis()
  425. {
  426. ref++;
  427. return this;
  428. }
  429. MenüStatistik *MenüStatistik::release()
  430. {
  431. ref--;
  432. if( !ref )
  433. delete this;
  434. return 0;
  435. }
  436. // Inhalt der MenüOptionen aus Menü.h
  437. // Konstruktor
  438. MenüOptionen::MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen )
  439. {
  440. breiteT = initTextFeld( 310, 140, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" );
  441. breite = initTextFeld( 440, 140, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  442. breite->setTastaturEreignis( _nurNummernTE );
  443. höheT = initTextFeld( 310, 180, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" );
  444. höhe = initTextFeld( 440, 180, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  445. höhe->setTastaturEreignis( _nurNummernTE );
  446. neuTempoT = initTextFeld( 310, 220, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Verschnellerung:" );
  447. neuTempo = initTextFeld( 440, 220, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  448. neuTempo->setTastaturEreignis( _nurNummernTE );
  449. tempoT = initTextFeld( 310, 260, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Zeit Abstände:" );
  450. tempo = initTextFeld( 440, 260, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  451. tempo->setTastaturEreignis( _nurNummernTE );
  452. fortsetzen = initKontrollKnopf( 310, 300, 180, 20, zSchrift, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" );
  453. fortsetzen->setMausEreignis( _ret1ME );
  454. abbrechen = initKnopf( 310, 340, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
  455. ok = initKnopf( 405, 340, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Ok" );
  456. beendet = 0;
  457. ref = 1;
  458. }
  459. // Destruktor
  460. MenüOptionen::~MenüOptionen()
  461. {
  462. breiteT->release();
  463. breite->release();
  464. höheT->release();
  465. höhe->release();
  466. neuTempoT->release();
  467. neuTempo->release();
  468. tempoT->release();
  469. tempo->release();
  470. fortsetzen->release();
  471. abbrechen->release();
  472. ok->release();
  473. }
  474. // nicht constant
  475. void MenüOptionen::reset()
  476. {
  477. InitDatei *opd = new InitDatei( "data/Minigames/Tetris/data/optionen.ini" );
  478. if( !opd->laden() )
  479. DateiPfadErstellen( "data/Minigames/Tetris/data/optionen.ini" );
  480. breite->setText( "15" );
  481. if( opd->wertExistiert( "Breite" ) )
  482. breite->setText( Text() += (int)*opd->zWert( "Breite" ) );
  483. else
  484. opd->addWert( "Breite", "15" );
  485. höhe->setText( "25" );
  486. if( opd->wertExistiert( "Höhe" ) )
  487. höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) );
  488. else
  489. opd->addWert( "Höhe", "25" );
  490. neuTempo->setText( "50" );
  491. if( opd->wertExistiert( "+Geschwindigkeit" ) )
  492. neuTempo->setText( Text() += (int)*opd->zWert( "+Geschwindigkeit" ) );
  493. else
  494. opd->addWert( "+Geschwindigkeit", "50" );
  495. tempo->setText( "1000" );
  496. if( opd->wertExistiert( "Geschwindigkeit" ) )
  497. tempo->setText( Text() += (int)*opd->zWert( "Geschwindigkeit" ) );
  498. else
  499. opd->addWert( "Geschwindigkeit", "1000" );
  500. fortsetzen->removeStyle( KontrollKnopf::Style::Selected );
  501. if( opd->wertExistiert( "Fortsetzen" ) )
  502. fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 );
  503. else
  504. opd->addWert( "Fortsetzen", "0" );
  505. beendet = 0;
  506. opd->speichern();
  507. opd->release();
  508. }
  509. void MenüOptionen::doMausEreignis( MausEreignis &me )
  510. {
  511. breite->doMausEreignis( me );
  512. höhe->doMausEreignis( me );
  513. neuTempo->doMausEreignis( me );
  514. tempo->doMausEreignis( me );
  515. fortsetzen->doMausEreignis( me );
  516. bool vera = me.verarbeitet;
  517. abbrechen->doMausEreignis( me );
  518. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  519. beendet = 1;
  520. vera = me.verarbeitet;
  521. ok->doMausEreignis( me );
  522. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  523. {
  524. InitDatei *opd = new InitDatei( "data/Minigames/Tetris/data/optionen.ini" );
  525. if( !opd->laden() )
  526. DateiPfadErstellen( "data/Minigames/tetris/data/optionen.ini" );
  527. if( (int)*breite->zText() > 100 )
  528. breite->setText( "100" );
  529. if( (int)*breite->zText() < 5 )
  530. breite->setText( "5" );
  531. if( opd->wertExistiert( "Breite" ) )
  532. opd->setWert( "Breite", Text() += (int)*breite->zText() );
  533. else
  534. opd->addWert( "Breite", Text() += (int)*breite->zText() );
  535. if( (int)*höhe->zText() > 100 )
  536. höhe->setText( "100" );
  537. if( (int)*höhe->zText() < 10 )
  538. höhe->setText( "10" );
  539. if( opd->wertExistiert( "Höhe" ) )
  540. opd->setWert( "Höhe", Text() += (int)*höhe->zText() );
  541. else
  542. opd->addWert( "Höhe", Text() += (int)*höhe->zText() );
  543. if( (int)*neuTempo->zText() > (int)*tempo->zText() )
  544. neuTempo->setText( *tempo->zText() );
  545. if( (int)*neuTempo->zText() < 0 )
  546. neuTempo->setText( "0" );
  547. if( opd->wertExistiert( "+Geschwindigkeit" ) )
  548. opd->setWert( "+Geschwindigkeit", Text() += (int)*neuTempo->zText() );
  549. else
  550. opd->addWert( "+Geschwindigkeit", Text() += (int)*neuTempo->zText() );
  551. if( (int)*tempo->zText() < 100 )
  552. tempo->setText( "100" );
  553. if( opd->wertExistiert( "Geschwindigkeit" ) )
  554. opd->setWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
  555. else
  556. opd->addWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
  557. if( opd->wertExistiert( "Fortsetzen" ) )
  558. opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
  559. else
  560. opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
  561. opd->speichern();
  562. opd->release();
  563. beendet = 1;
  564. }
  565. }
  566. void MenüOptionen::doTastaturEreignis( TastaturEreignis &te )
  567. {
  568. breite->doTastaturEreignis( te );
  569. höhe->doTastaturEreignis( te );
  570. neuTempo->doTastaturEreignis( te );
  571. tempo->doTastaturEreignis( te );
  572. }
  573. bool MenüOptionen::tick( double tickVal )
  574. {
  575. bool ret = breite->tick( tickVal );
  576. ret |= höhe->tick( tickVal );
  577. ret |= neuTempo->tick( tickVal );
  578. ret |= tempo->tick( tickVal );
  579. ret |= fortsetzen->tick( tickVal );
  580. ret |= abbrechen->tick( tickVal );
  581. ret |= ok->tick( tickVal );
  582. return ret;
  583. }
  584. void MenüOptionen::render( Bild &zRObj )
  585. {
  586. breiteT->render( zRObj );
  587. breite->render( zRObj );
  588. höheT->render( zRObj );
  589. höhe->render( zRObj );
  590. neuTempoT->render( zRObj );
  591. neuTempo->render( zRObj );
  592. tempoT->render( zRObj );
  593. tempo->render( zRObj );
  594. fortsetzen->render( zRObj );
  595. abbrechen->render( zRObj );
  596. ok->render( zRObj );
  597. }
  598. // constant
  599. bool MenüOptionen::istBeendet() const
  600. {
  601. return beendet;
  602. }
  603. // Reference Counting
  604. MenüOptionen *MenüOptionen::getThis()
  605. {
  606. ref++;
  607. return this;
  608. }
  609. MenüOptionen *MenüOptionen::release()
  610. {
  611. ref--;
  612. if( !ref )
  613. delete this;
  614. return 0;
  615. }
  616. // Inhalt der Menü Klasse aus Menü.h
  617. // Konstruktor
  618. Menü::Menü( Schrift *zSchrift, Bildschirm *zScreen )
  619. {
  620. spielen = initKnopf( 350, 180, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Spielen" );
  621. spielenF = new MenüSpiel( zSchrift, zScreen );
  622. optionen = initKnopf( 350, 220, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Optionen" );
  623. optionenF = new MenüOptionen( zSchrift, zScreen );
  624. statistik = initKnopf( 350, 260, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Statistik" );
  625. statistikF = new MenüStatistik( zSchrift, zScreen );
  626. beenden = initKnopf( 350, 300, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
  627. ram = new LRahmen();
  628. ram->setFarbe( 0xFFFFFFFF );
  629. beendet = 0;
  630. status = 0;
  631. LTDBDatei *bgd = new LTDBDatei();
  632. bgd->setDatei( new Text( "data/Minigames/Tetris/bilder/hintergrund.ltdb" ) );
  633. bgd->leseDaten( 0 );
  634. hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) );
  635. bgd->release();
  636. ref = 1;
  637. }
  638. // Destruktor
  639. Menü::~Menü()
  640. {
  641. spielen->release();
  642. spielenF->release();
  643. optionen->release();
  644. optionenF->release();
  645. statistik->release();
  646. statistikF->release();
  647. beenden->release();
  648. if( hintergrund )
  649. hintergrund->release();
  650. ram->release();
  651. }
  652. // nicht constant
  653. void Menü::reset()
  654. {
  655. status = 0;
  656. beendet = 0;
  657. }
  658. void Menü::doMausEreignis( MausEreignis &me )
  659. {
  660. switch( status )
  661. {
  662. case 0:
  663. if( 1 )
  664. {
  665. bool vera = me.verarbeitet;
  666. spielen->doMausEreignis( me );
  667. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  668. {
  669. spielenF->reset();
  670. status = 3;
  671. }
  672. vera = me.verarbeitet;
  673. optionen->doMausEreignis( me );
  674. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  675. {
  676. optionenF->reset();
  677. status = 1;
  678. }
  679. vera = me.verarbeitet;
  680. statistik->doMausEreignis( me );
  681. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  682. {
  683. statistikF->reset();
  684. status = 2;
  685. }
  686. vera = me.verarbeitet;
  687. beenden->doMausEreignis( me );
  688. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  689. beendet = 1;
  690. }
  691. break;
  692. case 1:
  693. optionenF->doMausEreignis( me );
  694. break;
  695. case 2:
  696. statistikF->doMausEreignis( me );
  697. break;
  698. case 3:
  699. spielenF->doMausEreignis( me );
  700. }
  701. }
  702. void Menü::doTastaturEreignis( TastaturEreignis &te )
  703. {
  704. if( status == 1 )
  705. optionenF->doTastaturEreignis( te );
  706. if( status == 3 )
  707. spielenF->doTastaturEreignis( te );
  708. }
  709. bool Menü::tick( double z )
  710. {
  711. switch( status )
  712. {
  713. case 0:
  714. if( 1 )
  715. {
  716. bool ret = spielen->tick( z );
  717. ret |= statistik->tick( z );
  718. ret |= optionen->tick( z );
  719. ret |= beenden->tick( z );
  720. return ret;
  721. }
  722. case 1:
  723. if( optionenF->istBeendet() )
  724. {
  725. status = 0;
  726. return 1;
  727. }
  728. return optionenF->tick( z );
  729. case 2:
  730. if( statistikF->istBeendet() )
  731. {
  732. status = 0;
  733. return 1;
  734. }
  735. return statistikF->tick( z );
  736. case 3:
  737. if( spielenF->istBeendet() )
  738. {
  739. status = 0;
  740. return 1;
  741. }
  742. return spielenF->tick( z );
  743. }
  744. return 0;
  745. }
  746. void Menü::render( Bild &zRObj )
  747. {
  748. if( status != 3 && hintergrund )
  749. zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund );
  750. switch( status )
  751. {
  752. case 0:
  753. ram->setPosition( 300, 170 );
  754. ram->setSize( 200, 160 );
  755. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  756. ram->render( zRObj );
  757. spielen->render( zRObj );
  758. statistik->render( zRObj );
  759. optionen->render( zRObj );
  760. beenden->render( zRObj );
  761. break;
  762. case 1:
  763. ram->setPosition( 300, 130 );
  764. ram->setSize( 200, 240 );
  765. zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
  766. ram->render( zRObj );
  767. optionenF->render( zRObj );
  768. break;
  769. case 2:
  770. if( hintergrund )
  771. zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 );
  772. statistikF->render( zRObj );
  773. break;
  774. case 3:
  775. spielenF->render( zRObj );
  776. }
  777. }
  778. // constant
  779. bool Menü::istBeendet() const
  780. {
  781. return beendet;
  782. }
  783. // Reference Counting
  784. Menü *Menü::getThis()
  785. {
  786. ref++;
  787. return this;
  788. }
  789. Menü *Menü::release()
  790. {
  791. ref--;
  792. if( !ref )
  793. delete this;
  794. return 0;
  795. }