Browse Source

Einiege Fehler behoben

Kolja Strohm 5 years ago
parent
commit
ae09361198

+ 12 - 4
Asteroids/Spiel/Schuss/Laser.cpp

@@ -5,7 +5,7 @@
 
 // Inhalt der Laser Klasse aus Laser.h
 // Konstruktor
-Laser::Laser( int id, Vec2< double > pos, Vec2< double > speed, int sNum, double intensität, int tf )
+Laser::Laser( int id, Vertex pos, Vertex speed, int sNum, double intensität, int tf )
     : Object2D()
 {
     this->id = id;
@@ -37,7 +37,14 @@ char Laser::getOutCode( Punkt& p, Bild &zrObj ) const
 // nicht constant
 Rect2< float > Laser::getBoundingBox() const
 {
-    return Rect2< float >();
+    Rect2< float > r = Rect2< float >();
+    r.topLeft.x = -abs( getSpeed().x );
+    r.topLeft.y = -abs( getSpeed().y );
+    r.bottomRight.x = abs( getSpeed().x );
+    r.bottomRight.y = abs( getSpeed().y );
+    r.topLeft = getWorldPos( r.topLeft );
+    r.bottomRight = getWorldPos( r.bottomRight );
+    return r;
 }
 
 bool Laser::tick( const WeltInfo &info, double tv )
@@ -51,8 +58,9 @@ 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 ) ) );
+    Mat3< float > mat = kamMat * getObjectMatrix();
+    Punkt a = (Punkt)( mat * Vertex( 0, 0 ) );
+    Punkt b = (Punkt)( mat * ( getSpeed() / getSpeed().getLength() * 10 ) );
     zRObj.drawLinieBorderedAlpha( a, b, f, 0xFFFFFFFF );
 }
 

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

@@ -29,7 +29,7 @@ private:
 
 public:
 	// Konstruktor
-	Laser( int id, Vec2< double > pos, Vec2< double > speed, int sNum, double intensität, int tf );
+	Laser( int id, Vertex pos, Vertex speed, int sNum, double intensität, int tf );
 	// nicht constant
     Rect2< float > getBoundingBox() const;
 	bool tick( const WeltInfo &info, double tv ) override;

+ 29 - 43
Asteroids/Spiel/SpielKlasse.cpp

@@ -13,7 +13,7 @@
 // Konstruktor
 SpielKlasse::SpielKlasse()
 {
-	spielZeit = 0;
+	spielZeit = -1;
 	rZeit = 0;
 	rendern = 0;
 	stkn = new RCArray< STKNachricht >();
@@ -256,7 +256,6 @@ void SpielKlasse::ladeDaten()
     for( int i = 0; i < map->getMaxSpielerAnzahl(); i++ )
     {
         Spieler *s = map->createSpieler( i, schrift, infoKlient, flammenStart, flammenBurn );
-        welt->addObject( s->getThis() );
         spieler->set( s, i );
     }
     flammenStart->release();
@@ -442,16 +441,15 @@ void SpielKlasse::stknVerarbeitung()
 	{
 		STKNachricht *n = stkn->z( i );
 		int zeit = n->getSpielZeit();
-        if( zeit > spielZeit )
-        {
-            chat->addNachricht( "Receved a message from the future.", 0xFFFF0000 );
-            break;
-        }
+        while( zeit > spielZeit )
+            tick();
 		int län = n->getLength();
 		char *bytes = n->getNachricht();
 		län--;
 		int sNum = 0;
         int presence = spielZeit;
+        if( presence > zeit + 10 )
+            presence = zeit + 10; // maximale zeitdifferenz von client und server
 		switch( bytes[ 0 ] )
 		{
 		case 0: // spieler drückt gas
@@ -459,7 +457,6 @@ 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 )
@@ -472,7 +469,6 @@ void SpielKlasse::stknVerarbeitung()
 			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 )
@@ -485,7 +481,6 @@ void SpielKlasse::stknVerarbeitung()
 			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 )
@@ -498,7 +493,6 @@ void SpielKlasse::stknVerarbeitung()
 			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 )
@@ -511,7 +505,6 @@ void SpielKlasse::stknVerarbeitung()
 			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 )
@@ -524,7 +517,6 @@ void SpielKlasse::stknVerarbeitung()
 			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 )
@@ -539,7 +531,6 @@ 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;
@@ -556,13 +547,13 @@ void SpielKlasse::stknVerarbeitung()
 					bestenliste->addSpieler( tmp );
 					bestenliste->updateSpieler( tmp );
 					bestenliste->updateTeam( tmp->zTeam() );
