ソースを参照

Einiege Probleme behoben

Kolja Strohm 6 年 前
コミット
ae254e89db

+ 3 - 1
Asteroids/Spiel/Objekt/SpielObjekt.cpp

@@ -78,8 +78,10 @@ bool SpielObjekt::tick( const WeltInfo &info, double zeit )
     return 1;
 }
 
-void SpielObjekt::renderLeben( const Mat3<float> &kamMat, Bild &zRObj )
+void SpielObjekt::render( Mat3<float> &kamMat, Bild &zRObj, const char *kamName )
 {
+    if( Text( "minimap" ).istGleich( kamName ) )
+        return;
 	nText->setPosition( (Punkt)( kamMat * (getPosition() - Punkt( 76, (int)( zModel()->maxP.y * getSize() ) + 30 ) ) ) );
 	nText->render( zRObj );
 	int teamF = team ? team->farbe : 0;

+ 1 - 1
Asteroids/Spiel/Objekt/SpielObjekt.h

@@ -36,7 +36,7 @@ public:
 	void setTextur( Bild *textur );
 	void setTeam( Team *team );
 	bool tick( const WeltInfo &info, double zeit ) override;
-	void renderLeben( const Mat3<float> &kamMat, Bild &zRObj );
+	void render( Mat3<float> &kamMat, Bild &zRObj, const char *kamName ) override;
 	// constant
 	Team *zTeam() const;
 };

+ 20 - 92
Asteroids/Spiel/Schuss/Laser.cpp

@@ -15,6 +15,8 @@ Laser::Laser( int id, Vec2< double > pos, Vec2< double > speed, int sNum, double
     this->intensität = intensität;
     this->startIntensität = intensität;
     this->tf = tf;
+    setCollision( 0 );
+    save();
 }
 
 // privat
@@ -23,11 +25,11 @@ char Laser::getOutCode( Punkt& p, Bild &zrObj ) const
     char ret = 0;
     if( p.x < 0 )
         ret |= 1;
-    else if( p.x >= zrObj.getBreite() )
+    else if( p.x >= zrObj.getDrawGr().x )
         ret |= 2;
     if( p.y < 0 )
         ret |= 4;
-    else if( p.y >= zrObj.getHeight() )
+    else if( p.y >= zrObj.getDrawGr().y )
         ret |= 8;
     return ret;
 }
@@ -45,101 +47,27 @@ bool Laser::tick( const WeltInfo &info, double tv )
     return 1;
 }
 
