Преглед изворни кода

Memory leak wegen reference kreis von spieler und team behoben

Kolja Strohm пре 5 година
родитељ
комит
eefb4062b5
2 измењених фајлова са 64 додато и 68 уклоњено
  1. 62 66
      Asteroids/Spiel/Spieler/Spieler.cpp
  2. 2 2
      Asteroids/Spiel/Spieler/Spieler.h

+ 62 - 66
Asteroids/Spiel/Spieler/Spieler.cpp

@@ -14,7 +14,7 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift,
     accountId = 0;
     sNum = zStr->id;
     farbe = 0;
-    team = 0;
+    zteam = 0;
     info = zInfoK->getThis();
     name = 0;
     for( int i = 0; i < T_MAX; i++ )
@@ -65,8 +65,6 @@ Spieler::Spieler( KSGClient::InformationServerClient *zInfoK, Schrift *zSchrift,
 Spieler::~Spieler()
 {
     info->release();
-    if( team )
-        team->release();
     if( name )
         name->release();
     flammenL->release();
@@ -79,9 +77,9 @@ Spieler::~Spieler()
 
 double Spieler::calculateLaserCost()
 {
-    double kosten = ( ( laserIntensität + team->laserIntensität ) / 2 +
-        ( laserTempo + team->laserTempo ) / 9 ) *
-                      ( 1 / ( ( laserEffizienz + team->laserEffizienz ) / 25 ) );
+    double kosten = ( ( laserIntensität + zteam->laserIntensität ) / 2 +
+        ( laserTempo + zteam->laserTempo ) / 9 ) *
+                      ( 1 / ( ( laserEffizienz + zteam->laserEffizienz ) / 25 ) );
     if( kosten < 1 )
         kosten = 1;
     return kosten;
@@ -167,13 +165,11 @@ void Spieler::setAccountId( int accId )
         nText->setText( *name );
 }
 
-void Spieler::setTeam( Team * team )
+void Spieler::setTeam( Team *zTeam )
 {
-    if( this->team )
-        this->team->release();
-    this->team = team;
-    nText->setHintergrundFarbe( 0xA0000000 | ( team->farbe & 0x00FFFFFF ) );
-    nText->setRahmenFarbe( team->farbe );
+    this->zteam = zTeam;
+    nText->setHintergrundFarbe( 0xA0000000 | ( zteam->farbe & 0x00FFFFFF ) );
+    nText->setRahmenFarbe( zteam->farbe );
 }
 
 void Spieler::setSpielerFarbe( int fc, Bild * zTextur )
@@ -234,7 +230,7 @@ void Spieler::setTastataturStatus( TastaturStatus ts, bool aktiv )
 bool Spieler::tick( const WeltInfo & info, double tv )
 {
     bool ret = 0;
-    if( !team )
+    if( !zteam )
         return 0;
     tv = TICK;
     reinkAbk -= tv;
@@ -256,56 +252,56 @@ bool Spieler::tick( const WeltInfo & info, double tv )
             repAbk = 0;
         if( tastatur[ T_GAS ] )
         {
-            double treibstoff = 0.5 * ( ( beschleunigung + team->beschleunigung ) / 15 )
-                * tv * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
+            double treibstoff = 0.5 * ( ( beschleunigung + zteam->beschleunigung ) / 15 )
+                * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
             treibstoffVerbraucht += treibstoff;
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
             if( factor > 0 )
-                impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)tv * (float)( beschleunigung + team->beschleunigung ) * factor );
+                impuls( getWorldPos( stM ), getWorldDir( kM ) * (float)tv * (float)( beschleunigung + zteam->beschleunigung ) * factor );
             energie -= treibstoff * factor;
         }
         if( tastatur[ T_ROT_R ] )
         {
-            double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 15 )
-                * tv * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
+            double treibstoff = 0.25 * ( ( wendigkeit + zteam->wendigkeit ) / 15 )
+                * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
             treibstoffVerbraucht += treibstoff;
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
             if( factor > 0 )
-                impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)tv * (float)( wendigkeit + team->wendigkeit ) * factor );
+                impuls( getWorldPos( stL ), getWorldDir( kL ) * (float)tv * (float)( wendigkeit + zteam->wendigkeit ) * factor );
             energie -= treibstoff * factor;
         }
         if( tastatur[ T_ROT_L ] )
         {
-            double treibstoff = 0.25 * ( ( wendigkeit + team->wendigkeit ) / 15 )
-                * tv * ( 100 / ( antriebEffizienz + team->antriebEffizienz ) );
+            double treibstoff = 0.25 * ( ( wendigkeit + zteam->wendigkeit ) / 15 )
+                * tv * ( 100 / ( antriebEffizienz + zteam->antriebEffizienz ) );
             treibstoffVerbraucht += treibstoff;
             float factor = 1;
             if( treibstoff > energie )
                 factor = (float)( energie / treibstoff );
             if( factor > 0 )
-                impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)tv * (float)( wendigkeit + team->wendigkeit ) * factor );
+                impuls( getWorldPos( stR ), getWorldDir( kR ) * (float)tv * (float)( wendigkeit + zteam->wendigkeit ) * factor );
             energie -= treibstoff * factor;
         }
         __super::tick( info, tv );
         if( !energieAbk )
         {
-            if( energie != ( maxEnergie + team->maxEnergie ) )
+            if( energie != ( maxEnergie + zteam->maxEnergie ) )
                 ret = 1;
-            energie += ( akkuLeistung + team->akkuLeistung ) * tv;
-            if( energie > ( maxEnergie + team->maxEnergie ) )
-                energie = ( maxEnergie + team->maxEnergie );
+            energie += ( akkuLeistung + zteam->akkuLeistung ) * tv;
+            if( energie > ( maxEnergie + zteam->maxEnergie ) )
+                energie = ( maxEnergie + zteam->maxEnergie );
         }
         if( !repAbk )
         {
-            if( stabilität != ( maxStabilität + team->maxStabilität ) )
+            if( stabilität != ( maxStabilität + zteam->maxStabilität ) )
                 ret = 1;
-            stabilität += ( reparatur + team->reparatur ) * tv;
-            if( stabilität > ( maxStabilität + team->maxStabilität ) )
-                stabilität = ( maxStabilität + team->maxStabilität );
+            stabilität += ( reparatur + zteam->reparatur ) * tv;
+            if( stabilität > ( maxStabilität + zteam->maxStabilität ) )
+                stabilität = ( maxStabilität + zteam->maxStabilität );
         }
         zeitAmLeben += tv;
     }