+                    welt->addObject( tmp->getThis() );
 				}
 				int max = map->getMaxSpielerAnzahl();
 				for( int i = 0; i < max; i++ )
 				{
 					if( !spieler->z( i )->zTeam() )
 					{
-                        welt->removeObject( spieler->z( i ) );
 						spieler->remove( i );
 						i--;
 						max--;
@@ -585,7 +576,6 @@ 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 )
@@ -598,7 +588,6 @@ 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 );
@@ -643,7 +632,6 @@ 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 )
@@ -679,41 +667,42 @@ void SpielKlasse::stknVerarbeitung()
 		case 0xD: // Schuss
 			if( 1 )
 			{
-				bytes++;
+ 				bytes++;
 				int id = *(int*)bytes;
 				bytes += 4;
 				län -= 4;
 				sNum = *(int*)bytes;
 				bytes += 4;
 				län -= 4;
-				double xPos = *(double*)bytes;
-				bytes += 8;
-				län -= 8;
-				double yPos = *(double*)bytes;
-				bytes += 8;
-				län -= 8;
-				double xSpeed = *(double*)bytes;
-				bytes += 8;
-				län -= 8;
-				double ySpeed = *(double*)bytes;
-				bytes += 8;
-				län -= 8;
+				float xPos = *(float*)bytes;
+				bytes += 4;
+				län -= 4;
+                float yPos = *(float*)bytes;
+				bytes += 4;
+				län -= 4;
+                float xSpeed = *(float*)bytes;
+				bytes += 4;
+				län -= 4;
+                float ySpeed = *(float*)bytes;
+				bytes += 4;
+				län -= 4;
 				double intensität = *(double*)bytes;
 				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 )
 					{
+                        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 )->hatGeschossen();
 						farbe = spieler->z( i )->zTeam()->farbe;
 						break;
 					}
 				}
-                Laser *l = new Laser( id, Vec2< double >( xPos, yPos ), Vec2< double >( xSpeed, ySpeed ), sNum, intensität, farbe );
+                Laser *l = new Laser( id, Vertex( xPos, yPos ), Vertex( xSpeed, ySpeed ), sNum, intensität, farbe );
                 welt->addObject( l->getThis() );
                 schüsse->add( l );
                 goToPresence( presence );
@@ -741,13 +730,12 @@ 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++ )
+                int sAnz = schüsse->getEintragAnzahl();
+				for( int i = 0; i < sAnz; i++ )
 				{
-					if( tmp->getId() == schuss )
+                    Laser *tmp = schüsse->z( i );
+					if( tmp && tmp->getId() == schuss )
 					{
-                        for( int i = 0; i < spielZeit - zeit; i++ )
-                            tmp->tick( welt->getWorldInfo(), -TICK );
 						if( sNum >= 0 )
 						{
                             double intens = 0;
@@ -798,7 +786,6 @@ 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 )
@@ -831,7 +818,6 @@ 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 )
@@ -896,12 +882,14 @@ bool SpielKlasse::tick( double zeit )
 		return 1;
 	}
 	rZeit += zeit;
-	while( TICK < rZeit )
+	while( TICK <= rZeit )
 	{
 		rZeit -= TICK;
         if( end )
             return 1;
 		lock();
+        if( spielZeit == -1 )
+            save(); // speichern
         // tote spieler
         int deadsCount = deads->getEintragAnzahl();
         for( int i = 0; i < deadsCount; i++ )
@@ -966,12 +954,10 @@ void SpielKlasse::render( Bild &zRObj )
     kam->lookAtWorldArea( zRObj.getBreite(), zRObj.getHeight() );
     kam->setSize( zRObj.getSize() );
     kam->render( 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 );
 	if( bestenliste )
 		bestenliste->render( zRObj );

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

@@ -11,15 +11,15 @@ DeadPlayer::DeadPlayer( Model2DData *mda, Model2DData *mdb, Punkt posa, Punkt po
     m2a->setPosition( posa );
     m2a->setTextur( zTextur->getThis() );
     m2a->setDrehung( curRotA );
+    m2a->setSpeed( speedA );
+    m2a->setDrehungSpeed( rotA );
     m2b = new Model2DObject();
     m2b->setModel( mdb );
     m2b->setPosition( posb );
     m2b->setTextur( zTextur->getThis() );
     m2b->setDrehung( curRotB );
-    this->speedA = speedA;
-    this->speedB = speedB;
-    this->rotA = rotA;
-    this->rotB = rotB;
+    m2b->setSpeed( speedB );
+    m2b->setDrehungSpeed( rotB );
     alpha = 255;
     setCollision( 0 );
 }

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

@@ -9,10 +9,6 @@ class DeadPlayer : public Object2D
 private:
     Model2DObject *m2a;
     Model2DObject *m2b;
-    Vertex speedA;
-    Vertex speedB;
-    float rotA;
-    float rotB;
     double alpha;
 
 public:

+ 7 - 10
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -27,7 +27,7 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift,
     maxReinkAbk = 5;
     ref = 1;
     startPos = zStr->pos;
-    setPosition( zStr->pos );
+    setPosition( startPos );
     setDrehung( (float)zStr->rot );
     beschleunigung = zStr->beschleunigung;
     beschleunigungStart = zStr->beschleunigung;
@@ -60,7 +60,6 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift,
     zeitTod = 0;
     nText = initTextFeld( 0, 0, 152, 30, zSchrift, TextFeld::Style::Text | TextFeld::Style::Rahmen | TextFeld::Style::Center |
                           TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha, "" );
-    spielZeit = 0;
     save();
 }
 
