ソースを参照

Aktive Effekte werden angezeigt

Kolja Strohm 4 年 前
コミット
7c064f2051

+ 1 - 0
StickmanWorldOnline/BosheitRune.cpp

@@ -8,6 +8,7 @@ BosheitRuneEffect::BosheitRuneEffect( ResourceRegistry *zResources, Spieler *zSp
     zSpieler->setSchadenBonus( zSpieler->getSchadenBonus() + 7 );
     zSpieler->setLebensRaub( zSpieler->getLebensRaub() + 3 );
     annimation = zResources->getResource( R_RBOSHEIT_EFFECT, 0 );
+    effectImage = zResources->zResource( R_RBOSHEIT, 0 )->getImage( 0 );
     currentImage = 0;
     nextImage = 0.075;
 }

+ 2 - 1
StickmanWorldOnline/DrachenAuge.cpp

@@ -2,12 +2,13 @@
 #include "Spieler.h"
 
 
-DrachenAugeEffect::DrachenAugeEffect( Spieler *zVerursacher, Spieler *zOpfer )
+DrachenAugeEffect::DrachenAugeEffect( ResourceRegistry *zResources, Spieler *zVerursacher, Spieler *zOpfer )
     : Effect( zOpfer, DA_DURATION )
 {
     this->zVerursacher = zVerursacher;
     laufTempoDecrease = DA_MOVEMENT_DECREASE <= zSpieler->getLaufTempo() ? DA_MOVEMENT_DECREASE : zSpieler->getLaufTempo();
     zSpieler->setLaufTempo( zSpieler->getLaufTempo() - laufTempoDecrease );
+    effectImage = zResources->zResource( R_DRACHENAUGE, 0 )->getImage( 0 );
 }
 
 DrachenAugeEffect::~DrachenAugeEffect()

+ 1 - 1
StickmanWorldOnline/DrachenAuge.h

@@ -14,7 +14,7 @@ private:
     float laufTempoDecrease;
 
 public:
-    DrachenAugeEffect( Spieler *zVerursacher, Spieler *zOpfer );
+    DrachenAugeEffect( ResourceRegistry *zResources, Spieler *zVerursacher, Spieler *zOpfer );
     ~DrachenAugeEffect();
     bool tick( double time, Spiel *zSpiel ) override;
 };

+ 17 - 1
StickmanWorldOnline/Effect.cpp

@@ -5,11 +5,15 @@ Effect::Effect( Spieler *zSpieler, float maxTime )
 {
     this->zSpieler = zSpieler;
     timeLeft = maxTime;
+    effectImage = 0;
     ref = 1;
 }
 
 Effect::~Effect()
