ソースを参照

Änderung in der Steuerung, Asteroiden splitten sich auf, annimationen hinzugefügt

Kolja Strohm 6 年 前
コミット
c4eb04e768

+ 23 - 6
Asteroids/Asteroid.cpp

@@ -11,15 +11,14 @@
 // Konstruktor
 Asteroid::Asteroid( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< float > s, float rS, float r, float gr, char num )
 {
-    txt = textur->getThis();
+    txt = 0;
 	asteroid = new Model2D();
 	asteroid->setStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur );
 	asteroid->setModel( data );
-    Textur2D *txt = new Textur2D();
-    txt->setTexturZ( textur );
-	asteroid->setTextur( txt );
 	asteroid->setDrehung( r );
 	asteroid->setSize( gr );
+    if( textur )
+        setTextur( textur );
 	pos = p;
 	speed = s;
 	rSpeed = rS;
@@ -30,11 +29,22 @@ Asteroid::Asteroid( Model2DData *data, Bild *textur, Vec2< float > p, Vec2< floa
 // Destruktor
 Asteroid::~Asteroid()
 {
-    txt->release();
+    if( txt )
+        txt->release();
 	asteroid->release();
 }
 
 // nicht constant
+void Asteroid::setTextur( Bild *textur )
+{
+    if( txt )
+        txt->release();
+    txt = textur->getThis();
+    Textur2D *txt = new Textur2D();
+    txt->setTexturZ( textur );
+    asteroid->setTextur( txt->getThis() );
+}
+
 bool Asteroid::tick( double zeit, int breite, int höhe )
 {
 	Vertex minP = (Vertex)asteroid->zModel()->minP * asteroid->getSize() + asteroid->getPosition();
@@ -128,7 +138,7 @@ Punkt Asteroid::getPos() const
 
 Bild *Asteroid::getTextur() const
 {
-    return txt->getThis();
+    return txt ? txt->getThis() : 0;
 }
 
 Vec2< float > Asteroid::getSpeed() const
@@ -146,6 +156,13 @@ char Asteroid::getId() const
     return id;
 }
 
+int Asteroid::getScore() const
+{
+    if( ( asteroid->zModel()->maxP - asteroid->zModel()->minP ).x < 50 || ( asteroid->zModel()->maxP - asteroid->zModel()->minP ).y < 50 )
+        return 1;
+    return 0;
+}
+
 // Refernece Counting
 Asteroid *Asteroid::getThis()
 {

+ 2 - 0
Asteroids/Asteroid.h

@@ -26,6 +26,7 @@ public:
 	// Destruktor
 	~Asteroid();
 	// nicht constant
+    void setTextur( Bild *textur );
 	bool tick( double zeit, int breite, int höhe );
 	void render( Bild &zRObj );
 	bool istGetroffen( Schuss *zSchuss, Polygon2D &a, Polygon2D &b, Punkt &pa, Punkt &pb, RandomGenerator *zRand );
@@ -39,6 +40,7 @@ public:
     Vec2< float > getSpeed() const;
     float getRSpeed() const;
     char getId() const;
+    int getScore() const;
 	// Refernece Counting
 	Asteroid *getThis();
 	Asteroid *release();

+ 2 - 0
Asteroids/Asteroids.vcxproj

@@ -169,6 +169,7 @@
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="Asteroid.h" />
+    <ClInclude Include="Data.h" />
     <ClInclude Include="Game.h" />
     <ClInclude Include="Initialisierung.h" />
     <ClInclude Include="Map.h" />
@@ -178,6 +179,7 @@
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Asteroid.cpp" />
+    <ClCompile Include="Data.cpp" />
     <ClCompile Include="Einstieg.cpp" />
     <ClCompile Include="Game.cpp" />
     <ClCompile Include="Initialisierung.cpp" />

+ 6 - 0
Asteroids/Asteroids.vcxproj.filters

@@ -36,6 +36,9 @@
     <ClInclude Include="Schuss.h">
       <Filter>Headerdateien</Filter>
     </ClInclude>
+    <ClInclude Include="Data.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Game.cpp">
@@ -62,5 +65,8 @@
     <ClCompile Include="Einstieg.cpp">
       <Filter>Quelldateien</Filter>
     </ClCompile>
+    <ClCompile Include="Data.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 242 - 0
Asteroids/Data.cpp

@@ -0,0 +1,242 @@
+#include "Data.h"
+#include <M2Datei.h>
+
+// Konstructor
+GameData::GameData( const char *shipM2, const char *asteroidsM2 )
+{
+    schuss = new RCArray< Schuss >();
+    ship = 0;
+    asteroid = new RCArray< Asteroid >();
+    aData = new Model2DData*[ 7 ]();
+    sData = new Model2DData*[ 2 ]();
+    M2Datei m2d( asteroidsM2 );
+    m2d.leseDaten();
+    for( int i = 0; i < 7; i++ )
+    {
+        Text name = "";
+        name.append( (char)( 'a' + i ) );
+        aData[ i ] = m2d.ladeModel( name );
+    }
+    m2d.setPfad( shipM2 );
+    m2d.leseDaten();
+    for( int i = 0; i < 2; i++ )
+    {
+        Text name = "";
+        name.append( (char)( 'a' + i ) );
+        sData[ i ] = m2d.ladeModel( name );
+    }
+    shipN = 0;
+    score = 0;
+    scoreCheck = score * 11197;
+    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;
+}
+
+// Destructor
+GameData::~GameData()
+{
+    schuss->release();
+    if( ship )
+        ship->release();
+    asteroid->release();
+    for( int i = 0; i < 7; i++ )
+        aData[ i ]->release();
+    for( int i = 0; i < 2; i++ )
+        sData[ i ]->release();
+    delete[] aData;
+    delete[] sData;
+    if( rGen )
+        rGen->release();
+}
+
+// private
+Asteroid *GameData::createNewAsteroid()
+{
+    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 );
+    return new Asteroid( aData[ num ]->getThis(), 0, pos, speed, (float)( rGen->rand() * 100 ) / 75.f, (float)sw, aGröße / 1000.f, num );
+}
+
+// nicht constant
+void GameData::reset( Text *zOptionen )
+{
+    gameTime = 0;
+    timer = 0;
+    beendet = 0;
+    score = 0;
+    scoreCheck = score * 11197;
+    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();
+    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();
+    rGen = new RandomGenerator();
+    if( zOptionen->positionVon( '=', 6 ) >= 0 )
+    {
+        tmp = zOptionen->getTeilText( zOptionen->positionVon( '=', 6 ) + 1 );
+        rGen->setSeed( (__int64)*tmp );
+        tmp->release();
+    }
+    ship = new Ship( sData[ shipN ]->getThis(), shipPos, shipSpeed, shipR );
+}
+
+bool GameData::tick( double tickVal )
+{
+    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() * 1 + 1; i++ )
+        {
+            asteroid->add( createNewAsteroid() );
+        }
+    }
+    // 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->z( i )->getScore();
+            scoreCheck = score * 11197;
+            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();
+                char id = asteroid->z( j )->getId();
+                if( id >= 0 )
+                    id = -id - 1;
+                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(), id ) );
+                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(), id ) );
+                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 ) );
+    beendet |= ( score * 11197 != scoreCheck );
+    if( score * 11197 != scoreCheck )
+    {
+        score = 0;
+        scoreCheck = 0;
+    }
+    cs.unlock();
+    return 1;
+}
+
+// constant
+int GameData::getScore() const
+{
+    return score;
+}
+
+bool GameData::istBeendet() const
+{
+    return beendet;
+}
+
+// Reference Counting
+GameData *GameData::getThis()
+{
+    ref++;
+    return this;
+}
+
+GameData *GameData::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 49 - 0
Asteroids/Data.h

