Browse Source

Explusions und sterbe annimationen hinzugefügt

Kolja Strohm 4 years ago
parent
commit
a4a2e4f3c9

+ 33 - 0
StickmanWorldOnline/SingleAnnimation.cpp

@@ -0,0 +1,33 @@
+#include "SingleAnnimation.h"
+
+
+SingleAnimation::SingleAnimation( float x, float y, float width, float height, Resource *resource )
+    : GameObject( NICHTS, (int)x, (int)y, (int)width, (int)height )
+{
+    this->resource = resource;
+    currentImage = 0;
+    nextImage = 0.075;
+    texturScale = 1;
+    textur = resource->getImage( currentImage );
+}
+
+SingleAnimation::~SingleAnimation()
+{
+    resource->release();
+}
+
+// gibt 1 zurück wenn die annimation vorbei ist
+bool SingleAnimation::tick( double zeit )
+{
+    nextImage -= zeit;
+    if( nextImage <= 0 )
+    {
+        nextImage += 0.075;
+        currentImage++;
+        if( currentImage >= resource->getImageCount() )
+            return 1;
+        textur->release();
+        textur = resource->getImage( currentImage );
+    }
+    return 0;
+}

+ 18 - 0
StickmanWorldOnline/SingleAnnimation.h

@@ -0,0 +1,18 @@
+#pragma once
+
+#include "GameObject.h"
+#include "Resource.h"
+
+class SingleAnimation : public GameObject
+{
+private:
+    Resource *resource;
+    int currentImage;
+    double nextImage;
+
+public:
+    SingleAnimation( float x, float y, float width, float height, Resource *resource );
+    ~SingleAnimation();
+    // gibt 1 zurück wenn die annimation vorbei ist
+    bool tick( double zeit );
+};

+ 17 - 0
StickmanWorldOnline/Spiel.cpp

@@ -218,6 +218,11 @@ void Spiel::tick()
             }
         }
     }
+    for( int i = 0; i < animations.getEintragAnzahl(); i++ )
+    {
+        if( animations.z( i )->tick( zeit ) )
+            animations.remove( i-- );
+    }
     // gegenstand despawn
     for( int i = 0; i < items.getEintragAnzahl(); i++ )
     {
@@ -305,6 +310,7 @@ void Spiel::tick()
                         s->addGetroffen();
                     }
                 }
+                addAnimation( new SingleAnimation( g->getX() + g->getWidth() / 2 - 50, g->getY() + g->getHeight() / 2 - 50, 100, 100, resources->getResource( R_EXPLOSION, 0 ) ) );
                 shots.remove( i );
                 i--;
                 removed = 1;
@@ -370,6 +376,7 @@ void Spiel::tick()
                         Geschoss *g2 = shots.z( j );
                         if( g2->intersectsWith( g ) )
                         {
+                            addAnimation( new SingleAnimation( g->getX() + g->getWidth() / 2 - 20, g->getY() + g->getHeight() / 2 - 20, 40, 40, resources->getResource( R_EXPLOSION, 0 ) ) );
                             if( g2->getTyp() == GESCHOSS_PFEIL )
                                 removed = 1;
                             g->addGeschossTreffer( this );
@@ -401,16 +408,19 @@ void Spiel::tick()
                             }
                             case GESCHOSS_KUGEL:
                             {
+                                addAnimation( new SingleAnimation( g->getX() + g->getWidth() / 2 - 25, g->getY() + g->getHeight() / 2 - 25, 50, 50, resources->getResource( R_EXPLOSION, 0 ) ) );
                                 s->nimmSchaden( KUGEL_DAMAGE, g->zBesitzer(), invert( g->getRichtung() ), this );
                                 break;
                             }
                             case GESCHOSS_DRACHENAUGE:
+                                addAnimation( new SingleAnimation( g->getX() + g->getWidth() / 2 - 25, g->getY() + g->getHeight() / 2 - 25, 50, 50, resources->getResource( R_EXPLOSION, 0 ) ) );
                                 s->addEffekt( new DrachenAugeEffect( g->zBesitzer(), s._ ) );
                                 break;
                             case GESCHOSS_FEUERBALL:
                                 feuer.add( new FeuerballTreffer( resources, ++nextId, (int)g->getX() - (int)g->getWidth() / 2, (int)g->getY() - (int)g->getHeight() / 2, g->getBesitzer(), 10 ) );
                                 break;
                             case GESCHOSS_MINE:
+                                addAnimation( new SingleAnimation( g->getX() + g->getWidth() / 2 - 50, g->getY() + g->getHeight() / 2 - 50, 100, 100, resources->getResource( R_EXPLOSION, 0 ) ) );
                                 for( auto s2 = spieler.getIterator(); s2; s2++ )
                                 {
                                     if( s2->abstandZu( g ) < 50 )
@@ -868,6 +878,8 @@ void Spiel::render( Bild &zRObj )
         }
         for( auto s = shots.getIterator(); s; s++ )
             s->render( zRObj );
+        for( auto a = animations.getIterator(); a; a++ )
+            a->render( zRObj );
         // TODO: render timer
         zRObj.releaseDrawOptions();
     }
@@ -1706,6 +1718,11 @@ ResourceRegistry *Spiel::zResources() const
     return resources;
 }
 
+void Spiel::addAnimation( SingleAnimation *animation )
+{
+    animations.add( animation );
+}
+
 int Spiel::läuft() const
 {
     if( !begonnen )

+ 3 - 0
StickmanWorldOnline/Spiel.h

@@ -22,6 +22,7 @@
 #include "Brand.h"
 #include "Resource.h"
 #include "SpielerGUI.h"
+#include "SingleAnnimation.h"
 
 class Spiel : public SpielV
 {
@@ -52,6 +53,7 @@ private:
     RCArray< Umlenkung > umlenkungen;
     RCArray< Trigger > trigger;
     RCArray< TriggerRun > triggerRuns;
+    RCArray< SingleAnimation > animations;
     Punkt mapSize;
     Team *zWinner;
     Critical c;
@@ -244,6 +246,7 @@ public:
     void setUmlenkungZuletztBenutzt( Umlenkung *t );
     Umlenkung *getUmlenkungZuletztBenutzt() const;
     ResourceRegistry *zResources() const;
+    void addAnimation( SingleAnimation *animation );
     // constant
     int läuft() const override;
     // Reference Counting

+ 1 - 0
StickmanWorldOnline/Spieler.cpp

@@ -767,6 +767,7 @@ void Spieler::nimmSchaden( float schaden, Spieler *zVerursacher, Richtung r, Spi
         zSpiel->setSpielerZuletztGestorben( (Spieler *)getThis() );
         if( zVerursacher )
             zVerursacher->addKill();
+        zSpiel->addAnimation( new SingleAnimation( getX(), getY(), getWidth(), getHeight(), resources->getResource( R_SPIELER_STIRBT, color ) ) );
         Ereignis *e = new Ereignis( SPIELER_STIRBT );
         e->addParameter( "Betroffener Spieler", getThis() );
         zSpiel->throwEvent( e );

+ 2 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj

@@ -45,6 +45,7 @@
     <ClCompile Include="Schiene.cpp" />
     <ClCompile Include="Schild.cpp" />
     <ClCompile Include="Schuh.cpp" />
+    <ClCompile Include="SingleAnnimation.cpp" />
     <ClCompile Include="Spiel.cpp" />
     <ClCompile Include="SpielChat.cpp" />
     <ClCompile Include="Spieler.cpp" />
@@ -97,6 +98,7 @@
     <ClInclude Include="Schiene.h" />
     <ClInclude Include="Schild.h" />
     <ClInclude Include="Schuh.h" />
+    <ClInclude Include="SingleAnnimation.h" />
     <ClInclude Include="SpielChat.h" />
     <ClInclude Include="Spiel.h" />
     <ClInclude Include="Spieler.h" />

+ 6 - 0
StickmanWorldOnline/StickmanWorldOnline.vcxproj.filters

@@ -155,6 +155,9 @@
     <ClCompile Include="SpielStatistik.cpp">
       <Filter>Statistik</Filter>
     </ClCompile>
+    <ClCompile Include="SingleAnnimation.cpp">
+      <Filter>Spiel\Objekte</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Aufzeichnung.h">
@@ -308,5 +311,8 @@
     <ClInclude Include="SpielerGUI.h">
       <Filter>Spiel</Filter>
     </ClInclude>
+    <ClInclude Include="SingleAnnimation.h">
+      <Filter>Spiel\Objekte</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>