-void Laser::render( Mat3< float > &kamMat, Bild &zRObj )
+void Laser::render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName )
 {
     int fa = (int)( ( intensität / startIntensität ) * 255 );
     int f = ( ( fa << 24 ) & 0xFF000000 ) | ( tf & 0xFFFFFF );
     Punkt a = (Punkt)( kamMat * getPosition() );
     Punkt b = (Punkt)( kamMat * ( getPosition() - ( getSpeed() / getSpeed().getLength() * 10 ) ) );
-    a += zRObj.getDrawOff();
-    b += zRObj.getDrawOff();
-    char outCode1 = getOutCode( a, zRObj );
-    char outCode2 = getOutCode( b, zRObj );
-    bool ok = 0;
-    while( 1 )
-    {
-        int xMax = zRObj.getDrawGr().x - 1;
-        int yMax = zRObj.getDrawGr().y - 1;
-        if( !( outCode1 | outCode2 ) )
-        {
-            ok = 1;
-            break;
-        }
-        else if( outCode1 & outCode2 )
-            break;
-        else
-        {
-            int x = 0, y = 0;
-            char outCodeOut = outCode1 ? outCode1 : outCode2;
-            if( outCodeOut & 8 )
-            {
-                x = (int)( a.x + ( b.x - a.x ) * ( yMax - a.y ) / ( b.y - a.y ) + 0.5 );
-                y = yMax;
-            }
-            else if( outCodeOut & 4 )
-            {
-                x = (int)( a.x + ( b.x - a.x ) * ( zRObj.getDrawPos().y - a.y ) / ( b.y - a.y ) + 0.5 );
-                y = zRObj.getDrawPos().y;
-            }
-            else if( outCodeOut & 2 )
-            {
-                y = (int)( a.y + ( b.y - a.y ) * ( xMax - a.x ) / ( b.x - a.x ) + 0.5 );
-                x = xMax;
-            }
-            else if( outCodeOut & 1 )
-            {
-                y = (int)( a.y + ( b.y - a.y ) * ( zRObj.getDrawPos().x - a.x ) / ( b.x - a.x ) + 0.5 );
-                x = zRObj.getDrawPos().x;
-            }
-            if( outCodeOut == outCode1 )
-            {
-                a.x = x;
-                a.y = y;
-                outCode1 = getOutCode( a, zRObj );
-            }
-            else
-            {
-                b.x = x;
-                b.y = y;
-                outCode2 = getOutCode( b, zRObj );
-            }
-        }
-    }
-    if( ok )
-    {
-        int xlän = b.x - a.x, axlän = abs( xlän );
-        int ylän = b.y - a.y, aylän = abs( ylän );
-        double xf = (double)xlän / ( aylän ? aylän : 1 );
-        double yf = (double)ylän / ( axlän ? axlän : 1 );
-        if( axlän > aylän )
-            xf = xf < 0 ? -1 : 1;
-        else
-            yf = yf < 0 ? -1 : 1;
-        double x = (double)a.x, y = (double)a.y;
-        int maxP = (int)( sqrt( xlän * xlän + ylän * ylän ) + 0.5 );
-        int count = 0;
-        int *buffer = zRObj.getBuffer();
-        int maxPixel = zRObj.getBreite() * zRObj.getHeight();
-        while( !( (int)( x + 0.5 ) == b.x && (int)( y + 0.5 ) == b.y ) && count < maxP )
-        {
-            ++count;
-            if( (int)( (int)( x + 0.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) < maxPixel )
-                buffer[ (int)( (int)( x + 0.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) ] = 0xFFFFFFFF;
-            if( (int)( (int)( x - 0.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) < maxPixel &&
-                buffer[ (int)( (int)( x - 0.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) ] != 0xFFFFFFFF )
-                zRObj.alphaPixel( (int)( x - 0.5 ), (int)( y + 0.5 ), f );
-            if( (int)( (int)( x + 1.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) < maxPixel &&
-                buffer[ (int)( (int)( x + 1.5 ) + (int)( y + 0.5 ) * zRObj.getBreite() ) ] != 0xFFFFFFFF )
-                zRObj.alphaPixel( (int)( x + 1.5 ), (int)( y + 0.5 ), f );
-            if( (int)( (int)( x + 0.5 ) + (int)( y - 0.5 ) * zRObj.getBreite() ) < maxPixel &&
-                buffer[ (int)( (int)( x + 0.5 ) + (int)( y - 0.5 ) * zRObj.getBreite() ) ] != 0xFFFFFFFF )
-                zRObj.alphaPixel( (int)( x + 0.5 ), (int)( y - 0.5 ), f );
-            if( (int)( (int)( x + 0.5 ) + (int)( y + 1.5 ) * zRObj.getBreite() ) < maxPixel &&
-                buffer[ (int)( (int)( x + 0.5 ) + (int)( y + 1.5 ) * zRObj.getBreite() ) ] != 0xFFFFFFFF )
-                zRObj.alphaPixel( (int)( x + 0.5 ), (int)( y + 1.5 ), f );
-            x += xf, y += yf;
-        }
-    }
+    zRObj.drawLinieBorderedAlpha( a, b, f, 0xFFFFFFFF );
+}
+
+void Laser::save()
+{
+    last.pos = getPosition();
+    last.speed = getSpeed();
+    last.intensity = intensität;
+}
+
+void Laser::load()
+{
+    intensität = last.intensity;
+    setPosition( last.pos );
+    setSpeed( last.speed );
 }
 
 // constant

+ 10 - 1
Asteroids/Spiel/Schuss/Laser.h

@@ -12,11 +12,18 @@ class Karte;
 class Laser : public Object2D
 {
 private:
+    struct SaveData
+    {
+        Vertex pos;
+        Vertex speed;
+        double intensity;
+    };
 	int id;
 	double intensität;
 	double startIntensität;
 	int tf;
 	int sNum;
+    SaveData last;
 	// privat
 	char getOutCode( Punkt& p, Bild &zrObj ) const;
 
@@ -26,7 +33,9 @@ public:
 	// nicht constant
     Rect2< float > getBoundingBox() const;
 	bool tick( const WeltInfo &info, double tv ) override;
-	void render( Mat3< float > &kamMat, Bild &zRObj ) override;
+	void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
+    void save();
+    void load();
 	// constant
 	int getId() const;
 	int getSpieler() const;

+ 101 - 53
Asteroids/Spiel/SpielKlasse.cpp

@@ -31,12 +31,15 @@ SpielKlasse::SpielKlasse()
 	screen = 0;
     welt = new Welt2D();
     welt->setCircular( 1 );
-    welt->setAirResistance( 0.01f );
+    welt->setAirResistance( 0.001f );
     kam = new Kamera2D();
     kam->setWelt( welt->getThis(), 1 );
     minimap = new Kamera2D();
     minimap->setSize( 200, 200 );
     minimap->setWelt( welt->getThis(), 0 );
+    minimap->setStyle( ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Rahmen );
+    minimap->setLinienRahmenFarbe( 0xFFFFFFFF );
+    minimap->setName( "minimap" );
 	spielerAnzahl = 0;
 	karteId = 0;
 	ladenProzent = 0;
@@ -52,6 +55,7 @@ SpielKlasse::SpielKlasse()
 	shipGUI = 0;
 	spielPause = 1;
 	ref = 1;
+    save();
 }
 
 // Destruktor
@@ -104,14 +108,42 @@ bool SpielKlasse::istAmLeben() const
 
 void SpielKlasse::goBackInTime( int zeit )
 {
+    if( zeit < last.spielZeit )
+        chat->addNachricht( "Fehler: Es wurde versucht das Spiel auf einen Zeitpunkt zurückzusetzen, welcher nicht mehr erreicht werden kann.", 0xFFFF0000 );
+    load();
+    while( spielZeit < zeit )
+        tick();
+}
+
+void SpielKlasse::goToPresence( int zeit )
+{
+    save();
+    while( spielZeit < zeit )
+        tick();
+}
+
+void SpielKlasse::load()
+{
+    spielZeit = last.spielZeit;
     for( auto i = spieler->getIterator(); i; i++ )
-        i->resetToSaveTime( zeit, welt->getWorldInfo() );
+        i->load();
+    for( auto i = schüsse->getIterator(); i; i++ )
+        i->load();
 }
 
-void SpielKlasse::goToPresence()
+void SpielKlasse::save()
 {
+    last.spielZeit = spielZeit;
     for( auto i = spieler->getIterator(); i; i++ )
-        i->resetToGameTime( spielZeit, welt->getWorldInfo() );
+        i->save();
+    for( auto i = schüsse->getIterator(); i; i++ )
+        i->save();
+}
+
+void SpielKlasse::tick()
+{
+    spielZeit++;
+    kam->tick( TICK );
 }
 
 // nicht constant
@@ -239,8 +271,6 @@ void SpielKlasse::ladeDaten()
 	bestenliste->setTeamAnzahl( map->getMaxTeamAnzahl() );
     welt->setSize( map->getSize().x, map->getSize().y );
     welt->setSize( 1 );
-    minimap->lookAtWorldPos( map->getSize() / 2 );
-    minimap->lookAtWorldArea( map->getSize().x, map->getSize().y );
 	spielKlient->setLadenProzent( 100 );
 }
 
@@ -412,12 +442,16 @@ void SpielKlasse::stknVerarbeitung()
 	{
 		STKNachricht *n = stkn->z( i );
 		int zeit = n->getSpielZeit();
-		if( zeit > spielZeit )
-			break;
+        if( zeit > spielZeit )
+        {
+            chat->addNachricht( "Receved a message from the future.", 0xFFFF0000 );
+            break;
+        }
 		int län = n->getLength();
 		char *bytes = n->getNachricht();
 		län--;
 		int sNum = 0;
+        int presence = spielZeit;
 		switch( bytes[ 0 ] )
 		{
 		case 0: // spieler drückt gas
@@ -425,72 +459,78 @@ void SpielKlasse::stknVerarbeitung()
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ((Text( "Player " ) += sNum) += " gibt gaß at time ") += zeit, 0xFF909090 );
 			for( auto i = spieler->getIterator(); i; i++ )
 			{
 				if( i->getSpielerNummer() == sNum )
 					i->setTastataturStatus( T_GAS, 1 );
 			}
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 1: // spieler lässt gas los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " stoppt gaß at time " ) += zeit, 0xFF909090 );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                     i->setTastataturStatus( T_GAS, 0 );
             }
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 2: // spieler drückt rotl
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " drückt 'left' at time " ) += zeit, 0xFF909090 );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                     i->setTastataturStatus( T_ROT_L, 1 );
             }
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 3: // spieler lässt rotl los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " stoppt 'left' at time " ) += zeit, 0xFF909090 );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                     i->setTastataturStatus( T_ROT_L, 0 );
             }
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 4: // spieler drückt rotr
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " drückt 'right' at time " ) += zeit, 0xFF909090 );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                     i->setTastataturStatus( T_ROT_R, 1 );
             }
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 5: // spieler lässt rotr los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
             goBackInTime( zeit );
