Browse Source

Fehler in der synchronisation behoben

Kolja Strohm 6 years ago
parent
commit
623982d2d5

+ 110 - 101
Asteroids/Spiel/SpielKlasse.cpp

@@ -102,6 +102,18 @@ bool SpielKlasse::istAmLeben() const
 	return 0;
 }
 
+void SpielKlasse::goBackInTime( int zeit )
+{
+    for( auto i = spieler->getIterator(); i; i++ )
+        i->resetToSaveTime( zeit, welt->getWorldInfo() );
+}
+
+void SpielKlasse::goToPresence()
+{
+    for( auto i = spieler->getIterator(); i; i++ )
+        i->resetToGameTime( spielZeit, welt->getWorldInfo() );
+}
+
 // nicht constant
 void SpielKlasse::lock()
 {
@@ -227,6 +239,7 @@ 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 );
 }
@@ -411,61 +424,73 @@ void SpielKlasse::stknVerarbeitung()
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
+            goBackInTime( zeit );
+			for( auto i = spieler->getIterator(); i; i++ )
 			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_GAS, 1, zeit, welt->getWorldInfo() );
+				if( i->getSpielerNummer() == sNum )
+					i->setTastataturStatus( T_GAS, 1 );
 			}
+            goToPresence();
 			break;
 		case 1: // spieler lässt gas los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_GAS, 0, zeit, welt->getWorldInfo() );
-			}
+            goBackInTime( zeit );
+            for( auto i = spieler->getIterator(); i; i++ )
+            {
+                if( i->getSpielerNummer() == sNum )
+                    i->setTastataturStatus( T_GAS, 0 );
+            }
+            goToPresence();
 			break;
 		case 2: // spieler drückt rotl
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_ROT_L, 1, zeit, welt->getWorldInfo() );
-			}
+            goBackInTime( zeit );
+            for( auto i = spieler->getIterator(); i; i++ )
+            {
+                if( i->getSpielerNummer() == sNum )
+                    i->setTastataturStatus( T_ROT_L, 1 );
+            }
+            goToPresence();
 			break;
 		case 3: // spieler lässt rotl los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_ROT_L, 0, zeit, welt->getWorldInfo() );
-			}
+            goBackInTime( zeit );
+            for( auto i = spieler->getIterator(); i; i++ )
+            {
+                if( i->getSpielerNummer() == sNum )
+                    i->setTastataturStatus( T_ROT_L, 0 );
+            }
+            goToPresence();
 			break;
 		case 4: // spieler drückt rotr
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_ROT_R, 1, zeit, welt->getWorldInfo() );
-			}
+            goBackInTime( zeit );
+            for( auto i = spieler->getIterator(); i; i++ )
+            {
+                if( i->getSpielerNummer() == sNum )
+                    i->setTastataturStatus( T_ROT_R, 1 );
+            }
+            goToPresence();
 			break;
 		case 5: // spieler lässt rotr los
 			bytes++;
 			sNum = *(int*)bytes;
 			län -= 4;
-			for( int i = 0; i < spielerAnzahl; i++ )
-			{
-				if( spieler->z( i )->getSpielerNummer() == sNum )
-					spieler->z( i )->setTastataturStatus( T_ROT_R, 0, zeit, welt->getWorldInfo() );
-			}
+            goBackInTime( zeit );
+            for( auto i = spieler->getIterator(); i; i++ )
+            {
+                if( i->getSpielerNummer() == sNum )
+                    i->setTastataturStatus( T_ROT_R, 0 );
+            }
+            goToPresence();
 			break;
 		case 6: // Init Spieler
 			if( 1 )
@@ -487,7 +512,6 @@ void SpielKlasse::stknVerarbeitung()
 						teams->set( map->createTeam( map->getTeamNummer( sNum ) ), map->getTeamNummer( sNum ) );
 					tmp->setTeam( teams->get( map->getTeamNummer( sNum ) ) );
 					tmp->zTeam()->spieler->add( (Spieler*)tmp->getThis() );