@@ -186,7 +185,7 @@ void Spieler::setSpielerFarbe( int fc, Bild *zTextur )
     {
         if( buffer[ i ] )
         {
-            shb->setPixelDP( i, ( buffer[ i ] & 0xFF000000 ) | ( fc & 0x00FFFFFF ) );
+            shb->setPixelDP( i, fc );
             shb->alphaPixelDP( i, buffer[ i ] );
         }
     }
@@ -234,8 +233,6 @@ bool Spieler::tick( const WeltInfo &info, double tv )
     bool ret = 0;
     if( !team )
         return 0;
-    if( !spielZeit )
-        save();
     tv = TICK;
     reinkAbk -= tv;
     if( reinkAbk < 0 )
@@ -243,7 +240,6 @@ bool Spieler::tick( const WeltInfo &info, double tv )
     flammenM->tick( tv );
     flammenL->tick( tv );
     flammenR->tick( tv );
-    spielZeit++;
     if( amLeben )
     {
         schussAbk -= tv;
@@ -448,8 +444,8 @@ void Spieler::calcDeadPlayerObject( Laser *zSchuss )
             return rand() / (double)RAND_MAX;
         } );
         hp = ( hp * getSize() ).rotation( getDrehung() ) + getPosition();
-        pa += getPosition();
-        pb += getPosition();
+        pa = pa.rotation( getDrehung() ) + getPosition();
+        pb = pb.rotation( getDrehung() ) + getPosition();
         Array< Polygon2D > *npaA = new Array< Polygon2D >();
         npaA->add( a );
         Model2DData *npdA = new Model2DData();
@@ -483,6 +479,7 @@ void Spieler::addKill()
 DeadPlayer *Spieler::sterben()
 {
     amLeben = 0;
+    setCollision( 0 );
     tode++;
     stabilität = 0;
     reinkAbk += maxReinkAbk;
@@ -509,6 +506,7 @@ void Spieler::wiederbelebung()
     flammenL->setAnimation( -1 );
     flammenR->setAnimation( -1 );
     amLeben = 1;
+    setCollision( 1 );
 }
 
 void Spieler::hatGeschossen()
@@ -532,7 +530,6 @@ void Spieler::save()
     last.repAbk = repAbk;
     last.reinkAbk = reinkAbk;
     last.maxReinkAbk = maxReinkAbk;
-    last.spielZeit = spielZeit;
     last.startPos = startPos;
     last.beschleunigung = beschleunigung;
     last.energie = energie;
@@ -569,12 +566,12 @@ void Spieler::load()
     setDrehung( last.rotation );
     farbe = last.farbe;
     amLeben = last.amLeben;
+    setCollision( 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;

+ 4 - 6
Asteroids/Spiel/Spieler/Spieler.h

@@ -45,8 +45,8 @@ private:
     struct SpielerDataSave
     {
         float rSpeed;
-        Vec2< double > pos;
-        Vec2< double > speed;
+        Vertex pos;
+        Vertex speed;
         float rotation;
         int farbe;
         bool amLeben;
@@ -55,8 +55,7 @@ private:
         double repAbk;
         double reinkAbk;
         int maxReinkAbk;
-        int spielZeit;
-        Punkt startPos;
+        Vertex startPos;
         double beschleunigung;
         double energie;
         double stabilität;
@@ -90,8 +89,7 @@ private:
     double repAbk;
     double reinkAbk;
     int maxReinkAbk;
-    int spielZeit;
-    Punkt startPos;
+    Vertex startPos;
     double beschleunigung;
     double energie;
     double stabilität;

+ 6 - 2
Asteroids/Spiel/SpielerGUI/SpielerGUI.cpp

@@ -257,8 +257,12 @@ int SpielerGUI::doMausEreignis( MausEreignis &me )
 {
 	me.mx -= ram->getX();
 	me.my -= ram->getY();
-	if( me.mx < 0 || me.my < 0 )
-		return -1;
+    if( me.mx < 0 || me.my < 0 )
+    {
+        me.mx += ram->getX();
+        me.my += ram->getY();
+        return -1;
+    }
 	int aktion = me.verarbeitet;
 	stabilitätSkill->doMausEreignis( me );
 	if( !aktion && me.verarbeitet && me.id == ME_RLinks )