@@ -326,21 +322,21 @@ void Spieler::render( Mat3< float > & kamMat, Bild & zRObj, const char *kamName
 
 void Spieler::renderLeben( const Mat3< float > & kamMat, Bild & zRObj )
 {
-    if( !team || !amLeben )
+    if( !zteam || !amLeben )
         return;
     nText->setPosition( (Punkt)( kamMat * getPosition() - Vertex( 76, ( zModel()->maxP.y * getSize() ) + 30 ) ) );
     nText->render( zRObj );
-    zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, team->farbe );
-    zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, team->farbe );
-    int l = (int)( stabilität * 100 / ( maxStabilität + team->maxStabilität ) * 1.5 + 0.5 );
+    zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 4, 150, zteam->farbe );
+    zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 25, 150, zteam->farbe );
+    int l = (int)( stabilität * 100 / ( maxStabilität + zteam->maxStabilität ) * 1.5 + 0.5 );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 1, l, 0xFF00FF00 );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 2, l, 0xFF00FF00 );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 3, l, 0xFF00FF00 );
-    int e = (int)( energie * 100 / ( maxEnergie + team->maxEnergie ) * 1.5 + 0.5 );
+    int e = (int)( energie * 100 / ( maxEnergie + zteam->maxEnergie ) * 1.5 + 0.5 );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 26, e, 0xFF0000FF );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 27, e, 0xFF0000FF );
     zRObj.drawLinieH( nText->getX() + 1, nText->getY() + 28, e, 0xFF0000FF );