@@ -0,0 +1,49 @@
+#pragma once
+
+#include <Bild.h>
+#include "Schuss.h"
+#include "Ship.h"
+#include "Asteroid.h"
+
+class GameData
+{
+protected:
+    RCArray< Schuss > *schuss;
+    Ship *ship;
+    RCArray< Asteroid > *asteroid;
+    Model2DData **aData;
+    Model2DData **sData;
+    int shipN;
+    int score;
+    int scoreCheck;
+    int breite;
+    int höhe;
+    int aGröße;
+    int mTimer;
+    int maxTimer;
+    double timer;
+    bool beendet;
+    bool rend;
+    double gameTime;
+    Critical cs;
+    RandomGenerator *rGen;
+    char tastenStände;
+    int ref;
+
+    virtual Asteroid *createNewAsteroid();
+
+public:
+    // Konstructor
+    GameData( const char *shipM2, const char *asteroidsM2 );
+    // Destructor
+    ~GameData();
+    // nicht constant
+    virtual void reset( Text *zOptionen );
+    virtual bool tick( double t );
+    // constant
+    int getScore() const;
+    bool istBeendet() const;
+    // Reference Counting
+    GameData *getThis();
+    GameData *release();
+};

+ 85 - 204
Asteroids/Map.cpp

@@ -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;
 }

+ 9 - 37
Asteroids/Map.h

@@ -1,67 +1,39 @@
 #ifndef Map_H
 #define Map_H
 
-#include <Bild.h>
-#include "Schuss.h"
-#include "Ship.h"
-#include "Asteroid.h"
 #include <Random.h>
 #include <Textur2D.h>
+#include "Data.h"
 #include "../../../Include/KSGKlientV.h"
 
 using namespace Framework;
 
