|
@@ -15,14 +15,10 @@
|
|
|
// Inhalt der Map Klasse aus Map.h
|
|
|
// Konstruktor
|
|
|
Map::Map( MinigameKlientV *klient )
|
|
|
+ : GameData( "data/Minigames/Asteroids/models/ship.m2", "data/Minigames/Asteroids/models/asteroids.m2" )
|
|
|
{
|
|
|
this->klient = klient;
|
|
|
- schuss = new RCArray< Schuss >();
|
|
|
- ship = 0;
|
|
|
- asteroid = new RCArray< Asteroid >();
|
|
|
- aData = new Model2DData*[ 7 ]();
|
|
|
aTextur = new Bild*[ 7 ]();
|
|
|
- sData = new Model2DData*[ 2 ]();
|
|
|
sTextur = new Bild*[ 2 ]();
|
|
|
// lade Flammen animation
|
|
|
LTDBDatei flammenStartLTDB;
|
|
@@ -47,9 +43,6 @@ Map::Map( MinigameKlientV *klient )
|
|
|
flammenR = new Textur2D();
|
|
|
flammenR->addAnimationZ( flammenStart );
|
|
|
flammenR->addAnimationZ( flammenBurn );
|
|
|
-
|
|
|
- M2Datei m2d( "data/Minigames/Asteroids/models/asteroids.m2" );
|
|
|
- m2d.leseDaten();
|
|
|
LTDBDatei td;
|
|
|
td.setDatei( new Text( "data/Minigames/Asteroids/bilder/asteroids.ltdb" ) );
|
|
|
td.leseDaten( 0 );
|
|
@@ -57,18 +50,14 @@ Map::Map( MinigameKlientV *klient )
|
|
|
{
|
|
|
Text name = "";
|
|
|
name.append( (char)( 'a' + i ) );
|
|
|
- aData[ i ] = m2d.ladeModel( name );
|
|
|
aTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
|
|
|
}
|
|
|
- m2d.setPfad( "data/Minigames/Asteroids/models/ship.m2" );
|
|
|
- m2d.leseDaten();
|
|
|
td.setDatei( new Text( "data/Minigames/Asteroids/bilder/ship.ltdb" ) );
|
|
|
td.leseDaten( 0 );
|
|
|
for( int i = 0; i < 2; i++ )
|
|
|
{
|
|
|
Text name = "";
|
|
|
name.append( (char)( 'a' + i ) );
|
|
|
- sData[ i ] = m2d.ladeModel( name );
|
|
|
sTextur[ i ] = td.laden( 0, new Text( (char*)( Text( name ) += ".png" ) ) );
|
|
|
}
|
|
|
kam = new LRahmen();
|
|
@@ -77,48 +66,19 @@ Map::Map( MinigameKlientV *klient )
|
|
|
map->setFarbe( 0xFFFFFFFF );
|
|
|
map->setPosition( 10, 10 );
|
|
|
map->setSize( 200, 200 );
|
|
|
- shipN = 0;
|
|
|
- score = 0;
|
|
|
- breite = 0;
|
|
|
- höhe = 0;
|
|
|
- aGröße = 0;
|
|
|
- maxTimer = 0;
|
|
|
- mTimer = 0;
|
|
|
- timer = 0;
|
|
|
- beendet = 1;
|
|
|
- rend = 0;
|
|
|
- gameTime = 0;
|
|
|
- tastenStände = 0;
|
|
|
- rGen = 0;
|
|
|
- ref = 1;
|
|
|
}
|
|
|
|
|
|
// Destruktor
|
|
|
Map::~Map()
|
|
|
{
|
|
|
- speichern();
|
|
|
- schuss->release();
|
|
|
- if( ship )
|
|
|
- ship->release();
|
|
|
- asteroid->release();
|
|
|
for( int i = 0; i < 7; i++ )
|
|
|
- {
|
|
|
- aData[ i ]->release();
|
|
|
aTextur[ i ]->release();
|
|
|
- }
|
|
|
for( int i = 0; i < 2; i++ )
|
|
|
- {
|
|
|
- sData[ i ]->release();
|
|
|
sTextur[ i ]->release();
|
|
|
- }
|
|
|
- delete[] aData;
|
|
|
delete[] aTextur;
|
|
|
- delete[] sData;
|
|
|
delete[] sTextur;
|
|
|
kam->release();
|
|
|
map->release();
|
|
|
- if( rGen )
|
|
|
- rGen->release();
|
|
|
if( klient )
|
|
|
klient->release();
|
|
|
flammenM->release();
|
|
@@ -126,47 +86,33 @@ Map::~Map()
|
|
|
flammenR->release();
|
|
|
}
|
|
|
|
|
|
+Asteroid *Map::createNewAsteroid()
|
|
|
+{
|
|
|
+ Asteroid *a = __super::createNewAsteroid();
|
|
|
+ a->setTextur( aTextur[ a->getId() ] );
|
|
|
+ return a;
|
|
|
+}
|
|
|
+
|
|
|
// nicht constant
|
|
|
void Map::reset( Text *zOptionen )
|
|
|
{
|
|
|
flammenL->setAnimation( -1 );
|
|
|
flammenR->setAnimation( -1 );
|
|
|
flammenM->setAnimation( -1 );
|
|
|
- gameTime = 0;;
|
|
|
- timer = 0;
|
|
|
- beendet = 0;
|
|
|
- score = 0;
|
|
|
- tastenStände = 0;
|
|
|
- if( ship )
|
|
|
- ship = ship->release();
|
|
|
- schuss->leeren();
|
|
|
- asteroid->leeren();
|
|
|
- Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=' ) + 1, zOptionen->positionVon( ',' ) );
|
|
|
- breite = *tmp;
|
|
|
- tmp->release();
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 1 ) + 1, zOptionen->positionVon( ',', 1 ) );
|
|
|
- höhe = *tmp;
|
|
|
- tmp->release();
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 2 ) + 1, zOptionen->positionVon( ',', 2 ) );
|
|
|
- aGröße = *tmp;
|
|
|
- tmp->release();
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 3 ) + 1, zOptionen->positionVon( ',', 3 ) );
|
|
|
- maxTimer = *tmp;
|
|
|
- tmp->release();
|
|
|
- mTimer = maxTimer;
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 4 ) + 1, zOptionen->positionVon( ',', 4 ) );
|
|
|
- shipN = *tmp;
|
|
|
- tmp->release();
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
|
|
|
+ __super::reset( zOptionen );
|
|
|
+ Text *tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 5 ) + 1, zOptionen->positionVon( ',', 5 ) );
|
|
|
bool fortsetzen = (int)*tmp != 0;
|
|
|
tmp->release();
|
|
|
- Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
|
|
|
- Vec2< float > shipSpeed( 0, 0 );
|
|
|
- float shipR = (float)-PI / 2;
|
|
|
- if( rGen )
|
|
|
- rGen = rGen->release();
|
|
|
if( fortsetzen && DateiExistiert( "data/Minigames/Asteroids/data/game.save" ) && klient )
|
|
|
{
|
|
|
+ M2Datei sad;
|
|
|
+ int index = 0;
|
|
|
+ int sadI = 0;
|
|
|
+ Text pfad = "data/Minigames/Asteroids/data/sasave_";
|
|
|
+ pfad += sadI;
|
|
|
+ pfad += ".m2";
|
|
|
+ sad.setPfad( pfad );
|
|
|
+ sad.leseDaten();
|
|
|
if( capture.istOffen() )
|
|
|
capture.close();
|
|
|
capture.setDatei( "data/Minigames/Asteroids/data/game.mgc" );
|
|
@@ -179,6 +125,8 @@ void Map::reset( Text *zOptionen )
|
|
|
int gr = 0;
|
|
|
int shn = 0;
|
|
|
__int64 seed;
|
|
|
+ if( rGen )
|
|
|
+ rGen = rGen->release();
|
|
|
save->lese( (char*)&seed, 8 );
|
|
|
rGen = new RandomGenerator();
|
|
|
rGen->setSeed( seed );
|
|
@@ -190,13 +138,20 @@ void Map::reset( Text *zOptionen )
|
|
|
if( br == breite && hö == höhe && gr == aGröße && shn == shipN )
|
|
|
{
|
|
|
save->lese( (char*)&score, 4 );
|
|
|
+ scoreCheck = score * 11197;
|
|
|
save->lese( (char*)&mTimer, 4 );
|
|
|
// Schiff laden
|
|
|
+ Vec2< float > shipPos( (float)( breite / 2 ), (float)( höhe / 2 ) );
|
|
|
+ Vec2< float > shipSpeed( 0, 0 );
|
|
|
+ float shipR = (float)-PI / 2;
|
|
|
+ float shipRSpeed = 0;
|
|
|
save->lese( (char*)&shipPos.x, 4 );
|
|
|
save->lese( (char*)&shipPos.y, 4 );
|
|
|
save->lese( (char*)&shipSpeed.x, 4 );
|
|
|
save->lese( (char*)&shipSpeed.y, 4 );
|
|
|
save->lese( (char*)&shipR, 4 );
|
|
|
+ save->lese( (char*)&shipRSpeed, 4 );
|
|
|
+ ship->setPRS( shipPos, shipSpeed, shipR, shipRSpeed );
|
|
|
int anz = 0;
|
|
|
save->lese( (char*)&anz, 4 );
|
|
|
for( int i = 0; i < anz; i++ )
|
|
@@ -217,7 +172,30 @@ void Map::reset( Text *zOptionen )
|
|
|
save->lese( (char*)&rs, 4 );
|
|
|
save->lese( (char*)&r, 4 );
|
|
|
save->lese( (char*)&gr, 4 );
|
|
|
- asteroid->add( new Asteroid( aData[ n ]->getThis(), aTextur[ n ]->getThis(),
|
|
|
+ Bild *at = 0;
|
|
|
+ Model2DData *ad = 0;
|
|
|
+ if( n < 0 )
|
|
|
+ {
|
|
|
+ at = aTextur[ -n - 1 ]->getThis();
|
|
|
+ ad = sad.ladeModel( sad.zModelName( index++ )->getText() );
|
|
|
+ if( index == 120 )
|
|
|
+ {
|
|
|
+ index = 0;
|
|
|
+ sadI++;
|
|
|
+ Text pfad = "data/Minigames/Asteroids/data/sasave_";
|
|
|
+ pfad += sadI;
|
|
|
+ pfad += ".m2";
|
|
|
+ sad = M2Datei();
|
|
|
+ sad.setPfad( pfad );
|
|
|
+ sad.leseDaten();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ at = aTextur[ n ]->getThis();
|
|
|
+ ad = aData[ n ]->getThis();
|
|
|
+ }
|
|
|
+ asteroid->add( new Asteroid( ad, at,
|
|
|
Vec2< float >( x, y ), Vec2< float >( xs, ys ), rs, r, gr, n ) );
|
|
|
}
|
|
|
save->lese( (char*)&anz, 4 );
|
|
@@ -239,7 +217,6 @@ void Map::reset( Text *zOptionen )
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- rGen = new RandomGenerator();
|
|
|
if( klient )
|
|
|
{
|
|
|
if( capture.istOffen() )
|
|
@@ -251,14 +228,8 @@ void Map::reset( Text *zOptionen )
|
|
|
__int64 seed = rGen->getSeed();
|
|
|
capture.schreibe( (char*)&seed, 8 );
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
|
|
|
- rGen->setSeed( (__int64)*tmp );
|
|
|
- tmp->release();
|
|
|
- }
|
|
|
}
|
|
|
- ship = new Ship( sData[ shipN ]->getThis(), flammenM, flammenL, flammenR, sTextur[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
|
|
|
+ ship->setTexture( flammenM, flammenL, flammenR, sTextur[ shipN ]->getThis() );
|
|
|
}
|
|
|
|
|
|
void Map::doMausEreignis( MausEreignis &me )
|
|
@@ -319,8 +290,9 @@ void Map::doTastaturEreignis( TastaturEreignis &te )
|
|
|
{
|
|
|
if( te.id == TE_Press )
|
|
|
{
|
|
|
+ if( ( tastenStände | 8 ) != tastenStände )
|
|
|
+ ok = 0;
|
|
|
tastenStände |= 8;
|
|
|
- ok = 0;
|
|
|
}
|
|
|
else
|
|
|
tastenStände &= ~8;
|
|
@@ -346,98 +318,11 @@ void Map::doTastaturEreignis( TastaturEreignis &te )
|
|
|
cs.unlock();
|
|
|
}
|
|
|
|
|
|
-bool Map::tick( double tickVal )
|
|
|
+bool Map::tick( double t )
|
|
|
{
|
|
|
if( beendet )
|
|
|
- {
|
|
|
- bool ret = rend;
|
|
|
- rend = 0;
|
|
|
- return ret;
|
|
|
- }
|
|
|
- cs.lock();
|
|
|
- gameTime += tickVal;
|
|
|
- // Timer
|
|
|
- timer -= tickVal;
|
|
|
- if( timer <= 0 )
|
|
|
- {
|
|
|
- mTimer -= 25;
|
|
|
- if( mTimer < 500 )
|
|
|
- mTimer = 500;
|
|
|
- timer = mTimer / 1000.0;
|
|
|
- for( int i = 0; i < rGen->rand() * 4 + 1; i++ )
|
|
|
- {
|
|
|
- int num = (int)(rGen->rand() * 7);
|
|
|
- double sw = ( rGen->rand() * 360 ) / 180.0 * PI;
|
|
|
- Vec2< float > speed( (float)cos( sw ), (float)sin( sw ) );
|
|
|
- speed *= (float)( rGen->rand() * 40 );
|
|
|
- Vec2< float > pos( -200.f, höhe / 2.f );
|
|
|
- if( speed.x < 0 )
|
|
|
- pos.x = (float)( breite + 200 );
|
|
|
- asteroid->add( new Asteroid( aData[ num ]->getThis(), aTextur[ num ]->getThis(), pos, speed, (float)( rGen->rand() * 100 ) / 75.f, (float)sw, aGröße / 1000.f, num ) );
|
|
|
- }
|
|
|
- }
|
|
|
- // Update
|
|
|
- int aAnz = asteroid->getEintragAnzahl();
|
|
|
- for( int i = 0; i < aAnz; i++ )
|
|
|
- asteroid->z( i )->tick( tickVal, breite, höhe );
|
|
|
- int sAnz = schuss->getEintragAnzahl();
|
|
|
- for( int i = 0; i < sAnz; i++ )
|
|
|
- schuss->z( i )->tick( tickVal );
|
|
|
- ship->tick( tickVal, breite, höhe, tastenStände );
|
|
|
- for( int i = aAnz - 1; i >= 0; i-- )
|
|
|
- {
|
|
|
- if( !asteroid->z( i )->amLeben() )
|
|
|
- {
|
|
|
- score++;
|
|
|
- asteroid->remove( i );
|
|
|
- aAnz--;
|
|
|
- }
|
|
|
- }
|
|
|
- for( int i = sAnz - 1; i >= 0; i-- )
|
|
|
- {
|
|
|
- Vec2< float > pos = schuss->z( i )->getPos();
|
|
|
- if( pos.x < 0 || pos.y < 0 || pos.x > breite || pos.y > höhe )
|
|
|
- {
|
|
|
- sAnz--;
|
|
|
- schuss->remove( i );
|
|
|
- }
|
|
|
- }
|
|
|
- // Collision
|
|
|
- for( int i = sAnz - 1; i >= 0; i-- )
|
|
|
- {
|
|
|
- Schuss *zs = schuss->z( i );
|
|
|
- bool b = 0;
|
|
|
- for( int j = 0; j < aAnz; j++ )
|
|
|
- {
|
|
|
- Polygon2D ap;
|
|
|
- Polygon2D bp;
|
|
|
- Punkt pa;
|
|
|
- Punkt pb;
|
|
|
- if( asteroid->z( j )->istGetroffen( zs, ap, bp, pa, pb, rGen ) )
|
|
|
- {
|
|
|
- Array< Polygon2D > *npaA = new Array< Polygon2D >();
|
|
|
- npaA->add( ap );
|
|
|
- Model2DData *npdA = new Model2DData();
|
|
|
- npdA->erstelleModell( npaA );
|
|
|
- float rot = asteroid->z( j )->zModel()->getDrehung();
|
|
|
- asteroid->add( new Asteroid( npdA, asteroid->z( j )->getTextur(), pa.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize() ) );
|
|
|
- Array< Polygon2D > *npaB = new Array< Polygon2D >();
|
|
|
- npaB->add( bp );
|
|
|
- Model2DData *npdB = new Model2DData();
|
|
|
- npdB->erstelleModell( npaB );
|
|
|
- asteroid->add( new Asteroid( npdB, asteroid->z( j )->getTextur(), pb.rotation( rot ) + asteroid->z( j )->getPos(), asteroid->z( j )->getSpeed(), asteroid->z( j )->getRSpeed(), rot, asteroid->z( j )->zModel()->getSize() ) );
|
|
|
- b = 1;
|
|
|
- asteroid->z( j )->setDead();
|
|
|
- }
|
|
|
- }
|
|
|
- if( b )
|
|
|
- {
|
|
|
- schuss->remove( i );
|
|
|
- sAnz--;
|
|
|
- }
|
|
|
- }
|
|
|
- for( int i = 0; i < aAnz && !beendet; i++ )
|
|
|
- beendet |= ship->istTod( asteroid->z( i ) );
|
|
|
+ return 0;
|
|
|
+ bool ret = __super::tick( t );
|
|
|
if( beendet && klient )
|
|
|
{
|
|
|
capture.close();
|
|
@@ -501,11 +386,10 @@ bool Map::tick( double tickVal )
|
|
|
stb->release();
|
|
|
DateiRemove( "data/Minigames/Asteroids/data/game.save" );
|
|
|
}
|
|
|
- cs.unlock();
|
|
|
- flammenM->tick( tickVal );
|
|
|
- flammenL->tick( tickVal );
|
|
|
- flammenR->tick( tickVal );
|
|
|
- return 1;
|
|
|
+ ret |= flammenM->tick( t );
|
|
|
+ ret |= flammenL->tick( t );
|
|
|
+ ret |= flammenR->tick( t );
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void Map::render( Bild &zRObj )
|
|
@@ -547,6 +431,29 @@ void Map::speichern()
|
|
|
{
|
|
|
if( capture.istOffen() )
|
|
|
capture.close();
|
|
|
+ cs.lock();
|
|
|
+ int anz = asteroid->getEintragAnzahl();
|
|
|
+ int index = 0;
|
|
|
+ for( int i = 0; index < anz; i++ )
|
|
|
+ {
|
|
|
+ M2Datei sad;
|
|
|
+ Text pfad = "data/Minigames/Asteroids/data/sasave_";
|
|
|
+ pfad += i;
|
|
|
+ pfad += ".m2";
|
|
|
+ DateiRemove( pfad );
|
|
|
+ sad.setPfad( pfad );
|
|
|
+ sad.leseDaten();
|
|
|
+ char name[ 2 ];
|
|
|
+ name[ 1 ] = 0;
|
|
|
+ for( char n = 1; n <= 120 && index < anz; n++ )
|
|
|
+ {
|
|
|
+ name[ 0 ] = n;
|
|
|
+ if( asteroid->z( index++ )->getId() < 0 )
|
|
|
+ sad.saveModel( asteroid->z( index - 1 )->zModel()->zModel(), name );
|
|
|
+ else
|
|
|
+ n--;
|
|
|
+ }
|
|
|
+ }
|
|
|
Datei *d = new Datei();
|
|
|
d->setDatei( "data/Minigames/Asteroids/data/game.save" );
|
|
|
d->erstellen();
|
|
@@ -561,7 +468,6 @@ void Map::speichern()
|
|
|
d->schreibe( (char*)&score, 4 );
|
|
|
d->schreibe( (char*)&mTimer, 4 );
|
|
|
ship->save( d );
|
|
|
- int anz = asteroid->getEintragAnzahl();
|
|
|
d->schreibe( (char*)&anz, 4 );
|
|
|
for( int i = 0; i < anz; i++ )
|
|
|
asteroid->z( i )->save( d );
|
|
@@ -571,33 +477,8 @@ void Map::speichern()
|
|
|
schuss->z( i )->save( d );
|
|
|
d->close();
|
|
|
d->release();
|
|
|
+ cs.unlock();
|
|
|
}
|
|
|
else if( klient )
|
|
|
DateiRemove( "data/Minigames/Asteroids/data/game.save" );
|
|
|
-}
|
|
|
-
|
|
|
-// constant
|
|
|
-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;
|
|
|
}
|