#include "Menü.h" #include "Initialisierung.h" #include #include #include #include #include #include #include #include #include #include #include #include // Inhalt der MenüVerloren Klasse aus Menü.h // Kontruktor MenüVerloren::MenüVerloren( UIInit &uiFactory ) : ReferenceCounter() { ram = new LRahmen(); ram->setSize( 160, 100 ); ram->setPosition( 320, 200 ); ram->setFarbe( 0xFFFFFFFF ); verloren = initTextFeld( 325, 210, 150, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." ); neu = initKnopf( 350, 240, 100, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" ); beenden = initKnopf( 350, 270, 100, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" ); } // Destruktor MenüVerloren::~MenüVerloren() { verloren->release(); neu->release(); beenden->release(); ram->release(); } // nicht constant int MenüVerloren::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; int ret = 0; neu->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) ret = 1; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks ) ret = 2; return ret; } bool MenüVerloren::tick( double tickVal ) { bool ret = verloren->tick( tickVal ); ret |= neu->tick( tickVal ); ret |= beenden->tick( tickVal ); return ret; } void MenüVerloren::render( Bild &zRObj ) { zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); verloren->render( zRObj ); neu->render( zRObj ); beenden->render( zRObj ); ram->render( zRObj ); } // Inhalt der MenüSpiel Klasse aus Menü.h // Konstruktor MenüSpiel::MenüSpiel( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) : ReferenceCounter() { scoreT = initTextFeld( 690, 10, 100, 20, uiFactory, TextFeld::Style::Text, "Score: 0" ); beenden = initKnopf( 690, 40, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); map = new Map( klient ); verloren = new MenüVerloren( uiFactory ); beendet = 0; timePuffer = 0; } // Destruktor MenüSpiel::~MenüSpiel() { scoreT->release(); beenden->release(); map->release(); verloren->release(); } // nicht constant void MenüSpiel::reset() { InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" ); Text optionen = "Width="; if( opd->wertExistiert( "Breite" ) ) optionen += (int)*opd->zWert( "Breite" ); else { opd->addWert( "Breite", "80" ); optionen += 80; } optionen += ",Height="; if( opd->wertExistiert( "Höhe" ) ) optionen += (int)*opd->zWert( "Höhe" ); else { opd->addWert( "Höhe", "50" ); optionen += 50; } optionen += ",Ziele="; if( opd->wertExistiert( "Ziele" ) ) optionen += (int)*opd->zWert( "Ziele" ); else { opd->addWert( "Ziele", "1" ); optionen += 1; } optionen += ",Anhang="; if( opd->wertExistiert( "Anhängen" ) ) optionen += (int)*opd->zWert( "Anhängen" ); else { opd->addWert( "Anhängen", "10" ); optionen += 10; } optionen += ",Speed="; if( opd->wertExistiert( "Geschwindigkeit" ) ) optionen += (int)*opd->zWert( "Geschwindigkeit" ); else { opd->addWert( "Geschwindigkeit", "10" ); optionen += 10; } optionen += ",Fortsetzen="; if( opd->wertExistiert( "Fortsetzen" ) ) optionen += (int)*opd->zWert( "Fortsetzen" ) != 0; else { opd->addWert( "Fortsetzen", "0" ); optionen += 0; } opd->speichern(); opd->release(); optionen += ",Seed=0"; map->reset( &optionen ); beendet = 0; scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); } void MenüSpiel::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { map->speichern(); beendet = 1; } map->doPublicMausEreignis( me ); if( map->istBeendet() ) { int ak = verloren->doPublicMausEreignis( me ); if( ak == 1 ) reset(); if( ak == 2 ) beendet = 1; } } void MenüSpiel::doTastaturEreignis( TastaturEreignis &te ) { if( map->istBeendet() ) { if( te.id == TE_Release && te.taste == T_Enter ) reset(); if( te.id == TE_Release && te.taste == T_BackSpace ) beendet = 1; return; } map->doTastaturEreignis( te ); } bool MenüSpiel::tick( double tickVal ) { timePuffer += tickVal; bool ret = beenden->tick( tickVal ); while( timePuffer >= 0.01 ) { ret |= map->tick( 0.01 ); timePuffer -= 0.01; } scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); if( map->istBeendet() ) ret |= verloren->tick( tickVal ); return ret; } void MenüSpiel::render( Bild &zRObj ) { scoreT->render( zRObj ); beenden->render( zRObj ); map->render( zRObj ); if( map->istBeendet() ) verloren->render( zRObj ); } // constant bool MenüSpiel::istBeendet() const { return beendet; } // Inhalt der MenüWiederhohlung Klasse // Konstruktor MenüWiederhohlung::MenüWiederhohlung( UIInit &uiFactory, Datei *datei, Text *zOptionen ) : ReferenceCounter() { scoreT = initTextFeld( 690, 10, 100, 20, uiFactory, TextFeld::Style::Text, "Score: 0" ); beenden = initKnopf( 690, 40, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); this->datei = datei; if( !datei->istOffen() ) datei->open( Datei::Style::lesen ); __int64 seed; datei->lese( (char *)&seed, 8 ); zOptionen->append( ",Fortsetzen=0,Seed=" ); zOptionen->append( seed ); map = new Map( 0 ); map->reset( zOptionen ); beendet = 0; nowTime = 0; nextTime = 0; datei->lese( (char *)&nextTime, 8 ); timePuffer = 0; } // Destruktor MenüWiederhohlung::~MenüWiederhohlung() { scoreT->release(); beenden->release(); map->release(); datei->close(); datei->release(); } // nicht constant void MenüWiederhohlung::doPublicMausEreignis( MausEreignis &me ) { bool vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; if( map->istBeendet() ) beendet = 1; } void MenüWiederhohlung::doTastaturEreignis( TastaturEreignis &te ) {} bool MenüWiederhohlung::tick( double tickVal ) { bool ret = beenden->tick( tickVal ); // TODO Replay Activity while( nextTime >= 0 && nowTime + tickVal >= nextTime ) { while( nowTime < nextTime ) { ret |= map->tick( 0.01 ); tickVal -= 0.01; nowTime += 0.01; } char aktion; datei->lese( &aktion, 1 ); if( datei->istEnde() ) nextTime = -1; else datei->lese( (char *)&nextTime, 8 ); TastaturEreignis te; te.taste = aktion; te.verarbeitet = 0; te.id = TE_Press; map->doTastaturEreignis( te ); } timePuffer += tickVal; while( timePuffer > 0 ) { ret |= map->tick( 0.01 ); nowTime += 0.01; timePuffer -= 0.01; } scoreT->setText( "Score: " ); scoreT->zText()->append( map->getScore() ); return ret; } void MenüWiederhohlung::render( Bild &zRObj ) { map->render( zRObj ); scoreT->render( zRObj ); beenden->render( zRObj ); } // constant bool MenüWiederhohlung::istBeendet() const { return beendet; } // Inhalt der MenüStatistik Klasse aus Menü.h // Konstruktor MenüStatistik::MenüStatistik( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) : ReferenceCounter() { this->klient = klient; wiederH = 0; this->uiFactory = uiFactory; ansichtT = initTextFeld( 245, 10, 50, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" ); ansicht = initAuswahlBox( 295, 10, 120, 20, uiFactory, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } ); optionen = initKontrollKnopf( 425, 10, 130, 20, uiFactory, KontrollKnopf::Style::Normal, "Optionen beachten" ); worldBestT = initObjTabelle( 115, 40, 570, 120, uiFactory, 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 ); gesammtT = initObjTabelle( 115, 170, 570, 290, uiFactory, 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 ); optionenT = initObjTabelle( 115, 170, 570, 290, uiFactory, 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 ); gesammtD = initLinienDiagramm( 100, 170, 600, 290, uiFactory, LDiag::Style::DatenRahmen, 0 ); optionenD = initLinienDiagramm( 100, 170, 600, 290, uiFactory, LDiag::Style::DatenRahmen, 0 ); releasen = initKnopf( 10, 470, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Zurücksetzen" ); zurück = initKnopf( 350, 470, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Zurück" ); tr = new TextRenderer( dynamic_cast( uiFactory.initParam.schrift->getThis() ) ); asyncFinished = 1; } // Destruktor MenüStatistik::~MenüStatistik() { while( !asyncFinished ) { Sleep( 100 ); } tr->release(); worldBestT->release(); ansichtT->release(); ansicht->release(); optionen->release(); gesammtT->release(); optionenT->release(); gesammtD->release(); optionenD->release(); releasen->release(); zurück->release(); klient->release(); if( wiederH ) wiederH->release(); } // nicht constant void MenüStatistik::reset() { if( wiederH ) wiederH = (MenüWiederhohlung *)wiederH->release(); ObjTabelle *tmpWBT = dynamic_cast( worldBestT->getThis() ); KSGClient::MinigameServerClient *tmpKlient = dynamic_cast( klient->getThis() ); asyncFinished = 0; new AsynchronCall( [this, tmpWBT, tmpKlient]() { Array< int > score; RCArray< Text > player; RCArray< Text > option; int anz = tmpKlient->getMinigameBestscoreList( "Snake", &score, &player, &option ); for( int i = 0; i < anz; i++ ) { TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, Text( score.get( i ) ) ); TextFeld *spielerT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, player.z( i )->getText() ); Text optionen = option.z( i )->getText(); Text *breite = optionen.getTeilText( optionen.positionVon( '=' ) + 1, optionen.positionVon( ',' ) ); Text *höhe = optionen.getTeilText( optionen.positionVon( '=', 1 ) + 1, optionen.positionVon( ',', 1 ) ); Text *ziele = optionen.getTeilText( optionen.positionVon( '=', 2 ) + 1, optionen.positionVon( ',', 2 ) ); Text *anhang = optionen.getTeilText( optionen.positionVon( '=', 3 ) + 1, optionen.positionVon( ',', 3 ) ); Text *tempo = optionen.getTeilText( optionen.positionVon( '=', 4 ) + 1 ); TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, breite->getText() ); breite->release(); TextFeld *höheT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, höhe->getText() ); höhe->release(); TextFeld *zieleT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, ziele->getText() ); ziele->release(); TextFeld *anhangT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, anhang->getText() ); anhang->release(); TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, tempo->getText() ); tempo->release(); Knopf *ansehenK = initKnopf( 0, 0, 0, 0, uiFactory, Knopf::Style::Normal, "Ansehen" ); ansehenK->setMausEreignis( [this, optionen]( void *p, void *obj, MausEreignis me ) -> bool { if( me.id == ME_RLinks && !me.verarbeitet ) { ( (Knopf *)obj )->removeStyle( Knopf::Style::Erlaubt ); getThis(); new AsynchronCall( [this, optionen, obj]() { Datei *d = klient->downloadGameCapture( "Snake", optionen ); ( (Knopf *)obj )->addStyle( Knopf::Style::Erlaubt ); if( wiederH ) wiederH = (MenüWiederhohlung *)wiederH->release(); Text options = optionen.getText(); wiederH = new MenüWiederhohlung( uiFactory, d, &options ); release(); } ); } return 1; } ); tmpWBT->addZeile( optionen.getText() ); tmpWBT->setZeichnungZ( 0, i + 1, scoreT ); tmpWBT->setZeichnungZ( 1, i + 1, spielerT ); tmpWBT->setZeichnungZ( 2, i + 1, ansehenK ); tmpWBT->setZeichnungZ( 3, i + 1, breiteT ); tmpWBT->setZeichnungZ( 4, i + 1, höheT ); tmpWBT->setZeichnungZ( 5, i + 1, zieleT ); tmpWBT->setZeichnungZ( 6, i + 1, anhangT ); tmpWBT->setZeichnungZ( 7, i + 1, tempoT ); } tmpKlient->release(); tmpWBT->release(); }, &asyncFinished ); InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" ); opd->laden(); if( !opd->wertExistiert( "Breite" ) ) opd->addWert( "Breite", "80" ); if( !opd->wertExistiert( "Höhe" ) ) opd->addWert( "Höhe", "50" ); if( !opd->wertExistiert( "Ziele" ) ) opd->addWert( "Ziele", "1" ); if( !opd->wertExistiert( "Anhängen" ) ) opd->addWert( "Anhängen", "10" ); if( !opd->wertExistiert( "Geschwindigkeit" ) ) opd->addWert( "Geschwindigkeit", "10" ); if( !opd->wertExistiert( "Fortsetzen" ) ) opd->addWert( "Fortsetzen", "0" ); opd->speichern(); KSGTDatei *stb = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" ); stb->laden(); int anz = stb->getZeilenAnzahl(); bool *fertig = new bool[ anz ]; ZeroMemory( fertig, anz ); int mS = 0; int omS = 0; int oAnz = 0; for( int i = 0; i < anz; i++ ) { int maxScore = -1; int p = -1; for( int j = 0; j < anz; j++ ) { if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) ) { p = j; maxScore = (int)*stb->zFeld( j, 1 ); } } if( p >= 0 ) { fertig[ p ] = 1; TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() ); TextFeld *datumT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() ); TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() ); TextFeld *höheT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() ); TextFeld *zieleT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() ); TextFeld *appendT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 6 )->getText() ); TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() ); gesammtT->addZeile( Text() += p ); gesammtT->setZeichnungZ( 0, i + 1, scoreT ); gesammtT->setZeichnungZ( 1, i + 1, datumT ); gesammtT->setZeichnungZ( 2, i + 1, breiteT ); gesammtT->setZeichnungZ( 3, i + 1, höheT ); gesammtT->setZeichnungZ( 4, i + 1, zieleT ); gesammtT->setZeichnungZ( 5, i + 1, appendT ); gesammtT->setZeichnungZ( 6, i + 1, tempoT ); if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) && höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) && zieleT->zText()->istGleich( opd->zWert( "Ziele" )->getText() ) && appendT->zText()->istGleich( opd->zWert( "Anhängen" )->getText() ) && tempoT->zText()->istGleich( opd->zWert( "Geschwindigkeit" )->getText() ) ) { optionenT->addZeile( Text() += p ); int n = optionenT->getZeilenNummer( Text() += p ); optionenT->setZeichnungZ( 0, n, dynamic_cast( scoreT->getThis() ) ); optionenT->setZeichnungZ( 1, n, dynamic_cast( datumT->getThis() ) ); optionenT->setZeichnungZ( 2, n, dynamic_cast( breiteT->getThis() ) ); optionenT->setZeichnungZ( 3, n, dynamic_cast( höheT->getThis() ) ); optionenT->setZeichnungZ( 4, n, dynamic_cast( zieleT->getThis() ) ); optionenT->setZeichnungZ( 5, n, dynamic_cast( appendT->getThis() ) ); optionenT->setZeichnungZ( 6, n, dynamic_cast( tempoT->getThis() ) ); if( !omS ) omS = maxScore; oAnz++; } } if( !mS ) mS = maxScore; } delete[] fertig; DiagDaten *gd = new DiagDaten(); gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar; gd->hIntervallFarbe = 0xFFFFFFFF; gd->hIntervallName->setText( "Spiel" ); gd->rasterDicke = 1; gd->rasterFarbe = 0xFF505050; gd->vIntervallFarbe = 0xFFFFFFFF; gd->vIntervallName->setText( "Score" ); gesammtD->setDiagDatenZ( gd ); gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) ); gesammtD->addVIntervallText( 0, "0" ); gesammtD->addHIntervallText( 0, "1" ); if( anz > 1 ) gesammtD->addHIntervallText( anz - 1, Text() += anz ); gesammtD->addWert( "Score" ); gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund ); gesammtD->setWertFarbe( 0, 0xFF00FF00 ); gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050; DiagDaten *od = new DiagDaten(); od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar; od->hIntervallFarbe = 0xFFFFFFFF; od->hIntervallName->setText( "Spiel" ); od->rasterDicke = 1; od->rasterFarbe = 0xFF505050; od->vIntervallFarbe = 0xFFFFFFFF; od->vIntervallName->setText( "Score" ); optionenD->setDiagDatenZ( od ); optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) ); optionenD->addVIntervallText( 0, "0" ); optionenD->addHIntervallText( 0, "1" ); if( oAnz > 1 ) optionenD->addHIntervallText( oAnz - 1, Text() += oAnz ); optionenD->addWert( "Score" ); optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund ); optionenD->setWertFarbe( 0, 0xFF00FF00 ); optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050; int j = 0; for( int i = 0; i < anz; i++ ) { gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) ); if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) && (int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) && (int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) && (int)*stb->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) && (int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) ) { optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) ); j++; } } stb->release(); opd->release(); beendet = 0; } void MenüStatistik::doPublicMausEreignis( MausEreignis &me ) { if( wiederH ) { wiederH->doPublicMausEreignis( me ); return; } ansicht->doPublicMausEreignis( me ); optionen->doPublicMausEreignis( me ); gesammtT->doPublicMausEreignis( me ); optionenT->doPublicMausEreignis( me ); worldBestT->doPublicMausEreignis( me ); bool vera = me.verarbeitet; releasen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { // Statistik releasen if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) { // nur bestimmte Statistik releasen InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" ); opd->laden(); KSGTDatei *score = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" ); score->laden(); int zeilen = score->getZeilenAnzahl(); for( int i = 0; i < zeilen; i++ ) { if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) && (int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) && (int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) && (int)*score->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) && (int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) ) { score->removeZeile( i ); i--; zeilen--; } } score->speichern(); score->release(); opd->release(); } else // alles releasen DateiRemove( "data/Minigames/Snake/data/score.ksgt" ); reset(); } vera = me.verarbeitet; zurück->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; } bool MenüStatistik::tick( double tickVal ) { if( wiederH ) { bool ret = wiederH->tick( tickVal ); if( wiederH->istBeendet() ) wiederH = (MenüWiederhohlung *)wiederH->release(); return ret; } bool ret = ansicht->tick( tickVal ); ret |= optionen->tick( tickVal ); ret |= releasen->tick( tickVal ); ret |= zurück->tick( tickVal ); ret |= gesammtT->tick( tickVal ); ret |= optionenT->tick( tickVal ); ret |= gesammtD->tick( tickVal ); ret |= optionenD->tick( tickVal ); ret |= worldBestT->tick( tickVal ); return ret; } void MenüStatistik::render( Bild &zRObj ) { if( wiederH ) { wiederH->render( zRObj ); return; } tr->setSchriftSize( 12 ); Text weltScore = "Welt Score:"; tr->renderText( 10, 40, weltScore, zRObj, 0xFFFFFFFF ); Text localScore = "Dein Score:"; tr->renderText( 10, 170, localScore, zRObj, 0xFFFFFFFF ); worldBestT->render( zRObj ); if( !ansicht->getAuswahl() ) { if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) optionenT->render( zRObj ); else gesammtT->render( zRObj ); } else { if( optionen->hatStyle( KontrollKnopf::Style::Selected ) ) optionenD->render( zRObj ); else gesammtD->render( zRObj ); } ansichtT->render( zRObj ); ansicht->render( zRObj ); optionen->render( zRObj ); releasen->render( zRObj ); zurück->render( zRObj ); } // constant bool MenüStatistik::istBeendet() const { return beendet; } bool MenüStatistik::istWiederhohlung() const { return wiederH != 0; } // Inhalt der MenüOptionen aus Menü.h // Konstruktor MenüOptionen::MenüOptionen( UIInit &uiFactory ) : ReferenceCounter() { breiteT = initTextFeld( 310, 120, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" ); breite = initTextFeld( 440, 120, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); breite->setTastaturEreignis( _nurNummernTE ); höheT = initTextFeld( 310, 160, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" ); höhe = initTextFeld( 440, 160, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); höhe->setTastaturEreignis( _nurNummernTE ); zAnzahlT = initTextFeld( 310, 200, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Verschiedene Ziele:" ); zAnzahl = initTextFeld( 440, 200, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); zAnzahl->setTastaturEreignis( _nurNummernTE ); nAnzahlT = initTextFeld( 310, 240, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Länge Hinzufügen:" ); nAnzahl = initTextFeld( 440, 240, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); nAnzahl->setTastaturEreignis( _nurNummernTE ); tempoT = initTextFeld( 310, 280, 130, 20, uiFactory, TextFeld::Style::Text | TextFeld::Style::VCenter, "Geschwindigkeit:" ); tempo = initTextFeld( 440, 280, 50, 20, uiFactory, TextFeld::Style::TextFeld, "" ); tempo->setTastaturEreignis( _nurNummernTE ); fortsetzen = initKontrollKnopf( 310, 320, 180, 20, uiFactory, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" ); fortsetzen->setMausEreignis( _ret1ME ); abbrechen = initKnopf( 310, 360, 85, 20, uiFactory, Knopf::Style::Sichtbar, "Abbrechen" ); ok = initKnopf( 405, 360, 85, 20, uiFactory, Knopf::Style::Sichtbar, "Ok" ); beendet = 0; } // Destruktor MenüOptionen::~MenüOptionen() { breiteT->release(); breite->release(); höheT->release(); höhe->release(); zAnzahlT->release(); zAnzahl->release(); nAnzahlT->release(); nAnzahl->release(); tempoT->release(); tempo->release(); fortsetzen->release(); abbrechen->release(); ok->release(); } // nicht constant void MenüOptionen::reset() { InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" ); breite->setText( "80" ); if( opd->wertExistiert( "Breite" ) ) breite->setText( Text() += (int)*opd->zWert( "Breite" ) ); else opd->addWert( "Breite", "80" ); höhe->setText( "50" ); if( opd->wertExistiert( "Höhe" ) ) höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) ); else opd->addWert( "Höhe", "50" ); zAnzahl->setText( "1" ); if( opd->wertExistiert( "Ziele" ) ) zAnzahl->setText( Text() += (int)*opd->zWert( "Ziele" ) ); else opd->addWert( "Ziele", "1" ); nAnzahl->setText( "10" ); if( opd->wertExistiert( "Anhängen" ) ) nAnzahl->setText( Text() += (int)*opd->zWert( "Anhängen" ) ); else opd->addWert( "Anhängen", "10" ); tempo->setText( "10" ); if( opd->wertExistiert( "Geschwindigkeit" ) ) tempo->setText( Text() += (int)*opd->zWert( "Geschwindigkeit" ) ); else opd->addWert( "Geschwindigkeit", "10" ); fortsetzen->removeStyle( KontrollKnopf::Style::Selected ); if( opd->wertExistiert( "Fortsetzen" ) ) fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 ); else opd->addWert( "Fortsetzen", "0" ); beendet = 0; opd->speichern(); opd->release(); } void MenüOptionen::doPublicMausEreignis( MausEreignis &me ) { breite->doPublicMausEreignis( me ); höhe->doPublicMausEreignis( me ); zAnzahl->doPublicMausEreignis( me ); nAnzahl->doPublicMausEreignis( me ); tempo->doPublicMausEreignis( me ); fortsetzen->doPublicMausEreignis( me ); bool vera = me.verarbeitet; abbrechen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; vera = me.verarbeitet; ok->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" ); if( (int)*breite->zText() > 1000 ) breite->setText( "1000" ); if( (int)*breite->zText() < 20 ) breite->setText( "20" ); if( opd->wertExistiert( "Breite" ) ) opd->setWert( "Breite", Text() += (int)*breite->zText() ); else opd->addWert( "Breite", Text() += (int)*breite->zText() ); if( (int)*höhe->zText() > 1000 ) höhe->setText( "1000" ); if( (int)*höhe->zText() < 20 ) höhe->setText( "20" ); if( opd->wertExistiert( "Höhe" ) ) opd->setWert( "Höhe", Text() += (int)*höhe->zText() ); else opd->addWert( "Höhe", Text() += (int)*höhe->zText() ); if( (int)*zAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) zAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) ); if( (int)*zAnzahl->zText() < 1 ) zAnzahl->setText( "1" ); if( opd->wertExistiert( "Ziele" ) ) opd->setWert( "Ziele", Text() += (int)*zAnzahl->zText() ); else opd->addWert( "Ziele", Text() += (int)*zAnzahl->zText() ); if( (int)*nAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) nAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) ); if( (int)*nAnzahl->zText() < 1 ) nAnzahl->setText( "1" ); if( opd->wertExistiert( "Anhängen" ) ) opd->setWert( "Anhängen", Text() += (int)*nAnzahl->zText() ); else opd->addWert( "Anhängen", Text() += (int)*nAnzahl->zText() ); if( (int)*tempo->zText() < 1 ) tempo->setText( "1" ); if( (int)*tempo->zText() > 10 ) tempo->setText( "10" ); if( opd->wertExistiert( "Geschwindigkeit" ) ) opd->setWert( "Geschwindigkeit", Text() += (int)*tempo->zText() ); else opd->addWert( "Geschwindigkeit", Text() += (int)*tempo->zText() ); if( opd->wertExistiert( "Fortsetzen" ) ) opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) ); else opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) ); opd->speichern(); opd->release(); beendet = 1; } } void MenüOptionen::doTastaturEreignis( TastaturEreignis &te ) { breite->doTastaturEreignis( te ); höhe->doTastaturEreignis( te ); zAnzahl->doTastaturEreignis( te ); nAnzahl->doTastaturEreignis( te ); tempo->doTastaturEreignis( te ); } bool MenüOptionen::tick( double tickVal ) { bool ret = breite->tick( tickVal ); ret |= höhe->tick( tickVal ); ret |= zAnzahl->tick( tickVal ); ret |= nAnzahl->tick( tickVal ); ret |= tempo->tick( tickVal ); ret |= fortsetzen->tick( tickVal ); ret |= abbrechen->tick( tickVal ); ret |= ok->tick( tickVal ); return ret; } void MenüOptionen::render( Bild &zRObj ) { breiteT->render( zRObj ); breite->render( zRObj ); höheT->render( zRObj ); höhe->render( zRObj ); zAnzahlT->render( zRObj ); zAnzahl->render( zRObj ); nAnzahlT->render( zRObj ); nAnzahl->render( zRObj ); tempoT->render( zRObj ); tempo->render( zRObj ); fortsetzen->render( zRObj ); abbrechen->render( zRObj ); ok->render( zRObj ); } // constant bool MenüOptionen::istBeendet() const { return beendet; } // Inhalt der Menü Klasse aus Menü.h // Konstruktor Menü::Menü( UIInit &uiFactory, KSGClient::MinigameServerClient *klient ) : ReferenceCounter() { spielen = initKnopf( 350, 180, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Spielen" ); spielenF = new MenüSpiel( uiFactory, dynamic_cast( klient->getThis() ) ); optionen = initKnopf( 350, 220, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Optionen" ); optionenF = new MenüOptionen( uiFactory ); statistik = initKnopf( 350, 260, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Statistik" ); statistikF = new MenüStatistik( uiFactory, klient ); beenden = initKnopf( 350, 300, 100, 20, uiFactory, Knopf::Style::Sichtbar, "Beenden" ); ram = new LRahmen(); ram->setFarbe( 0xFFFFFFFF ); beendet = 0; status = 0; LTDBDatei *bgd = new LTDBDatei(); bgd->setDatei( new Text( "data/Minigames/Snake/bilder/hintergrund.ltdb" ) ); bgd->leseDaten( 0 ); hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) ); bgd->release(); } // Destruktor Menü::~Menü() { spielen->release(); spielenF->release(); optionen->release(); optionenF->release(); statistik->release(); statistikF->release(); beenden->release(); if( hintergrund ) hintergrund->release(); ram->release(); } // nicht constant void Menü::reset() { status = 0; beendet = 0; } void Menü::doPublicMausEreignis( MausEreignis &me ) { switch( status ) { case 0: if( 1 ) { bool vera = me.verarbeitet; spielen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { spielenF->reset(); status = 3; } vera = me.verarbeitet; optionen->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { optionenF->reset(); status = 1; } vera = me.verarbeitet; statistik->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) { statistikF->reset(); status = 2; } vera = me.verarbeitet; beenden->doPublicMausEreignis( me ); if( !vera && me.verarbeitet && me.id == ME_RLinks ) beendet = 1; } break; case 1: optionenF->doPublicMausEreignis( me ); break; case 2: statistikF->doPublicMausEreignis( me ); break; case 3: spielenF->doPublicMausEreignis( me ); } } void Menü::doTastaturEreignis( TastaturEreignis &te ) { if( status == 1 ) optionenF->doTastaturEreignis( te ); if( status == 3 ) spielenF->doTastaturEreignis( te ); } bool Menü::tick( double z ) { switch( status ) { case 0: if( 1 ) { bool ret = spielen->tick( z ); ret |= statistik->tick( z ); ret |= optionen->tick( z ); ret |= beenden->tick( z ); return ret; } case 1: if( optionenF->istBeendet() ) { status = 0; return 1; } return optionenF->tick( z ); case 2: if( statistikF->istBeendet() ) { status = 0; return 1; } return statistikF->tick( z ); case 3: if( spielenF->istBeendet() ) { status = 0; return 1; } return spielenF->tick( z ); } return 0; } void Menü::render( Bild &zRObj ) { if( status != 3 && hintergrund && ( status != 2 || !statistikF->istWiederhohlung() ) ) zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund ); switch( status ) { case 0: ram->setPosition( 300, 170 ); ram->setSize( 200, 160 ); zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); ram->render( zRObj ); spielen->render( zRObj ); statistik->render( zRObj ); optionen->render( zRObj ); beenden->render( zRObj ); break; case 1: ram->setPosition( 300, 110 ); ram->setSize( 200, 280 ); zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 ); ram->render( zRObj ); optionenF->render( zRObj ); break; case 2: if( hintergrund && !statistikF->istWiederhohlung() ) zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 ); statistikF->render( zRObj ); break; case 3: spielenF->render( zRObj ); } } // constant bool Menü::istBeendet() const { return beendet; }