-class Map
+class Map : public GameData
 {
 private:
-    RCArray< Schuss > *schuss;
-    Ship *ship;
-    RCArray< Asteroid > *asteroid;
-    Model2DData **aData;
-    Bild **aTextur;
-    Model2DData **sData;
-    Bild **sTextur;
     LRahmen *kam;
     LRahmen *map;
+    Datei capture;
+    MinigameKlientV *klient;
     Textur2D *flammenM;
     Textur2D *flammenL;
     Textur2D *flammenR;
-    int shipN;
-    int score;
-    int breite;
-    int höhe;
-    int aGröße;
-    int mTimer;
-    int maxTimer;
-    double timer;
-    bool beendet;
-    bool rend;
-    double gameTime;
-    Datei capture;
-    Critical cs;
-    MinigameKlientV *klient;
-    RandomGenerator *rGen;
-    int ref;
-    char tastenStände;
+    Bild **aTextur;
+    Bild **sTextur;
 
+    Asteroid *createNewAsteroid() override;
 public:
     // Konstruktor
     Map( MinigameKlientV *klient );
     // Destruktor
     ~Map();
     // nicht constant
-    void reset( Text *zOptionen );
+    void reset( Text *zOptionen ) override;
     void doMausEreignis( MausEreignis &me );
     void doTastaturEreignis( TastaturEreignis &te );
-    bool tick( double tickVal );
+    bool tick( double t ) override;
     void render( Bild &zRObj );
     void speichern();
-    // constant
-    int getScore() const;
-    bool istBeendet() const;
-    // Reference Counting
-    Map *getThis();
-    Map *release();
 };
 
 #endif

+ 0 - 1
Asteroids/Menü.cpp

@@ -162,7 +162,6 @@ void Men
     }
     opd->speichern();
     opd->release();
-    optionen += ",Seed=0";
     map->reset( &optionen );
     beendet = 0;
     scoreT->setText( "Score: " );

+ 20 - 7
Asteroids/Ship.cpp

@@ -10,7 +10,7 @@
 
 // Inhalt der Ship Klasse aus Ship.h
 // Konstruktor
-Ship::Ship( Model2DData *data, Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2D *zFlammenR, Bild *textur, Vec2< float > p, Vec2< float > s, float r )
+Ship::Ship( Model2DData *data, Vec2< float > p, Vec2< float > s, float r )
 {
     for( auto i = data->polygons->getArray(); i.set; i++ )
     {
@@ -68,12 +68,6 @@ Ship::Ship( Model2DData *data, Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2
     ship->setStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur | Model2D::Style::Alpha );
     ship->setModel( data );
     ship->setFarbe( 0x00000000 );
-    Textur2D *txt = new Textur2D();
-    txt->setTexturZ( textur );
-    ship->setTextur( txt, "ship" );
-    ship->setTextur( zFlammenL->getThis(), "engine_l" );
-    ship->setTextur( zFlammenR->getThis(), "engine_r" );
-    ship->setTextur( zFlammenM->getThis(), "engine_m" );
     ship->setDrehung( r );
     pos = p;
     speed = s;
@@ -89,6 +83,24 @@ Ship::~Ship()
 #define sgn( x ) x < 0 ? -1 : 1
 
 // nicht constant
+void Ship::setTexture( Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2D *zFlammenR, Bild *textur )
+{
+    Textur2D *txt = new Textur2D();
+    txt->setTexturZ( textur );
+    ship->setTextur( txt, "ship" );
+    ship->setTextur( zFlammenL->getThis(), "engine_l" );
+    ship->setTextur( zFlammenR->getThis(), "engine_r" );
+    ship->setTextur( zFlammenM->getThis(), "engine_m" );
+}
+
+void Ship::setPRS( Vec2< float > p, Vec2< float > s, float r, float rSpeed )
+{
+    this->rSpeed = rSpeed;
+    ship->setDrehung( r );
+    pos = p;
+    speed = s;
+}
+
 bool Ship::tick( double zeit, int breite, int höhe, char tastenStände )
 {
     Vertex minP = (Vertex)ship->zModel()->minP * ship->getSize() + ship->getPosition();
@@ -185,6 +197,7 @@ void Ship::save( Datei *zD ) const
     zD->schreibe( (char*)&speed.y, 4 );
     float r = ship->getDrehung();
     zD->schreibe( (char*)&r, 4 );
+    zD->schreibe( (char*)&rSpeed, 4 );
 }
 
 Schuss *Ship::getSchuss() const

+ 3 - 1
Asteroids/Ship.h

@@ -26,10 +26,12 @@ private:
 
 public:
 	// Konstruktor
-	Ship( Model2DData *data, Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2D *zFlammenR, Bild *textur, Vec2< float > p, Vec2< float > s, float r );
+	Ship( Model2DData *data, Vec2< float > p, Vec2< float > s, float r );
 	// Destruktor
 	~Ship();
 	// nicht constant
+    void setTexture( Textur2D *zFlammenM, Textur2D *zFlammenL, Textur2D *zFlammenR, Bild *textur );
+    void setPRS( Vec2< float > p, Vec2< float > s, float r, float rSpeed );
 	bool tick( double zeit, int breite, int höhe, char tastenStände );
 	void render( Bild &zRObj );
 	// constant