Эх сурвалжийг харах

removed some rounding errors

Kolja Strohm 5 жил өмнө
parent
commit
7509ec1c19

+ 1 - 1
Asteroids/Spiel/Schuss/Laser.cpp

@@ -89,7 +89,7 @@ int Laser::getSpieler() const
     return sNum;
 }
 
-double Laser::getIntensität( Vec2< double > targetSpeed ) const
+double Laser::getIntensität( Vertex targetSpeed ) const
 {
     return intensität * ( ( speed - targetSpeed ).getLength() / 200 );
 }

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

@@ -39,7 +39,7 @@ public:
 	// constant
 	int getId() const;
 	int getSpieler() const;
-	double getIntensität( Vec2< double > targetSpeed ) const;
+	double getIntensität( Vertex targetSpeed ) const;
 	// Reference Counting
 	Laser *getThis();
 	Laser *release();

+ 180 - 7
Asteroids/Spiel/SpielKlasse.cpp

@@ -448,6 +448,10 @@ void SpielKlasse::stknVerarbeitung()
 		län--;
 		int sNum = 0;
         int presence = spielZeit;
+        Vertex pos;
+        Vertex speed;
+        float rot;
+        float rotS;
         if( presence > zeit + 10 )
             presence = zeit + 10; // maximale zeitdifferenz von client und server
 		switch( bytes[ 0 ] )
@@ -455,72 +459,240 @@ void SpielKlasse::stknVerarbeitung()
 		case 0: // spieler drückt gas
 			bytes++;
 			sNum = *(int*)bytes;
+            bytes += 4;
 			län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
 			for( auto i = spieler->getIterator(); i; i++ )
 			{
 				if( i->getSpielerNummer() == sNum )
-					i->setTastataturStatus( T_GAS, 1 );
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
+                    i->setTastataturStatus( T_GAS, 1 );
+                }
 			}
             goToPresence( presence );
 			break;
 		case 1: // spieler lässt gas los
 			bytes++;
 			sNum = *(int*)bytes;
-			län -= 4;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_GAS, 0 );
+                }
             }
             goToPresence( presence );
 			break;
 		case 2: // spieler drückt rotl
 			bytes++;
 			sNum = *(int*)bytes;
-			län -= 4;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_L, 1 );
+                }
             }
             goToPresence( presence );
 			break;
 		case 3: // spieler lässt rotl los
 			bytes++;
 			sNum = *(int*)bytes;
-			län -= 4;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_L, 0 );
+                }
             }
             goToPresence( presence );
 			break;
 		case 4: // spieler drückt rotr
 			bytes++;
 			sNum = *(int*)bytes;
-			län -= 4;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_R, 1 );
+                }
             }
             goToPresence( presence );
 			break;
 		case 5: // spieler lässt rotr los
 			bytes++;
 			sNum = *(int*)bytes;
-			län -= 4;
+            bytes += 4;
+            län -= 4;
+            pos.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            pos.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.x = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            speed.y = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rot = *(float*)bytes;
+            bytes += 4;
+            län -= 4;
+            rotS = *(float*)bytes;
+            län -= 4;
             goBackInTime( zeit );
             for( auto i = spieler->getIterator(); i; i++ )
             {
                 if( i->getSpielerNummer() == sNum )
+                {
+                    if( i->getPosition() != pos )
+                        chat->addNachricht( Text( "asynchrony detected, position difference: " ) += ( i->getPosition() - pos ).getLength(), 0xFFFF0000 );
+                    if( i->getSpeed() != speed )
+                        chat->addNachricht( Text( "asynchrony detected, speed difference: " ) += ( i->getSpeed() - speed ).getLength(), 0xFFFF0000 );
+                    if( i->getDrehung() != rot )
+                        chat->addNachricht( Text( "asynchrony detected, rot difference: " ) += ( i->getDrehung() - rot ), 0xFFFF0000 );
+                    if( i->getDrehungSpeed() != rotS )
+                        chat->addNachricht( Text( "asynchrony detected, rotS difference: " ) += ( i->getDrehungSpeed() - rotS ), 0xFFFF0000 );
                     i->setTastataturStatus( T_ROT_R, 0 );
+                }
             }
             goToPresence( presence );
 			break;
@@ -696,7 +868,7 @@ void SpielKlasse::stknVerarbeitung()
 					{
                         if( spieler->z( i )->getPosition() != Vertex( xPos, yPos ) )
                             chat->addNachricht( Text( "asynchrony detected difference: " ) += ( spieler->z( i )->getPosition() - Vertex( xPos, yPos ) ).getLength(), 0xFFFF0000 );
-						spieler->z( i )->setPosition( Vec2< double >( xPos, yPos ) );
+						spieler->z( i )->setPosition( Vertex( xPos, yPos ) );
 						spieler->z( i )->hatGeschossen();
 						farbe = spieler->z( i )->zTeam()->farbe;
 						break;
@@ -745,6 +917,7 @@ void SpielKlasse::stknVerarbeitung()
 								{
                                     intens = tmp->getIntensität( s->getSpeed() );
 									s->nimmSchaden( intens );
+                                    s->impuls( tmp->getPosition() - tmp->getSpeed(), tmp->getSpeed() * 0.3f );
                                     s->calcDeadPlayerObject( schüsse->z( i ) );
 									bestenliste->updateSpieler( s );
                                     break;

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

@@ -3,7 +3,7 @@
 #include <Textur2D.h>
 #include <Bild.h>
 
-DeadPlayer::DeadPlayer( Model2DData *mda, Model2DData *mdb, Punkt posa, Punkt posb, Vertex speedA, Vertex speedB, float curRotA, float curRotB, float rotA, float rotB, Textur2D *zTextur )
+DeadPlayer::DeadPlayer( Model2DData *mda, Model2DData *mdb, Vertex posa, Vertex posb, Vertex speedA, Vertex speedB, float curRotA, float curRotB, float rotA, float rotB, Textur2D *zTextur )
     : Object2D()
 {
     m2a = new Model2DObject();

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

@@ -12,7 +12,7 @@ private:
     double alpha;
 
 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( Model2DData *mda, Model2DData *mdb, Vertex posa, Vertex posb, Vertex speedA, Vertex speedB, float curRotA, float curRotB, float rotA, float rotB, Textur2D *zTextur );
     ~DeadPlayer();
     void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;
     bool tick( const WeltInfo &info, double zeit ) override;