瀏覽代碼

Resourcen werden geladen und eingefärbt

Kolja Strohm 5 年之前
父節點
當前提交
3530cb1367
共有 4 個文件被更改,包括 118 次插入16 次删除
  1. 25 5
      StickmanWorldOnline/Resource.cpp
  2. 12 6
      StickmanWorldOnline/Resource.h
  3. 79 5
      StickmanWorldOnline/Spiel.cpp
  4. 2 0
      StickmanWorldOnline/Spiel.h

+ 25 - 5
StickmanWorldOnline/Resource.cpp

@@ -42,13 +42,21 @@ Bild *AlphaColorMode::colorImage( Bild *zImg, int color )
 }
 
 
+MaskColorMode::MaskColorMode( int colorToReplace )
+{
+    this->colorToReplace = colorToReplace;
+}
+
 Bild *MaskColorMode::colorImage( Bild *zImg, int color )
 {
     Bild *result = ColorMode::colorImage( zImg, color );
     int *buffer = result->getBuffer();
     int size = result->getBreite() * result->getHeight();
     for( int i = 0; i < size; i++ )
-        buffer[ i ] = ( buffer[ i ] & 0xFF000000 ) | ( color & 0xFFFFFF );
+    {
+        if( ( buffer[ i ] & 0xFFFFFF ) == colorToReplace )
+            buffer[ i ] = ( buffer[ i ] & 0xFF000000 ) | ( color & 0xFFFFFF );
+    }
     return result;
 }
 
@@ -98,8 +106,10 @@ Resource *Resource::release()
 }
 
 
-ResourceRegistry::ResourceRegistry()
+ResourceRegistry::ResourceRegistry( Text spielPfad, Text mapPfad )
 {
+    this->spielPfad = spielPfad;
+    this->mapPfad = mapPfad;
     ref = 1;
 }
 
@@ -109,8 +119,10 @@ Resource *ResourceRegistry::getResource( ResourceIds id, int color, ColorMode *m
     return r ? r->getThis() : 0;
 }
 
-Resource *ResourceRegistry::zResource( ResourceIds id, int color, ColorMode *mode, Text path = "" )
+Resource *ResourceRegistry::zResource( ResourceIds id, int color, ColorMode *mode, Text path )
 {
+    path.ersetzen( "map:", mapPfad );
+    path.ersetzen( "spiel:", spielPfad );
     for( auto r = resources.getIterator(); r; r++ )
     {
         if( r->getId() == id && r->getColor() == color )
@@ -119,6 +131,8 @@ Resource *ResourceRegistry::zResource( ResourceIds id, int color, ColorMode *mod
             return r;
         }
     }
+    if( !mode )
+        return 0;
     for( auto r = resources.getIterator(); r; r++ )
     {
         if( r->getId() == id )
@@ -143,11 +157,17 @@ Resource *ResourceRegistry::zResource( ResourceIds id, int color, ColorMode *mod
             return r;
         }
         mode->release();
+        return 0;
     }
-    Resource *r = new Resource( id, color );
-    resources.add( r );
     LTDBDatei dat;
     dat.setDatei( path.getThis() );
+    if( !dat.getBildAnzahl() )
+    {
+        mode->release();
+        return 0;
+    }
+    Resource *r = new Resource( id, color );
+    resources.add( r );
     for( int i = 0; i < dat.getBildAnzahl(); i++ )
     {
         Bild *b = dat.laden( 0, dat.zBildListe()->get( i ) );

+ 12 - 6
StickmanWorldOnline/Resource.h

@@ -28,7 +28,11 @@ public:
 
 class MaskColorMode : public ColorMode
 {
+private:
+    int colorToReplace;
+
 public:
+    MaskColorMode( int colorToReplace );
     Bild *colorImage( Bild *zImg, int color ) override;
 };
 
@@ -38,7 +42,7 @@ enum ResourceIds
     R_BASE,
     R_PFEIL_GESCHOSS,
     R_PFEIL,
-    R_LEBEL,
+    R_LEBEN,
     R_SCHILD,
     R_SCHUH,
     R_GEIST,
@@ -51,7 +55,7 @@ enum ResourceIds
     R_STURM_OBEN,
     R_STURM_LINKS,
     R_STURM_RECHTS,
-    R_STUMR_UNTEN,
+    R_STURM_UNTEN,
     R_DRACHENAUGE,
     R_FEUERBALL,
     R_FEUERBALL_TREFFER,
@@ -65,7 +69,7 @@ enum ResourceIds
     R_RTEMPO,
     R_SCHALTER,
     R_SCHIENE,
-    R_SPIELER_STIRBD,
+    R_SPIELER_STIRBT,
     R_SPIELER,
     R_SPIELER_RECHTS,
     R_SPIELER_LINKS,
@@ -98,12 +102,14 @@ class ResourceRegistry
 {
 private:
     RCArray< Resource > resources;
+    Text spielPfad;
+    Text mapPfad;
     int ref;
 
 public:
-    ResourceRegistry();
-    Resource *getResource( ResourceIds id, int color, ColorMode *mode, Text path = "" );
-    Resource *zResource( ResourceIds id, int color, ColorMode *mode, Text path = "" );
+    ResourceRegistry( Text spielPfad, Text mapPfad );
+    Resource *getResource( ResourceIds id, int color, ColorMode *mode = 0, Text path = "" );
+    Resource *zResource( ResourceIds id, int color, ColorMode *mode = 0, Text path = "" );
     ResourceRegistry *getThis();
     ResourceRegistry *release();
 };

+ 79 - 5
StickmanWorldOnline/Spiel.cpp

@@ -1,4 +1,5 @@
 #include "Spiel.h"
+#include "Reader.h"
 
 #define TICK 0.03333333
 
@@ -60,6 +61,7 @@ Spiel::Spiel()
     zuletztFortgesetzterTimer = 0;
     zuletztBenutzterTunnel = 0;
     zuletztBenutzteUmlenkung = 0;
+    resources = 0;
     ref = 1;
 }
 
@@ -138,6 +140,8 @@ Spiel::~Spiel()
         zuletztBenutzterTunnel->release();
     if( zuletztBenutzteUmlenkung )
         zuletztBenutzteUmlenkung->release();
+    if( resources )
+        resources->release();
     delete[] tasten;
 }
 