+            //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " stoppt 'right' at time " ) += zeit, 0xFF909090 );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
                     i->setTastataturStatus( T_ROT_R, 0 );
             }
-            goToPresence();
+            goToPresence( presence );
 			break;
 		case 6: // Init Spieler
 			if( 1 )
@@ -499,6 +539,7 @@ void SpielKlasse::stknVerarbeitung()
 				spielerAnzahl = (int)*bytes;
 				bytes++;
 				län--;
+                //chat->addNachricht( "Player initialisation", 0xFF909090 );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					int sNum = *(int*)bytes;
@@ -544,6 +585,7 @@ void SpielKlasse::stknVerarbeitung()
 			bytes++;
 			spielerNummer = *(int*)bytes;
 			län -= 4;
+            //chat->addNachricht( "Spielernummer zugewiesen", 0xFF909090 );
 			for( int i = 0; i < spielerAnzahl; i++ )
 			{
 				if( spieler->z( i )->getSpielerNummer() == spielerNummer )
@@ -556,8 +598,10 @@ void SpielKlasse::stknVerarbeitung()
 		case 0xA: // Start
 			spielPause = 0;
 			rendern = 1;
+            //chat->addNachricht( "Spiel beginnt jetzt", 0xFF909090 );
 			break;
 		case 0xB: // Ende
+            //chat->addNachricht( "Spiel beendet", 0xFF909090 );
             csv.schreibe( "\n\nSpielernummer;Kills;Tode;Schaden gemacht;Schaden bekommen;Schüsse;Treffer\n", 2 );
             for( int i = 0; i < spielerAnzahl; i++ )
             {
@@ -599,6 +643,7 @@ void SpielKlasse::stknVerarbeitung()
                 line += "\n";
                 csv.schreibe( line, line.getLength() );
                 goBackInTime( zeit );
+                //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " has improoved skill at time " ) += zeit, 0xFF909090 );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == sNum )
@@ -620,7 +665,7 @@ void SpielKlasse::stknVerarbeitung()
 						break;
 					}
 				}