-    int e2 = (int)( ( energie - calculateLaserCost() ) * 100 / ( maxEnergie + team->maxEnergie ) * 1.5 + 0.5 );
+    int e2 = (int)( ( energie - calculateLaserCost() ) * 100 / ( maxEnergie + zteam->maxEnergie ) * 1.5 + 0.5 );
     if( e2 > 0 )
     {
         zRObj.drawLinieV( nText->getX() + e2, nText->getY() + 26, 3, 0xFFFFFFFF );
@@ -356,78 +352,78 @@ void Spieler::setSkill( int art )
     case 0: // Max Stabilität
         maxStabilität += 10;
         stabilität += 10;
-        team->maxStabilität = team->getMaxStabilitätBonus();
+        zteam->maxStabilität = zteam->getMaxStabilitätBonus();
         break;
     case 1: // Max Energie
         maxEnergie += 10;
-        team->maxEnergie = team->getMaxEnergieBonus();
+        zteam->maxEnergie = zteam->getMaxEnergieBonus();
         break;
     case 2: // Reparatur
         reparatur += 0.15;
-        team->reparatur = team->getReperaturBonus();
+        zteam->reparatur = zteam->getReperaturBonus();
         break;
     case 3: // Laser Intensität
         laserIntensität += 4;
-        team->laserIntensität = team->getLaserIntensitätBonus();
+        zteam->laserIntensität = zteam->getLaserIntensitätBonus();
         break;
     case 4: // Laser Effizienz
         laserEffizienz += 1.5;
-        team->laserEffizienz = team->getLaserEffizienzBonus();
+        zteam->laserEffizienz = zteam->getLaserEffizienzBonus();
         break;
     case 5: // Laser Tempo
         laserTempo += 15;
-        team->laserTempo = team->getLaserTempoBonus();
+        zteam->laserTempo = zteam->getLaserTempoBonus();
         break;
     case 6: // Beschleunigung
         beschleunigung += 10;
-        team->beschleunigung = team->getBeschleunigungBonus();
+        zteam->beschleunigung = zteam->getBeschleunigungBonus();
         break;
     case 7: // Wendigkeit
         wendigkeit += 2.5;
-        team->wendigkeit = team->getWendigkeitBonus();
+        zteam->wendigkeit = zteam->getWendigkeitBonus();
         break;
     case 8: // Netzwerk
         netzwerk += 1;
-        team->maxStabilität = team->getMaxStabilitätBonus();
-        team->maxEnergie = team->getMaxEnergieBonus();
-        team->reparatur = team->getReperaturBonus();
-        team->laserIntensität = team->getLaserIntensitätBonus();
-        team->laserEffizienz = team->getLaserEffizienzBonus();
-        team->laserTempo = team->getLaserTempoBonus();
-        team->beschleunigung = team->getBeschleunigungBonus();
-        team->wendigkeit = team->getWendigkeitBonus();
-        team->akkuLeistung = team->getAkkuLeistungBonus();
-        team->antriebEffizienz = team->getAntriebEffizienzBonus();
-        team->energieSchild = team->getEnergieSchildBonus();
-        team->energieSchildEffizienz = team->getEnergieSchildEffizienzBonus();
+        zteam->maxStabilität = zteam->getMaxStabilitätBonus();
+        zteam->maxEnergie = zteam->getMaxEnergieBonus();
+        zteam->reparatur = zteam->getReperaturBonus();
+        zteam->laserIntensität = zteam->getLaserIntensitätBonus();
+        zteam->laserEffizienz = zteam->getLaserEffizienzBonus();
+        zteam->laserTempo = zteam->getLaserTempoBonus();
+        zteam->beschleunigung = zteam->getBeschleunigungBonus();
+        zteam->wendigkeit = zteam->getWendigkeitBonus();
+        zteam->akkuLeistung = zteam->getAkkuLeistungBonus();
+        zteam->antriebEffizienz = zteam->getAntriebEffizienzBonus();
+        zteam->energieSchild = zteam->getEnergieSchildBonus();
+        zteam->energieSchildEffizienz = zteam->getEnergieSchildEffizienzBonus();
         break;
     case 9: // Akkuleistung
         akkuLeistung += 0.12;
-        team->akkuLeistung = team->getAkkuLeistungBonus();
+        zteam->akkuLeistung = zteam->getAkkuLeistungBonus();
         break;
     case 10: // Antrieb Effizienz
         antriebEffizienz += 10;
-        team->antriebEffizienz = team->getAntriebEffizienzBonus();
+        zteam->antriebEffizienz = zteam->getAntriebEffizienzBonus();
         break;
     case 11: // Energie Schild
         energieSchild += 0.075;
-        team->energieSchild = team->getEnergieSchildBonus();
+        zteam->energieSchild = zteam->getEnergieSchildBonus();
         break;
     case 12: // Energie Schild Effizienz
         energieSchildEffizienz += 10;
-        team->energieSchildEffizienz = team->getEnergieSchildEffizienzBonus();
+        zteam->energieSchildEffizienz = zteam->getEnergieSchildEffizienzBonus();
         break;
     }
 }
 
 void Spieler::nimmSchaden( double &intensität )
 {
-    double schieldVal = intensität - intensität / ( energieSchild + team->energieSchild );
-    double schieldEVal = schieldVal / ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
+    double schieldVal = intensität - intensität / ( energieSchild + zteam->energieSchild );
+    double schieldEVal = schieldVal / ( ( energieSchildEffizienz + zteam->energieSchildEffizienz ) / 100 );
     if( schieldEVal > energie )
     {
         schieldEVal = energie;
-        schieldVal = schieldEVal * ( ( energieSchildEffizienz + team->energieSchildEffizienz ) / 100 );
+        schieldVal = schieldEVal * ( ( energieSchildEffizienz + zteam->energieSchildEffizienz ) / 100 );
     }
     intensität -= schieldVal;
     energie -= schieldEVal;
@@ -499,8 +495,8 @@ void Spieler::wiederbelebung()
 {
     setPosition( startPos );
     reinkAbk = maxReinkAbk * 2;
-    energie = maxEnergie + team->maxEnergie;
-    stabilität = maxStabilität + team->maxStabilität;
+    energie = maxEnergie + zteam->maxEnergie;
+    stabilität = maxStabilität + zteam->maxStabilität;
     schussAbk = 0;
     energieAbk = 0;
     repAbk = 0;
@@ -668,7 +664,7 @@ int Spieler::getSpielerNummer() const
 
 Team *Spieler::zTeam() const
 {
-    return team;
+    return zteam;
 }
 
 int Spieler::getSpielerFarbe() const

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

@@ -30,7 +30,7 @@ private:
     int accountId;
     int sNum;
     bool tastatur[ T_MAX ];
-    Team *team;
+    Team *zteam;
     KSGClient::InformationServerClient *info;
     Text *name;
     Vertex stL;
@@ -132,7 +132,7 @@ public:
 	// nicht constant
 	void setModelData( Model2DData *data, Animation2DData *zFStart, Animation2DData *zFBurn );
 	void setAccountId( int accId );
-	void setTeam( Team *team );
+	void setTeam( Team *zTeam );
 	void setSpielerFarbe( int fc, Bild *zTextur );
 	void setTastataturStatus( TastaturStatus ts, bool aktiv );
 	bool tick( const WeltInfo &info, double zeit ) override;