-{}
+{
+    if( effectImage )
+        effectImage->release();
+}
 
 bool Effect::tick( double time, Spiel *zSpiel )
 {
@@ -48,6 +52,18 @@ bool Effect::istGegenstandErlaubt( GegenstandTyp typ ) const
 void Effect::renderSpieler( Bild &rObj )
 {}
 
+bool Effect::renderEffect( int x, int y, int width, int height, Bild & rObj, Schrift * zSchrift )
+{
+    if( !effectImage )
+        return 0;
+    rObj.drawBildSkall( x, y, width, height, *effectImage );
+    TextRenderer tr;
+    tr.setSchriftZ( zSchrift->getThis() );
+    tr.setSchriftSize( 12 );
+    tr.renderText( x + 5, y + 5, Text( (int)(timeLeft * 100) / 100.0 ), rObj, 0xFFFFFFFF );
+    return 1;
+}
+
 Resource *Effect::getCurrentResource()
 {
     return 0;

+ 2 - 0
StickmanWorldOnline/Effect.h

@@ -10,6 +10,7 @@ class Effect
 {
 protected:
     Spieler *zSpieler;
+    Bild *effectImage;
     float timeLeft;
     int ref;
 
@@ -24,6 +25,7 @@ public:
     virtual void move( Richtung r, double time );
     virtual bool istGegenstandErlaubt( GegenstandTyp typ ) const;
     virtual void renderSpieler( Bild &rObj );
+    virtual bool renderEffect( int x, int y, int width, int height, Bild &rObj, Schrift *zSchrift );
     virtual Resource *getCurrentResource();
     Effect *getThis();
     Effect *release();

+ 1 - 0
StickmanWorldOnline/Geist.cpp

@@ -5,6 +5,7 @@ GeistEffect::GeistEffect( ResourceRegistry *zResources, Spieler *zSpieler )
     : Effect( zSpieler, 5.f + ( 5.f / 100.f ) * zSpieler->getAbklingZeitVerringerung() )
 {
     bild = zResources->zResource( R_GEIST, 0 )->getImage( 0 );
+    effectImage = zResources->zResource( R_GEIST, 0 )->getImage( 0 );
 }
 
 GeistEffect::~GeistEffect()

+ 2 - 1
StickmanWorldOnline/Leben.cpp

@@ -1,10 +1,11 @@
 #include "Leben.h"
 #include "Spieler.h"
 
-LebenEffect::LebenEffect( Spieler *zSpieler )
+LebenEffect::LebenEffect( ResourceRegistry *zResources, Spieler *zSpieler )
     : Effect( zSpieler, 10.f + ( 10.f / 100.f ) * zSpieler->getAbklingZeitVerringerung() )
 {
     zSpieler->setLebensRegeneration( zSpieler->getLebensRegenneration() + 10 );
+    effectImage = zResources->zResource( R_LEBEN, 0 )->getImage( 0 );
 }
 
 LebenEffect::~LebenEffect()

+ 1 - 1
StickmanWorldOnline/Leben.h

@@ -7,6 +7,6 @@ class LebenEffect : public Effect
 private:
 
 public:
-    LebenEffect( Spieler *zSpieler );
+    LebenEffect( ResourceRegistry *zResources, Spieler *zSpieler );
     ~LebenEffect();
 };

+ 1 - 0
StickmanWorldOnline/LebenRune.cpp

@@ -7,6 +7,7 @@ LebenRuneEffect::LebenRuneEffect( ResourceRegistry *zResources, Spieler *zSpiele
 {
     zSpieler->setLebensRegeneration( zSpieler->getLebensRegenneration() + 10 );
     annimation = zResources->getResource( R_RLEBEN_EFFECT, 0 );
+    effectImage = zResources->zResource( R_LEBEN, 0 )->getImage( 0 );
     currentImage = 0;
     nextImage = 0.075;
 }

+ 1 - 0
StickmanWorldOnline/Rolle.cpp

@@ -14,6 +14,7 @@ RolleEffect::RolleEffect( ResourceRegistry *zResources, Spieler *zSpieler, Richt
         annimation = zResources->getResource( R_ROLLE_OBEN, zSpieler->getFarbe() );
     if( r == UNTEN )
         annimation = zResources->getResource( R_ROLLE_UNTEN, zSpieler->getFarbe() );
+    effectImage = zResources->zResource( R_ROLLE, 0 )->getImage( 0 );
 }
 
 RolleEffect::~RolleEffect()

+ 1 - 0
StickmanWorldOnline/Schild.cpp

@@ -6,6 +6,7 @@ SchildEffect::SchildEffect( ResourceRegistry *zResources, Spieler *zSpieler )
     : Effect( zSpieler, 5.f + ( 5.f / 100.f ) * zSpieler->getAbklingZeitVerringerung() )
 {
     bild = zResources->zResource( R_SCHILD, 0 )->getImage( 0 );
+    effectImage = zResources->zResource( R_SCHILD, 0 )->getImage( 0 );
 }
 
 SchildEffect::~SchildEffect()

+ 1 - 0
StickmanWorldOnline/Schuh.cpp

@@ -7,6 +7,7 @@ SchuhEffect::SchuhEffect( ResourceRegistry *zResources, Spieler *zSpieler )
     speedup = 15;
     zSpieler->setLaufTempo( zSpieler->getLaufTempo() + speedup );
     bild = zResources->zResource( R_SCHUH, 0 )->getImage( 0 );
+    effectImage = zResources->zResource( R_SCHUH, 0 )->getImage( 0 );
 }
 
 SchuhEffect::~SchuhEffect()

+ 1 - 1
StickmanWorldOnline/Spiel.cpp

@@ -414,7 +414,7 @@ void Spiel::tick()
                             }
                             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._ ) );
