#include "Map.h" #include #include #include #include #include // Inhalt der Map Klasse aus Map.h // Konstruktor Map::Map() { gegner = new RCArray< Spieler >(); ziele = new RCArray< Spieler >(); spieler = 0; feld = new LRahmen(); feld->setFarbe( 0xFFFFFFFF ); kam = new LRahmen(); kam->setFarbe( 0xFF777777 ); map = new LRahmen(); map->setFarbe( 0xFFFFFFFF ); map->setPosition( 10, 10 ); map->setSize( 200, 200 ); beendet = 1; sr = 1; ref = 1; } // Destruktor Map::~Map() { speichern(); gegner->release(); ziele->release(); if( spieler ) spieler->release(); feld->release(); kam->release(); map->release(); } // nicht constant void Map::reset() { beendet = 0; score = 0; gegner->leeren(); ziele->leeren(); if( spieler ) spieler = spieler->release(); ziele->leeren(); InitDatei *opd = new InitDatei( "data/Minigames/Fangen/data/optionen.ini" ); if( !opd->laden() ) DateiPfadErstellen( "data/Minigames/Fangen/data/optionen.ini" ); breite = 800; if( opd->wertExistiert( "Breite" ) ) breite = (int)*opd->zWert( "Breite" ); else opd->addWert( "Breite", "800" ); höhe = 500; if( opd->wertExistiert( "Höhe" ) ) höhe = (int)*opd->zWert( "Höhe" ); else opd->addWert( "Höhe", "500" ); zAnzahl = 1; if( opd->wertExistiert( "Ziele" ) ) zAnzahl = (int)*opd->zWert( "Ziele" ); else opd->addWert( "Ziele", "1" ); neuGegner = 3; if( opd->wertExistiert( "+Gegner" ) ) neuGegner = (int)*opd->zWert( "+Gegner" ); else opd->addWert( "+Gegner", "3" ); geschwindigkeit = 1000; if( opd->wertExistiert( "Geschwindigkeit" ) ) geschwindigkeit = (int)*opd->zWert( "Geschwindigkeit" ); else opd->addWert( "Geschwindigkeit", "1000" ); bool fortsetzen = 0; if( opd->wertExistiert( "Fortsetzen" ) ) fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0; else opd->addWert( "Fortsetzen", "0" ); opd->speichern(); opd->release(); kamX = 0; kamY = 0; if( breite > 80 ) kamX = breite / 2 - 400; if( höhe > 50 ) kamY = höhe / 2 - 250; if( fortsetzen && DateiExistiert( "data/Minigames/Fangen/data/game.save" ) ) { Datei *save = new Datei(); save->setDatei( "data/Minigames/Fangen/data/game.save" ); save->open( Datei::Style::lesen ); int br = 0; int hö = 0; save->lese( (char*)&br, 4 ); save->lese( (char*)&hö, 4 ); if( br == breite && hö == höhe ) { save->lese( (char*)&score, 4 ); spieler = new Spieler( SPIELER, save ); int anz = 0; save->lese( (char*)&anz, 4 ); for( int i = 0; i < anz; i++ ) gegner->add( new Spieler( GEGNER, save ) ); save->lese( (char*)&anz, 4 ); for( int i = 0; i < anz; i++ ) ziele->add( new Spieler( ZIEL, save ) ); } save->close(); save->release(); } if( !spieler ) spieler = new Spieler( SPIELER, breite, höhe ); if( !gegner->getEintragAnzahl() ) { for( int i = 0; i < neuGegner; i++ ) gegner->add( new Spieler( GEGNER, breite, höhe ) ); } if( !ziele->getEintragAnzahl() ) { for( int i = 0; i < zAnzahl; i++ ) ziele->add( new Spieler( ZIEL, breite, höhe ) ); } } void Map::doMausEreignis( MausEreignis &me ) { } void Map::doTastaturEreignis( TastaturEreignis &te ) { } bool Map::tick( double tickVal ) { if( beendet || !spieler ) return 0; if( sr ) srand( (unsigned int)time( 0 ) ); sr = 0; double t = tickVal * geschwindigkeit / 1000; spieler->tick( t, breite, höhe ); int anz = gegner->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) { gegner->z( i )->tick( t, breite, höhe ); if( gegner->z( i )->berührt( spieler->getX(), spieler->getY() ) ) beendet = 1; } anz = ziele->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) { ziele->z( i )->tick( t, breite, höhe ); if( ziele->z( i )->berührt( spieler->getX(), spieler->getY() ) ) { score++; ziele->leeren(); for( int i = 0; i < zAnzahl; i++ ) ziele->add( new Spieler( ZIEL, breite, höhe ) ); for( int i = 0; i < neuGegner; i++ ) gegner->add( new Spieler( GEGNER, breite, höhe ) ); } } if( breite > 800 ) { kamX = (int)spieler->getX() - 400; if( kamX < 0 ) kamX = 0; if( kamX + 800 > breite ) kamX = breite - 800; } if( höhe > 500 ) { kamY = (int)spieler->getY() - 250; if( kamY < 0 ) kamY = 0; if( kamY + 500 > höhe ) kamY = höhe - 500; } if( beendet ) { KSGTDatei *stb = new KSGTDatei( "data/Minigames/Fangen/data/score.ksgt" ); if( !stb->laden() ) DateiPfadErstellen( "data/Minigames/Fangen/data/score.ksgt" ); RCArray< Text > *zeile = new RCArray< Text >(); Zeit *zeit = getZeit(); zeile->add( zeit->getZeit( "y-m-d h:i:s" ) ); zeit->release(); Text *scoreT = new Text(); scoreT->append( score ); zeile->add( scoreT ); Text *breiteT = new Text(); breiteT->append( breite ); zeile->add( breiteT ); Text *höheT = new Text(); höheT->append( höhe ); zeile->add( höheT ); Text *geschwindigkeitT = new Text(); geschwindigkeitT->append( geschwindigkeit ); zeile->add( geschwindigkeitT ); Text *zAnzahlT = new Text(); zAnzahlT->append( zAnzahl ); zeile->add( zAnzahlT ); Text *nAnzahlT = new Text(); nAnzahlT->append( neuGegner ); zeile->add( nAnzahlT ); stb->addZeile( 7, zeile ); zeile->release(); stb->speichern(); stb->release(); DateiRemove( "data/Minigames/Fangen/data/game.save" ); } return 1; } void Map::render( Bild &zRObj ) { if( !spieler ) return; int xStart = 0; int yStart = 0; if( breite < 800 ) xStart = 400 - breite / 2; else xStart -= kamX; if( höhe < 500 ) yStart = 250 - höhe / 2; else yStart -= kamY; feld->setPosition( xStart, yStart ); feld->setSize( breite, höhe ); feld->render( zRObj ); bool rMap = breite > 800 || höhe > 500; zRObj.addScrollOffset( -xStart, -yStart ); spieler->render( zRObj ); int gAnz = gegner->getEintragAnzahl(); for( int i = 0; i < gAnz; i++ ) gegner->z( i )->render( zRObj ); int zAnz = ziele->getEintragAnzahl(); for( int i = 0; i < zAnz; i++ ) ziele->z( i )->render( zRObj ); zRObj.addScrollOffset( xStart, yStart ); if( rMap ) { const Punkt &dOff = zRObj.getDrawOff(); map->render( zRObj ); zRObj.setPixelDP( 10 + ( 200 * spieler->getX() ) / breite + dOff.x, 10 + ( 200 * spieler->getY() ) / höhe + dOff.y, 0xFF00FF00 ); for( int i = 0; i < gAnz; i++ ) zRObj.setPixelDP( 10 + ( 200 * gegner->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * gegner->z( i )->getY() ) / höhe + dOff.y, 0xFFFF0000 ); for( int i = 0; i < zAnz; i++ ) zRObj.setPixelDP( 10 + ( 200 * ziele->z( i )->getX() ) / breite + dOff.x, 10 + ( 200 * ziele->z( i )->getY() ) / höhe + dOff.y, 0xFF00FFFF ); kam->setPosition( 10 + ( 200 * kamX ) / breite, 10 + ( 200 * kamY ) / höhe ); kam->setSize( ( 200 * 800 ) / breite, ( 200 * 500 ) / höhe ); if( kam->getBreite() > 200 ) kam->setSize( 200, kam->getHeight() ); if( kam->getHeight() > 200 ) kam->setSize( kam->getBreite(), 200 ); kam->render( zRObj ); } } // constant void Map::speichern() const { if( !beendet && spieler ) { Datei *d = new Datei(); d->setDatei( "data/Minigames/Fangen/data/game.save" ); d->erstellen(); d->open( Datei::Style::schreiben ); d->schreibe( (char*)&breite, 4 ); d->schreibe( (char*)&höhe, 4 ); d->schreibe( (char*)&score, 4 ); spieler->save( d ); int anz = gegner->getEintragAnzahl(); d->schreibe( (char*)&anz, 4 ); for( int i = 0; i < anz; i++ ) gegner->z( i )->save( d ); anz = ziele->getEintragAnzahl(); d->schreibe( (char*)&anz, 4 ); for( int i = 0; i < anz; i++ ) ziele->z( i )->save( d ); d->close(); d->release(); } else DateiRemove( "data/Minigames/Fangen/data/game.save" ); } int Map::getScore() const { return score; } bool Map::istBeendet() const { return beendet; } // Reference Counting Map *Map::getThis() { ref++; return this; } Map *Map::release() { ref--; if( !ref ) delete this; return 0; }