-                goToPresence();
+                goToPresence( presence );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == spielerNummer )
@@ -657,6 +702,7 @@ void SpielKlasse::stknVerarbeitung()
 				län -= 8;
 				int farbe = 0;
                 goBackInTime( zeit );
+                chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " shoot's at time " ) += zeit, 0xFF909090 );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == sNum )
@@ -667,7 +713,10 @@ void SpielKlasse::stknVerarbeitung()
 						break;
 					}
 				}
-                goToPresence();
+                Laser *l = new Laser( id, Vec2< double >( xPos, yPos ), Vec2< double >( xSpeed, ySpeed ), sNum, intensität, farbe );
+                welt->addObject( l->getThis() );
+                schüsse->add( l );
+                goToPresence( presence );
 				if( sNum == spielerNummer )
 				{
 					for( int i = 0; i < spielerAnzahl; i++ )
@@ -680,11 +729,6 @@ void SpielKlasse::stknVerarbeitung()
 						}
 					}
 				}
-				Laser *l = new Laser( id, Vec2< double >( xPos, yPos ), Vec2< double >( xSpeed, ySpeed ), sNum, intensität, farbe );
-                for( int i = 0; i < spielZeit - zeit; i++ )
-                    l->tick( welt->getWorldInfo(), TICK );
-                welt->addObject( l->getThis() );
-				schüsse->add( l );
 			}
 			break;
 		case 0xE: // Treffer
@@ -697,6 +741,7 @@ void SpielKlasse::stknVerarbeitung()
 				int sNum = *(int*)bytes;
 				län -= 4;
                 goBackInTime( zeit );
+                chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " was damaged at time " ) += zeit, 0xFF909090 );
 				for( auto tmp = schüsse->getIterator(); tmp; tmp++ )
 				{
 					if( tmp->getId() == schuss )
@@ -721,9 +766,7 @@ void SpielKlasse::stknVerarbeitung()
                             {
                                 if( s->getSpielerNummer() == tmp->getSpieler() )
                                 {
-                                    s->resetToSaveTime( zeit, welt->getWorldInfo() );
                                     s->machSchaden( intens );
-                                    s->resetToGameTime( spielZeit, welt->getWorldInfo() );
                                     bestenliste->updateSpieler( s );
                                     break;
                                 }
@@ -734,7 +777,7 @@ void SpielKlasse::stknVerarbeitung()
 						break;
 					}
 				}
-                goToPresence();
+                goToPresence( presence );
 				if( sNum == spielerNummer )
 				{
                     for( auto s = spieler->getIterator(); s; s++ )
@@ -755,6 +798,7 @@ void SpielKlasse::stknVerarbeitung()
 				int sNum = *(int*)bytes;
 				län -= 4;
                 goBackInTime( zeit );
+                //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " was reborn at time " ) += zeit, 0xFF909090 );
                 for( auto s = spieler->getIterator(); s; s++ )
 				{
 					if( s->getSpielerNummer() == sNum )
@@ -763,7 +807,7 @@ void SpielKlasse::stknVerarbeitung()
 						break;
 					}
 				}
-                goToPresence();
+                goToPresence( presence );
 				if( sNum == spielerNummer )
 				{
                     for( auto s = spieler->getIterator(); s; s++ )
@@ -787,6 +831,7 @@ void SpielKlasse::stknVerarbeitung()
 				int killer = *(int*)bytes;
 				län -= 4;
                 goBackInTime( zeit );
+                //chat->addNachricht( ( ( Text( "Player " ) += sNum ) += " dyed at time " ) += zeit, 0xFF909090 );
                 for( auto s = spieler->getIterator(); s; s++ )
 				{
 					if( s->getSpielerNummer() == sNum )
@@ -807,7 +852,7 @@ void SpielKlasse::stknVerarbeitung()
 						bestenliste->updateSpieler( s );
 					}
 				}