+                                s->addEffekt( new DrachenAugeEffect( resources, 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 ) );

+ 6 - 1
StickmanWorldOnline/Spieler.cpp

@@ -606,7 +606,7 @@ void Spieler::useItem( Spiel *zSpiel )
             zSpiel->addGeschoss( new Geschoss( zSpiel->zResources(), zSpiel->getNextId(), geschossTempo, GESCHOSS_PFEIL, getAusrichtung(), (int)x + (int)getWidth() / 2, (int)y + (int)getHeight() / 2, (Spieler *)getThis() ) );
             break;
         case LEBEN:
-            addEffekt( new LebenEffect( this ) );
+            addEffekt( new LebenEffect( zSpiel->zResources(), this ) );
             break;
         case SCHILD:
             addEffekt( new SchildEffect( zSpiel->zResources(), this ) );
@@ -1110,6 +1110,11 @@ const Inventar &Spieler::getInventory() const
     return inv;
 }
 
+Iterator<Effect *> Spieler::getEffects() const
+{
+    return effekte.getIterator();
+}
+
 
 bool DeadPlayer::isFinished() const
 {

+ 1 - 0
StickmanWorldOnline/Spieler.h

@@ -175,6 +175,7 @@ public:
     GegenstandTyp getInventorySlot( int index ) const;
     const char *getName() const;
     const Inventar &getInventory() const;
+    Iterator< Effect * > getEffects() const;
 };
 
 class DeadPlayer : public GameObject

+ 14 - 0
StickmanWorldOnline/SpielerGUI.cpp

@@ -128,4 +128,18 @@ void SpielerGUI::render( Bild &rObj )
         "Abklingzeitverringerung: " + (int)spieler->getAbklingZeitVerringerung();
     spielerInfo->setText( info );
     spielerInfo->render( rObj );
+    int x = spielerInfo->getX();
+    int y = spielerInfo->getY() + spielerInfo->getHeight() + 5;
+    for( auto e = spieler->getEffects(); e; e++ )
+    {
+        if( e->renderEffect( x, y, 50, 50, rObj, schrift ) )
+        {
+            x += 55;
+            if( x >= 245 )
+            {
+                x = 5;
+                y += 55;
+            }
+        }
+    }
 }

+ 1 - 0
StickmanWorldOnline/StrengthRune.cpp

@@ -8,6 +8,7 @@ StrengthRuneEffect::StrengthRuneEffect( ResourceRegistry *zResources, Spieler *z
     zSpieler->setArmor( zSpieler->getArmor() + 7 );
     zSpieler->setSchadenBonus( zSpieler->getSchadenBonus() + 3 );
     annimation = zResources->getResource( R_RSTRENGTH_EFFECT, 0 );
+    effectImage = zResources->zResource( R_RSTRENGTH, 0 )->getImage( 0 );
     currentImage = 0;
     nextImage = 0.075;
 }

+ 1 - 0
StickmanWorldOnline/Sturm.cpp

@@ -15,6 +15,7 @@ SturmEffect::SturmEffect( ResourceRegistry *zResources, Spieler *zSpieler, Richt
         annimation = zResources->getResource( R_STURM_OBEN, zSpieler->getFarbe() );
     if( r == UNTEN )
         annimation = zResources->getResource( R_STURM_UNTEN, zSpieler->getFarbe() );
+    effectImage = zResources->zResource( R_STURM, 0 )->getImage( 0 );
 }
 
 SturmEffect::~SturmEffect()

+ 1 - 0
StickmanWorldOnline/TempoRune.cpp

@@ -8,6 +8,7 @@ TempoRuneEffect::TempoRuneEffect( ResourceRegistry *zResources, Spieler *zSpiele
     zSpieler->setLaufTempo( zSpieler->getLaufTempo() + 7 );
     zSpieler->setGeschossTempo( zSpieler->getGeschossTempo() + 3 );
     annimation = zResources->getResource( R_RTEMPO_EFFECT, 0 );
+    effectImage = zResources->zResource( R_RTEMPO, 0 )->getImage( 0 );
     currentImage = 0;
     nextImage = 0.075;
 }