-					spieler->add( tmp );
 					bestenliste->addSpieler( tmp );
 					bestenliste->updateSpieler( tmp );
 					bestenliste->updateTeam( tmp->zTeam() );
@@ -497,6 +521,7 @@ void SpielKlasse::stknVerarbeitung()
 				{
 					if( !spieler->z( i )->zTeam() )
 					{
+                        welt->removeObject( spieler->z( i ) );
 						spieler->remove( i );
 						i--;
 						max--;
@@ -573,13 +598,12 @@ void SpielKlasse::stknVerarbeitung()
                 line += art;
                 line += "\n";
                 csv.schreibe( line, line.getLength() );
+                goBackInTime( zeit );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == sNum )
 					{
 						Team *tmp = spieler->z( i )->zTeam();
-						for( auto j = tmp->spieler->getIterator(); j && j._; j++ )
-							j->resetToSaveTime( zeit, welt->getWorldInfo() );
 						spieler->z( i )->setSkill( art );
 						tmp->akkuLeistung = tmp->getAkkuLeistungBonus();
 						tmp->beschleunigung = tmp->getBeschleunigungBonus();
@@ -593,11 +617,10 @@ void SpielKlasse::stknVerarbeitung()
                         tmp->antriebEffizienz = tmp->getAntriebEffizienzBonus();
                         tmp->energieSchild = tmp->getEnergieSchildBonus();
                         tmp->energieSchildEffizienz = tmp->getEnergieSchildEffizienzBonus();
-						for( auto j = tmp->spieler->getIterator(); j && j._; j++ )
-							j->resetToGameTime( spielZeit, welt->getWorldInfo() );
 						break;
 					}
 				}
+                goToPresence();
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == spielerNummer )
@@ -633,18 +656,18 @@ void SpielKlasse::stknVerarbeitung()
 				double intensität = *(double*)bytes;
 				län -= 8;
 				int farbe = 0;
+                goBackInTime( zeit );
 				for( int i = 0; i < spielerAnzahl; i++ )
 				{
 					if( spieler->z( i )->getSpielerNummer() == sNum )
 					{
-						spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
 						spieler->z( i )->setPosition( Vec2< double >( xPos, yPos ) );
 						spieler->z( i )->hatGeschossen();
 						farbe = spieler->z( i )->zTeam()->farbe;
-						spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
 						break;
 					}
 				}