-                goToPresence();
+                goToPresence( presence );
 				if( sNum == spielerNummer )
 				{
 					for( int i = 0; i < spielerAnzahl; i++ )
@@ -844,24 +889,20 @@ void SpielKlasse::stknVerarbeitung()
 
 bool SpielKlasse::tick( double zeit )
 {
+    stknVerarbeitung();
 	if( spielPause )
 	{
 		zeit = 0;
-		stknVerarbeitung();
 		return 1;
 	}
 	rZeit += zeit;
 	while( TICK < rZeit )
 	{
 		rZeit -= TICK;
-		spielZeit++;
-		stknVerarbeitung();
-		if( end )
-			return 1;
-		int x = 0;
-		int y = 0;
-		bool setKam = 0;
+        if( end )
+            return 1;
 		lock();
+        // tote spieler
         int deadsCount = deads->getEintragAnzahl();
         for( int i = 0; i < deadsCount; i++ )
         {
@@ -872,33 +913,43 @@ bool SpielKlasse::tick( double zeit )
                 deadsCount--;
             }
         }
-        kam->tick( TICK );
+        // spiel fortschritt
+        tick();
         minimap->tick( TICK );
+        // Kamera bewegen
+        Vertex tPos;
+        bool setKam = 0;
 		for( int i = 0; i < spielerAnzahl; i++ )
 		{
 			if( spieler->z( i )->getSpielerNummer() == spielerNummer )
 				shipGUI->update( spieler->z( i ) );
 			if( spielerNummer == spieler->z( i )->getSpielerNummer() )
 			{
-				x = (int)spieler->z( i )->getPosition().x;
-				y = (int)spieler->z( i )->getPosition().y;
+                tPos = spieler->z( i )->getPosition();
 				setKam = spieler->z( i )->istAmLeben();
 			}
 		}
 		unlock();
 		if( setKam )
 		{
-			float px = ( ( x - kam->getWorldPosition().x ) / 4.0f ) * (float)TICK;
-            float py = ( ( y - kam->getWorldPosition().y ) / 4.0f ) * (float)TICK;
-			/*if( abs( x - kam->getWorldPosition().x ) > abs( x - ( kam->getWorldPosition().x - map->getSize().x ) ) )
-				px = ( ( x - ( kam->getWorldPosition().x - map->getSize().x ) ) / 4.0f ) * (float)TICK;
-			else if( abs( x - kam->getWorldPosition().x ) > abs( x - ( kam->getWorldPosition().x + map->getSize().x ) ) )
-				px = ( ( x - ( kam->getWorldPosition().x + map->getSize().x ) ) / 4.0f ) * (float)TICK;
-			if( abs( y - kam->getWorldPosition().y ) > abs( y - ( kam->getWorldPosition().y - map->getSize().y ) ) )
-				py = ( ( y - ( kam->getWorldPosition().y - map->getSize().y ) ) / 4.0f ) * (float)TICK;
-			else if( abs( y - kam->getWorldPosition().y ) > abs( y - ( kam->getWorldPosition().y + map->getSize().y ) ) )
-				py = ( ( y - ( kam->getWorldPosition().y + map->getSize().y ) ) / 4.0f ) * (float)TICK;*/
-			kam->lookAtWorldPos( kam->getWorldPosition() + Vertex( px, py ) );
+            Vertex str = ( tPos - kam->getWorldPosition() );
+            if( ( tPos + welt->getWorldInfo().size - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + welt->getWorldInfo().size - kam->getWorldPosition() );
+            if( ( tPos - welt->getWorldInfo().size - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos - welt->getWorldInfo().size - kam->getWorldPosition() );
+            if( ( tPos + Punkt( welt->getWorldInfo().size.x, 0 ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( welt->getWorldInfo().size.x, 0 ) - kam->getWorldPosition() );
+            if( ( tPos + Punkt( -welt->getWorldInfo().size.x, 0 ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( -welt->getWorldInfo().size.x, 0 ) - kam->getWorldPosition() );
+            if( ( tPos + Punkt( 0, welt->getWorldInfo().size.y ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( 0, welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
+            if( ( tPos + Punkt( 0, -welt->getWorldInfo().size.y ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( 0, -welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
+            if( ( tPos + Punkt( welt->getWorldInfo().size.x, -welt->getWorldInfo().size.y ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( welt->getWorldInfo().size.x, -welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
+            if( ( tPos + Punkt( -welt->getWorldInfo().size.x, welt->getWorldInfo().size.y ) - kam->getWorldPosition() ).getLengthSq() < str.getLengthSq() )
+                str = ( tPos + Punkt( -welt->getWorldInfo().size.x, welt->getWorldInfo().size.y ) - kam->getWorldPosition() );
+			kam->lookAtWorldPos( kam->getWorldPosition() + str / 4.f * (float)TICK );
 		}
 		chat->tick( !zeit ? 0.05 : zeit );
 		if( shipGUI )
@@ -915,13 +966,10 @@ void SpielKlasse::render( Bild &zRObj )
     kam->lookAtWorldArea( zRObj.getBreite(), zRObj.getHeight() );
     kam->setSize( zRObj.getSize() );
     kam->render( zRObj );
-    for( int j = 0; j < spielerAnzahl; j++ )
-        spieler->z( j )->renderLeben( kam->getMatrix(), zRObj );
-    int objektAnzahl = objekte->getEintragAnzahl();
-    for( int i = 0; i < objektAnzahl; i++ )
-        objekte->z( i )->renderLeben( kam->getMatrix(), zRObj );
     zRObj.setAlpha( 50 );
     minimap->setPosition( zRObj.getSize() - Punkt( 210, 210 ) );
+    minimap->lookAtWorldPos( welt->getWorldInfo().size.x / 2, welt->getWorldInfo().size.y / 2 );
+    minimap->lookAtWorldArea( welt->getWorldInfo().size.x, welt->getWorldInfo().size.y );
     minimap->render( zRObj );
     zRObj.releaseAlpha();
 	chat->render( zRObj );

+ 10 - 1
Asteroids/Spiel/SpielKlasse.h

@@ -16,6 +16,11 @@
 class SpielKlasse : public SpielV
 {
 private:
+    struct SaveData
+    {
+        int spielZeit;
+    };
+
 	RCArray< STKNachricht > *stkn;
 	int stkna;
 	Bestenliste *bestenliste;
@@ -47,11 +52,15 @@ private:
 	int spielerNummer;
 	char *tasten;
 	bool spielPause;
+    SaveData last;
 	int ref;
 
 	bool istAmLeben() const;
     void goBackInTime( int zeit );
-    void goToPresence();
+    void goToPresence( int zeit );
+    void load();
+    void save();
+    void tick();
 
 public:
 	// Konstruktor

+ 4 - 3
Asteroids/Spiel/Spieler/DeadPlayer.cpp

@@ -21,6 +21,7 @@ DeadPlayer::DeadPlayer( Model2DData *mda, Model2DData *mdb, Punkt posa, Punkt po
     this->rotA = rotA;
     this->rotB = rotB;
     alpha = 255;
+    setCollision( 0 );
 }
 
 DeadPlayer::~DeadPlayer()
@@ -29,11 +30,11 @@ DeadPlayer::~DeadPlayer()
     m2b->release();
 }
 
-void DeadPlayer::render( Mat3< float > &kamMat, Bild &zRObj )
+void DeadPlayer::render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName )
 {
     zRObj.setAlpha( (unsigned char)alpha );
-    m2a->render( kamMat, zRObj );
-    m2b->render( kamMat, zRObj );
+    m2a->render( kamMat, zRObj, kamName );
+    m2b->render( kamMat, zRObj, kamName );
     zRObj.releaseAlpha();
 }
 

+ 1 - 1
Asteroids/Spiel/Spieler/DeadPlayer.h

@@ -18,7 +18,7 @@ private:
 public:
     DeadPlayer( Model2DData *mda, Model2DData *mdb, Punkt posa, Punkt posb, Vertex speedA, Vertex speedB, float curRotA, float curRotB, float rotA, float rotB, Textur2D *zTextur );
     ~DeadPlayer();
-    void render( Mat3< float > &kamMat, Bild &zRObj ) override;
+    void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
     bool tick( const WeltInfo &info, double zeit ) override;
     Rect2< float > getBoundingBox() const override;
     bool isFinished() const;

+ 88 - 101
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -85,90 +85,6 @@ double Spieler::calculateLaserCost()
     return kosten;
 }
 
-void Spieler::save()
-{
-    last.rSpeed = getDrehungSpeed();
-    last.pos = getPosition();
-    last.speed = getSpeed();
-    last.rotation = getDrehung();
-    last.farbe = farbe;
-    last.amLeben = amLeben;
-    last.schussAbk = schussAbk;
-    last.energieAbk = energieAbk;
-    last.repAbk = repAbk;
-    last.reinkAbk = reinkAbk;
-    last.maxReinkAbk = maxReinkAbk;
-    last.spielZeit = spielZeit;
-    last.startPos = startPos;
-    last.beschleunigung = beschleunigung;
-    last.energie = energie;
-    last.stabilität = stabilität;
-    last.reparatur = reparatur;
-    last.laserIntensität = laserIntensität;
-    last.laserEffizienz = laserEffizienz;
-    last.akkuLeistung = akkuLeistung;
-    last.maxEnergie = maxEnergie;
-    last.maxStabilität = maxStabilität;
-    last.laserTempo = laserTempo;
-    last.netzwerk = netzwerk;
-    last.wendigkeit = wendigkeit;
-    last.antriebEffizienz = antriebEffizienz;
-    last.energieSchild = energieSchild;
-    last.energieSchildEffizienz = energieSchildEffizienz;
-    last.zeitAmLeben = zeitAmLeben;
-    last.zeitTod = zeitTod;
-    last.schadenBekommen = schadenBekommen;
-    last.schadenGemacht = schadenGemacht;
-    last.treibstoffVerbraucht = treibstoffVerbraucht;
-    last.schüsse = schüsse;
-    last.treffer = treffer;
-    last.punkte = punkte;
-    last.kills = kills;
-    last.tode = tode;
-}
-
-void Spieler::load()
-{
-    setDrehungSpeed( last.rSpeed );
-    setPosition( last.pos );
-    setSpeed( last.speed );
-    setDrehung( last.rotation );
-    farbe = last.farbe;
-    amLeben = last.amLeben;
-    schussAbk = last.schussAbk;
-    energieAbk = last.energieAbk;
-    repAbk = last.repAbk;
-    reinkAbk = last.reinkAbk;
-    maxReinkAbk = last.maxReinkAbk;
-    spielZeit = last.spielZeit;
-    startPos = last.startPos;
-    beschleunigung = last.beschleunigung;
-    energie = last.energie;
-    stabilität = last.stabilität;
-    reparatur = last.reparatur;
-    laserIntensität = last.laserIntensität;
-    laserEffizienz = last.laserEffizienz;
-    akkuLeistung = last.akkuLeistung;
-    maxEnergie = last.maxEnergie;
-    maxStabilität = last.maxStabilität;
-    laserTempo = last.laserTempo;
-    netzwerk = last.netzwerk;
-    wendigkeit = last.wendigkeit;
-    antriebEffizienz = last.antriebEffizienz;
-    energieSchild = last.energieSchild;
-    energieSchildEffizienz = last.energieSchildEffizienz;
-    zeitAmLeben = last.zeitAmLeben;
-    zeitTod = last.zeitTod;
-    schadenBekommen = last.schadenBekommen;
-    schadenGemacht = last.schadenGemacht;
-    treibstoffVerbraucht = last.treibstoffVerbraucht;
-    schüsse = last.schüsse;
-    treffer = last.treffer;
-    punkte = last.punkte;
-    kills = last.kills;
-    tode = last.tode;
-}
-
 // nicht constant
 void Spieler::setModelData( Model2DData *data, Animation2DData *zFStart, Animation2DData *zFBurn )
 {
@@ -396,11 +312,14 @@ bool Spieler::tick( const WeltInfo &info, double tv )
     return ret;
 }
 
-void Spieler::render( Mat3< float > &kamMat, Bild &zRObj )
+void Spieler::render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName )
 {
     if( !amLeben )
         return;
-    __super::render( kamMat, zRObj );
+    __super::render( kamMat, zRObj, kamName );
+    if( Text( "minimap" ).istGleich( kamName ) )
+        return;
+    renderLeben( kamMat, zRObj );
 }
 
 void Spieler::renderLeben( const Mat3< float > &kamMat, Bild &zRObj )
@@ -592,28 +511,96 @@ void Spieler::wiederbelebung()
     amLeben = 1;
 }
 
-void Spieler::resetToSaveTime( int t, const WeltInfo &info )
+void Spieler::hatGeschossen()
 {
-    if( last.spielZeit > t )
-        throw std::exception( "Fehlerhafter zustand" ); // this should never be possible
-    load();
-    while( spielZeit < t )
-        tick( info, 0 );
+    energie -= calculateLaserCost();
+    schussAbk = 1;
+    energieAbk = 1.5;
+    schüsse++;
 }
 
-void Spieler::resetToGameTime( int t, const WeltInfo &info )
+void Spieler::save()
 {
-    save();
-    while( spielZeit < t )
-        tick( info, 0 );
+    last.rSpeed = getDrehungSpeed();
+    last.pos = getPosition();
+    last.speed = getSpeed();
+    last.rotation = getDrehung();
+    last.farbe = farbe;
+    last.amLeben = amLeben;
+    last.schussAbk = schussAbk;
+    last.energieAbk = energieAbk;
+    last.repAbk = repAbk;
+    last.reinkAbk = reinkAbk;
+    last.maxReinkAbk = maxReinkAbk;
+    last.spielZeit = spielZeit;
+    last.startPos = startPos;
+    last.beschleunigung = beschleunigung;
+    last.energie = energie;
+    last.stabilität = stabilität;
+    last.reparatur = reparatur;
+    last.laserIntensität = laserIntensität;
+    last.laserEffizienz = laserEffizienz;
+    last.akkuLeistung = akkuLeistung;
+    last.maxEnergie = maxEnergie;
+    last.maxStabilität = maxStabilität;
+    last.laserTempo = laserTempo;
+    last.netzwerk = netzwerk;
+    last.wendigkeit = wendigkeit;
+    last.antriebEffizienz = antriebEffizienz;
+    last.energieSchild = energieSchild;
+    last.energieSchildEffizienz = energieSchildEffizienz;
+    last.zeitAmLeben = zeitAmLeben;
+    last.zeitTod = zeitTod;
+    last.schadenBekommen = schadenBekommen;
+    last.schadenGemacht = schadenGemacht;
+    last.treibstoffVerbraucht = treibstoffVerbraucht;
+    last.schüsse = schüsse;
+    last.treffer = treffer;
+    last.punkte = punkte;
+    last.kills = kills;
+    last.tode = tode;
 }
 
-void Spieler::hatGeschossen()
+void Spieler::load()
 {
-    energie -= calculateLaserCost();
-    schussAbk = 1;
-    energieAbk = 1.5;
-    schüsse++;
+    setDrehungSpeed( last.rSpeed );
+    setPosition( last.pos );
+    setSpeed( last.speed );
+    setDrehung( last.rotation );
+    farbe = last.farbe;
+    amLeben = last.amLeben;
+    schussAbk = last.schussAbk;
+    energieAbk = last.energieAbk;
+    repAbk = last.repAbk;
+    reinkAbk = last.reinkAbk;
+    maxReinkAbk = last.maxReinkAbk;
+    spielZeit = last.spielZeit;
+    startPos = last.startPos;
+    beschleunigung = last.beschleunigung;
+    energie = last.energie;
+    stabilität = last.stabilität;
+    reparatur = last.reparatur;
+    laserIntensität = last.laserIntensität;
+    laserEffizienz = last.laserEffizienz;
+    akkuLeistung = last.akkuLeistung;
+    maxEnergie = last.maxEnergie;
+    maxStabilität = last.maxStabilität;
+    laserTempo = last.laserTempo;
+    netzwerk = last.netzwerk;
+    wendigkeit = last.wendigkeit;
+    antriebEffizienz = last.antriebEffizienz;
+    energieSchild = last.energieSchild;
+    energieSchildEffizienz = last.energieSchildEffizienz;
+    zeitAmLeben = last.zeitAmLeben;
+    zeitTod = last.zeitTod;
+    schadenBekommen = last.schadenBekommen;
+    schadenGemacht = last.schadenGemacht;
+    treibstoffVerbraucht = last.treibstoffVerbraucht;
+    schüsse = last.schüsse;
+    treffer = last.treffer;
+    punkte = last.punkte;
+    kills = last.kills;
+    tode = last.tode;
 }
 
 // constant

+ 3 - 5
Asteroids/Spiel/Spieler/Spieler.h

@@ -126,8 +126,6 @@ private:
     DeadPlayer *deadPlayer;
 
     double calculateLaserCost();
-    void save();
-    void load();
 
 public:
 	// Konstruktor
@@ -141,7 +139,7 @@ public:
 	void setSpielerFarbe( int fc, Bild *zTextur );
 	void setTastataturStatus( TastaturStatus ts, bool aktiv );
 	bool tick( const WeltInfo &info, double zeit ) override;
-	void render( Mat3< float > &kamMat, Bild &zRObj ) override;
+	void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
 	void renderLeben( const Mat3< float > &kamMat, Bild &zRObj );
 	void setSkill( int art );
 	void nimmSchaden( double &intensität );
@@ -150,9 +148,9 @@ public:
 	void addKill();
     DeadPlayer *sterben();
 	void wiederbelebung();
-	void resetToSaveTime( int t, const WeltInfo &info );
-    void resetToGameTime( int t, const WeltInfo &info );
 	void hatGeschossen();
+    void save();
+    void load();
 	// constant
 	int getAccountId() const;
 	Text *getName() const;

+ 20 - 2
build.bat

@@ -1,3 +1,21 @@
-"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Asteroids.sln" /p:configuration=release /p:platform=win32
+:DebugWin64
+SET RETURN=DebugWin64
+SET NEXT=ReleaseWin64
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Asteroids.sln" /p:configuration=debug /p:platform=x64
+if errorlevel 1 GOTO Error
+:ReleaseWin64
+SET RETURN=ReleaseWin64
+SET NEXT=ReleaseWin32
 "D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Asteroids.sln" /p:configuration=release /p:platform=x64
-"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Asteroids.sln" /p:configuration=debug /p:platform=x64
+if errorlevel 1 GOTO Error
+:ReleaseWin32
+SET RETURN=ReleaseWin32
+SET NEXT=END
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Asteroids.sln" /p:configuration=release /p:platform=win32
+if errorlevel 1 GOTO Error
+GOTO End
+:Error
+SET /p redo=Nochmal versuchen?(j/n):
+IF /I '%redo%' equ 'j' GOTO %RETURN%
+GOTO %NEXT%
+:End