@@ -454,12 +458,82 @@ void Spiel::setKarteId( int karteId )
 void Spiel::ladeDaten()
 {
     Text *gamePath = infoKlient->getDateiGruppePfad( infoKlient->getDateiGruppeIdVonSpiel( infoKlient->getSpielId( karteId ) ) );
-    Text *mapPf = new Text( "data/tmp/Karten/" );
-    mapPf->append( karteId );
-    mapPf->append( "/spiel/data/data.sts" );
-
+    Text mapPf = Text( "data/tmp/Karten/" ) + karteId + "/spiel/files";
+    MapReader *reader = new MapReader( karteId, Text( "data/tmp/Karten/" ) + karteId + "/spiel/data/" );
+    // loading map
+    reader->ladeKarte( this );
+    spielKlient->setLadenProzent( 50 );
+    reader->release();
+    // loading resources
+    if( resources )
+        resources->release();
+    resources = new ResourceRegistry( gamePath->getText(), mapPf );
+    resources->zResource( R_BARIERE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/bariere.png" );
+    resources->zResource( R_BASE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/base.png" );
+    resources->zResource( R_PFEIL_GESCHOSS, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/pfeilg.png" );
+    resources->zResource( R_PFEIL, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/pfeil.png" );
+    resources->zResource( R_LEBEN, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/leben.png" );
+    resources->zResource( R_SCHILD, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/schild.png" );
+    resources->zResource( R_SCHUH, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/schuh.png" );
+    resources->zResource( R_GEIST, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/geist.png" );
+    resources->zResource( R_ROLLE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/rolle.png" );
+    resources->zResource( R_ROLLE_OBEN, 0, new ColorMode(), "spiel:/bilder/rolleoben.ltdb" );
+    resources->zResource( R_ROLLE_LINKS, 0, new ColorMode(), "spiel:/bilder/rollelinks.ltdb" );
+    resources->zResource( R_ROLLE_RECHTS, 0, new ColorMode(), "spiel:/bilder/rollerechts.ltdb" );
+    resources->zResource( R_ROLLE_UNTEN, 0, new ColorMode(), "spiel:/bilder/rolleunten.ltdb" );
+    resources->zResource( R_STURM, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/sturm.png" );
+    resources->zResource( R_STURM_OBEN, 0, new ColorMode(), "spiel:/bilder/sturmoben.ltdb" );
+    resources->zResource( R_STURM_LINKS, 0, new ColorMode(), "spiel:/bilder/sturmlinks.ltdb" );
+    resources->zResource( R_STURM_RECHTS, 0, new ColorMode(), "spiel:/bilder/sturmrechts.ltdb" );
+    resources->zResource( R_STURM_UNTEN, 0, new ColorMode(), "spiel:/bilder/sturmunten.ltdb" );
+    resources->zResource( R_DRACHENAUGE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/drachenauge.png" );
+    resources->zResource( R_FEUERBALL, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/feuerball.png" );
+    resources->zResource( R_FEUERBALL_TREFFER, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/feuerballtreffe" );
+    resources->zResource( R_ENTERHAKEN_SEIL, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/enterhakenseil." );
+    resources->zResource( R_ENTERHAKEN_SPITZE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/enterhakenspitz" );
+    resources->zResource( R_ENTERHAKEN_ITEM, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/enterhaken.png" );
+    resources->zResource( R_MINE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/miene.png" );
+    resources->zResource( R_RWEISHEIT, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/rweisheit.png" );
+    resources->zResource( R_RBOSHEIT, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/rbosheit.png" );
+    resources->zResource( R_RLEBEN, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/rleben.png" );
+    resources->zResource( R_RTEMPO, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/rtempo.png" );
+    resources->zResource( R_SCHALTER, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/schalter.png" );
+    resources->zResource( R_SCHIENE, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/schiene.png" );
+    resources->zResource( R_SPIELER_STIRBT, 0, new ColorMode(), "spiel:/bilder/spielerstirbt.ltdb" );
+    resources->zResource( R_SPIELER, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/spieler.png" );
+    resources->zResource( R_SPIELER_RECHTS, 0, new ColorMode(), "spiel:/bilder/spielerrechts.ltdb" );
+    resources->zResource( R_SPIELER_LINKS, 0, new ColorMode(), "spiel:/bilder/spielerlinks.ltdb" );
+    resources->zResource( R_TUNNEL, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/tunnel.png" );
+    resources->zResource( R_UMLENKUNG, 0, new ColorMode(), "spiel:/bilder/textures.ltdb/umlenkung.png" );
+    spielKlient->setLadenProzent( 70 );
+    // apply team color filters
+    AlphaColorMode *alphaMode = new AlphaColorMode( 0x77 );
+    for( auto t = teams.getIterator(); t; t++ )
+    {
+        resources->zResource( R_BARIERE, t->getFarbe(), alphaMode->getThis() );
+        resources->zResource( R_BASE, t->getFarbe(), alphaMode->getThis() );
+    }
+    alphaMode->release();
+    spielKlient->setLadenProzent( 80 );
+    // apply player color filters
+    MaskColorMode *maskMode = new MaskColorMode( 0xFFFFFF );
+    for( auto s = spieler.getIterator(); s; s++ )
+    {
+        resources->zResource( R_ROLLE_OBEN, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_ROLLE_LINKS, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_ROLLE_RECHTS, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_ROLLE_UNTEN, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_STURM_OBEN, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_STURM_LINKS, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_STURM_RECHTS, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_STURM_UNTEN, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_SPIELER_STIRBT, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_SPIELER, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_SPIELER_RECHTS, s->getFarbe(), maskMode->getThis() );
+        resources->zResource( R_SPIELER_LINKS, s->getFarbe(), maskMode->getThis() );
+    }
+    maskMode->release();
     spielKlient->setLadenProzent( 100 );
-    mapPf->release();
     gamePath->release();
 }
 

+ 2 - 0
StickmanWorldOnline/Spiel.h

@@ -20,6 +20,7 @@
 #include "Umlenkung.h"
 #include "DrachenAuge.h"
 #include "Brand.h"
+#include "Resource.h"
 
 class SpielerGUI;
 class DeadPlayer;
@@ -89,6 +90,7 @@ private:
     Timer *zuletztFortgesetzterTimer;
     Tunnel *zuletztBenutzterTunnel;
     Umlenkung *zuletztBenutzteUmlenkung;
+    ResourceRegistry *resources;
     int nextId;
     bool rendern;
     double rZeit;