+                goToPresence();
 				if( sNum == spielerNummer )
 				{
 					for( int i = 0; i < spielerAnzahl; i++ )
@@ -673,46 +696,35 @@ void SpielKlasse::stknVerarbeitung()
 				län -= 4;
 				int sNum = *(int*)bytes;
 				län -= 4;
-				int anz = schüsse->getEintragAnzahl();
-				for( int i = 0; i < anz; i++ )
+                goBackInTime( zeit );
+				for( auto tmp = schüsse->getIterator(); tmp; tmp++ )
 				{
-					if( schüsse->z( i )->getId() == schuss )
+					if( tmp->getId() == schuss )
 					{
-						Laser *tmp = schüsse->z( i );
-                        if( zeit > spielZeit )
-                        {
-                            for( int i = 0; i < zeit - spielZeit; i++ )
-                                tmp->tick( welt->getWorldInfo(), TICK );
-                        }
-                        else
-                        {
-                            for( int i = 0; i < spielZeit - zeit; i++ )
-                                tmp->tick( welt->getWorldInfo(), -TICK );
-                        }
+                        for( int i = 0; i < spielZeit - zeit; i++ )
+                            tmp->tick( welt->getWorldInfo(), -TICK );
 						if( sNum >= 0 )
 						{
                             double intens = 0;
-							for( int j = 0; j < spielerAnzahl; j++ )
+							for( auto s = spieler->getIterator(); s; s++ )
 							{
-								if( spieler->z( j )->getSpielerNummer() == sNum )
+								if( s->getSpielerNummer() == sNum )
 								{
-                                    spieler->z( j )->resetToSaveTime( zeit, welt->getWorldInfo() );
-                                    intens = tmp->getIntensität( spieler->z( j )->getSpeed() );
-									spieler->z( j )->nimmSchaden( intens );
-                                    spieler->z( j )->calcDeadPlayerObject( schüsse->z( i ) );
-                                    spieler->z( j )->resetToGameTime( spielZeit, welt->getWorldInfo() );
-									bestenliste->updateSpieler( spieler->z( j ) );
+                                    intens = tmp->getIntensität( s->getSpeed() );
+									s->nimmSchaden( intens );
+                                    s->calcDeadPlayerObject( schüsse->z( i ) );
+									bestenliste->updateSpieler( s );
                                     break;
 								}
 							}
-                            for( int j = 0; j < spielerAnzahl; j++ )
+                            for( auto s = spieler->getIterator(); s; s++ )
                             {
-                                if( spieler->z( j )->getSpielerNummer() == tmp->getSpieler() )
+                                if( s->getSpielerNummer() == tmp->getSpieler() )
                                 {
-                                    spieler->z( j )->resetToSaveTime( zeit, welt->getWorldInfo() );
-                                    spieler->z( j )->machSchaden( intens );
-                                    spieler->z( j )->resetToGameTime( spielZeit, welt->getWorldInfo() );
-                                    bestenliste->updateSpieler( spieler->z( j ) );
+                                    s->resetToSaveTime( zeit, welt->getWorldInfo() );
+                                    s->machSchaden( intens );
+                                    s->resetToGameTime( spielZeit, welt->getWorldInfo() );
+                                    bestenliste->updateSpieler( s );
                                     break;
                                 }
                             }
@@ -722,13 +734,14 @@ void SpielKlasse::stknVerarbeitung()
 						break;
 					}
 				}
+                goToPresence();
 				if( sNum == spielerNummer )
 				{
-					for( int i = 0; i < spielerAnzahl; i++ )
+                    for( auto s = spieler->getIterator(); s; s++ )
 					{
-						if( spieler->z( i )->getSpielerNummer() == spielerNummer )
+						if( s->getSpielerNummer() == spielerNummer )
 						{
-							shipGUI->update( spieler->z( i ) );
+							shipGUI->update( s );
 							break;
 						}
 					}
@@ -741,23 +754,23 @@ void SpielKlasse::stknVerarbeitung()
 				bytes++;
 				int sNum = *(int*)bytes;
 				län -= 4;
-				for( int i = 0; i < spielerAnzahl; i++ )
+                goBackInTime( zeit );
+                for( auto s = spieler->getIterator(); s; s++ )
 				{
-					if( spieler->z( i )->getSpielerNummer() == sNum )
+					if( s->getSpielerNummer() == sNum )
 					{
-                        spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
-						spieler->z( i )->wiederbelebung();
-                        spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
+						s->wiederbelebung();
 						break;
 					}
 				}
+                goToPresence();
 				if( sNum == spielerNummer )
 				{
-					for( int i = 0; i < spielerAnzahl; i++ )
+                    for( auto s = spieler->getIterator(); s; s++ )
 					{
-						if( spieler->z( i )->getSpielerNummer() == spielerNummer )
+						if( s->getSpielerNummer() == spielerNummer )
 						{
-							shipGUI->update( spieler->z( i ) );
+							shipGUI->update( s );
 							break;
 						}
 					}
@@ -773,30 +786,28 @@ void SpielKlasse::stknVerarbeitung()
 				län -= 4;
 				int killer = *(int*)bytes;
 				län -= 4;
-				for( int i = 0; i < spielerAnzahl; i++ )
+                goBackInTime( zeit );
+                for( auto s = spieler->getIterator(); s; s++ )
 				{
-					if( spieler->z( i )->getSpielerNummer() == sNum )
+					if( s->getSpielerNummer() == sNum )
 					{
-                        spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
-						DeadPlayer *dp = spieler->z( i )->sterben();
+						DeadPlayer *dp = s->sterben();
                         if( dp )
                         {
                             welt->addObject( dp->getThis() );
                             deads->add( dp );
                         }
-                        spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
-						bestenliste->updateSpieler( spieler->z( i ) );
+						bestenliste->updateSpieler( s );
 					}
-					if( spieler->z( i )->getSpielerNummer() == killer )
+					if( s->getSpielerNummer() == killer )
 					{
-                        spieler->z( i )->resetToSaveTime( zeit, welt->getWorldInfo() );
-						spieler->z( i )->addKill();
-                        spieler->z( i )->resetToGameTime( spielZeit, welt->getWorldInfo() );
-						spieler->z( i )->zTeam()->punkte++;
-						bestenliste->updateTeam( spieler->z( i )->zTeam() );
-						bestenliste->updateSpieler( spieler->z( i ) );
+						s->addKill();
+						s->zTeam()->punkte++;
+						bestenliste->updateTeam( s->zTeam() );
+						bestenliste->updateSpieler( s );
 					}
 				}
+                goToPresence();
 				if( sNum == spielerNummer )
 				{
 					for( int i = 0; i < spielerAnzahl; i++ )
@@ -840,10 +851,8 @@ bool SpielKlasse::tick( double zeit )
 		return 1;
 	}
 	rZeit += zeit;
-	double sZ = 0;
-	while( sZ + TICK < rZeit )
+	while( TICK < rZeit )
 	{
-		sZ += TICK;
 		rZeit -= TICK;
 		spielZeit++;
 		stknVerarbeitung();
@@ -856,7 +865,7 @@ bool SpielKlasse::tick( double zeit )
         int deadsCount = deads->getEintragAnzahl();
         for( int i = 0; i < deadsCount; i++ )
         {
-            if( deads->z( i )->tick( welt->getWorldInfo(), 0 ) )
+            if( deads->z( i )->isFinished() )
             {
                 welt->removeObject( deads->z( i ) );
                 deads->remove( i-- );
@@ -879,16 +888,16 @@ bool SpielKlasse::tick( double zeit )
 		unlock();
 		if( setKam )
 		{
-			float px = ( ( x - kam->getPosition().x ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
-            float py = ( ( y - kam->getPosition().y ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
-			if( abs( x - kam->getPosition().x ) > abs( x - ( kam->getPosition().x - map->getSize().x ) ) )
-				px = ( ( x - ( kam->getPosition().x - map->getSize().x ) ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
-			else if( abs( x - kam->getPosition().x ) > abs( x - ( kam->getPosition().x + map->getSize().x ) ) )
-				px = ( ( x - ( kam->getPosition().x + map->getSize().x ) ) / 100.0f ) * ( abs( ( x - kam->getPosition().x ) / 2 ) * (float)TICK );
-			if( abs( y - kam->getPosition().y ) > abs( y - ( kam->getPosition().y - map->getSize().y ) ) )
-				py = ( ( y - ( kam->getPosition().y - map->getSize().y ) ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
-			else if( abs( y - kam->getPosition().y ) > abs( y - ( kam->getPosition().y + map->getSize().y ) ) )
-				py = ( ( y - ( kam->getPosition().y + map->getSize().y ) ) / 100.0f ) * ( abs( ( y - kam->getPosition().y ) / 2 ) * (float)TICK );
+			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 ) );
 		}
 		chat->tick( !zeit ? 0.05 : zeit );

+ 3 - 0
Asteroids/Spiel/SpielKlasse.h

@@ -48,7 +48,10 @@ private:
 	char *tasten;
 	bool spielPause;
 	int ref;
+
 	bool istAmLeben() const;
+    void goBackInTime( int zeit );
+    void goToPresence();
 
 public:
 	// Konstruktor

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

@@ -43,14 +43,16 @@ bool DeadPlayer::tick( const WeltInfo &info, double zeit )
     m2b->tick( info, zeit );
     alpha -= zeit * 15;
     if( alpha < 0 )
-    {
         alpha = 0;
-        return 1;
-    }
-    return 0;
+    return 1;
 }
 
 Rect2< float > DeadPlayer::getBoundingBox() const
 {
     return Rect2< float >();
+}
+
+bool DeadPlayer::isFinished() const
+{
+    return alpha == 0;
 }

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

@@ -21,4 +21,5 @@ public:
     void render( Mat3< float > &kamMat, Bild &zRObj ) override;
     bool tick( const WeltInfo &info, double zeit ) override;
     Rect2< float > getBoundingBox() const override;
+    bool isFinished() const;
 };

+ 6 - 13
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -279,18 +279,14 @@ void Spieler::setSpielerFarbe( int fc, Bild *zTextur )
     setTextur( textur, "ship" );
 }
 
-void Spieler::setTastataturStatus( TastaturStatus ts, bool aktiv, int sZ, const WeltInfo &info )
+void Spieler::setTastataturStatus( TastaturStatus ts, bool aktiv )
 {
     if( !amLeben )
     {
         tastatur[ ts ] = aktiv;
         return;
     }
-    int z = sZ - spielZeit;
-    int time = spielZeit;
-    resetToSaveTime( sZ, info );
     tastatur[ ts ] = aktiv;
-    resetToGameTime( time, info );
     if( flammenM && flammenR && flammenL )
     {
         switch( ts )
@@ -331,6 +327,7 @@ bool Spieler::tick( const WeltInfo &info, double tv )
     flammenM->tick( tv );
     flammenL->tick( tv );
     flammenR->tick( tv );
+    spielZeit++;
     if( amLeben )
     {
         schussAbk -= tv;
@@ -342,7 +339,6 @@ bool Spieler::tick( const WeltInfo &info, double tv )
         repAbk -= tv;
         if( repAbk < 0 )
             repAbk = 0;
-        spielZeit++;
         if( tastatur[ T_GAS ] )
         {
             double treibstoff = 0.5 * ( ( beschleunigung + team->beschleunigung ) / 5 )
@@ -351,7 +347,7 @@ bool Spieler::tick( const WeltInfo &info, double tv )
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
-            impuls( stM, kM * (float)( beschleunigung + team->beschleunigung ) * factor );
+            impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)tv * (float)( beschleunigung + team->beschleunigung ) * factor );
             energie -= treibstoff * factor;
         }
         if( tastatur[ T_ROT_R ] )
@@ -362,7 +358,7 @@ bool Spieler::tick( const WeltInfo &info, double tv )
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
-            impuls( stL, kL * (float)( wendigkeit + team->wendigkeit ) * factor );
+            impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)tv * (float)( wendigkeit + team->wendigkeit ) * factor );
             energie -= treibstoff * factor;
         }
         if( tastatur[ T_ROT_L ] )
@@ -373,7 +369,7 @@ bool Spieler::tick( const WeltInfo &info, double tv )
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
-            impuls( stR, kR * (float)( wendigkeit + team->wendigkeit ) * factor );
+            impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)tv * (float)( wendigkeit + team->wendigkeit ) * factor );
             energie -= treibstoff * factor;
         }
         __super::tick( info, tv );
@@ -396,10 +392,7 @@ bool Spieler::tick( const WeltInfo &info, double tv )
         zeitAmLeben += tv;
     }
     else
-    {
         zeitTod += tv;
-        spielZeit++;
-    }
     return ret;
 }
 
@@ -602,7 +595,7 @@ void Spieler::wiederbelebung()
 void Spieler::resetToSaveTime( int t, const WeltInfo &info )
 {
     if( last.spielZeit > t )
-        return; // this should never be possible
+        throw std::exception( "Fehlerhafter zustand" ); // this should never be possible
     load();
     while( spielZeit < t )
         tick( info, 0 );

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

@@ -139,7 +139,7 @@ public:
 	void setAccountId( int accId );
 	void setTeam( Team *team );
 	void setSpielerFarbe( int fc, Bild *zTextur );
-	void setTastataturStatus( TastaturStatus ts, bool aktiv, int sZ, const WeltInfo &info );
+	void setTastataturStatus( TastaturStatus ts, bool aktiv );
 	bool tick( const WeltInfo &info, double zeit ) override;
 	void render( Mat3< float > &kamMat, Bild &zRObj ) override;
 	void renderLeben( const Mat3< float > &kamMat, Bild &zRObj );