Announcement

Collapse
No announcement yet.

Kleines Iterations problem...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kleines Iterations problem...

    Hallo,

    Ich bin momentan daran ein kleinen TileMap Editor mir zusammen zuschreiben. Ich bin soweit das ich meine Tilemap fast korrekt auslesen kann.
    Momentan ist das Projekt so Aufgebaut das man insgesamt 4 Klassen hat:
    • Map - Verwaltet die Verschiedenen Layer einer TileMap
    • Layer - Speichert ein Vector aller Tiles, sowie das benötigte Tileset und DatenQuelle zusätzlich als string
    • Tileset - Erlaubt zugriff auf einzelne Tiles
    • Tile - Speichert Metadaten zum Teil. Position im Tileset, Position im Layer


    Die Klasse Layer erzeugt den Vector mit allen Tiles und hier kommt das eigentliche Problem:

    DatenQuelle sieht wie folgt aus:

    Code:
    1,0 1,0 1,0 1,0 1,1 1,0 1,0 1,0 1,0 1,0
    1,0 x,x x,x x,x x,x x,x x,x x,x x,x 1,0
    1,0 x,x x,x x,x 0,0 x,x x,x x,x x,x 1,0
    1,0 1,0 x,x x,x 1,0 x,x 1,1 x,x x,x 1,0
    1,0 x,x x,x x,x 2,0 x,x x,x x,x x,x 1,0
    1,0 x,x x,x x,x 3,0 1,1 0,0 x,x x,x 1,0
    1,0 x,x x,x x,x x,x x,x x,x x,x x,x 1,0
    1,0 x,x x,x x,x x,x x,x x,x x,x x,x 1,0
    1,0 x,x x,x x,x x,x x,x x,x x,x x,x 1,0
    1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0   
    Code:
    void Layer::CheckMap(std::string value,sf::Vector2i& globalposition)
            {
                std::string xx = value.substr(0,value.find(',')); //Find X component of coordinate in the tileset
                std::string yy = value.substr(value.find(',')+1); //Find y component of coordinate in the tileset
    
    
                int x,y,i,j;
    
    
                for(i = 0; i< xx.length();i++)
                {
                    if(!std::isdigit(xx[i]))
                        break;
                }
    
    
                for(j = 0; j< yy.length();j++)
                {
                    if(!std::isdigit(yy[j]))
                        break;
                }
    
    
                x = (i == xx.length()) ? std::atoi(xx.c_str()) : -1;
                y = (j == yy.length()) ? std::atoi(yy.c_str()) : -1;
    
                //Trauriger versuch...
                globalposition.x++;
                Tile* tmp = new Tile(this->m_Tileset,sf::Vector2i(x,y),globalposition,sf::Vector2i(32,32),0);
                this->m_Tiles.push_back(tmp);
            }
            
            void Layer::LoadLayer()
            {
                std::stringstream           cstream(this->m_LayerSource); //Charakterstream
                std::string                 value;
                sf::Vector2i                globalposition(0,0);
                if(this->m_Tileset == NULL)
                {
                    this->m_Tileset = new graphic::Tileset(this->m_Tilesetpath,32);
                }
                
                while(!cstream.eof())
                {
                    
                    while(std::getline(cstream,value,' '))
                    {
                        if(value.length() > 0)
                        {
                            this->CheckMap(value,globalposition);
                            
                             std::cerr<<"x|y -- "<<globalposition.x<<"|"<<globalposition.y<<"\n";
                        }
                        globalposition.y++;
                    
                    }
                    globalposition.x = 0;
                    
                    
                   
                }
            }
    Wie man sieht Iterariere ich nur Zeile für Zeile aber in der Funktion CheckMap nicht innerhalb der Zeile so das Die x koordinate nicht korrekt
    gespeichert wird. Ich hab mich als ganz schön verzettelt irgendwo. Ich hab keinen ansatz gerade wie ich an das X korrekt komme. Hab grad
    echt ein Brett vor dem Kopf.

  • #2
    Was ist den der Fehler. Mittels Debugger muss du doch sehen, ob das Objekct einen und welchen Inhalt hat. M.E. ist ++ auch nicht überschrieben worden http://www.sfml-dev.org/documentatio...1_1Vector2.php
    Christian

    Comment


    • #3
      Der Code hat keinen Fehler das er nicht gebaut werden kann. Das Programm läuft Wunderbar, Fenster wird geöffnet Alle Klassen werden fast Korrekt erstellt. Und dann wird versucht die Tiles zu zeichnen. Die Problematik die sich jedoch ergibt wenn ich ein Tile erzeuge, wird dazu ja eine X und Y Koordinate benötigt. Die Y Koordinate erhalte ich ja wenn Ich nach jedem getline eine Variable die für Y steht inkrementiere!

      Man benötigt aber auch noch die X Koordinate, und hier fängt es an problematisch zu werden. Den in meinem Design, was ja sowieso nicht soo toll ist, steckt ein kleiner Denkfehler. Wie komme ich an die Korrekt inkrementierte X Koordinate in der Funktion CheckMap. Diese Funktion nimmt ja eine Linie auseinander und versucht für jedes Tile die Position auf der TileMap zubestimmen. dazu benötigt man ja ein paar [x,y] die aus der Datei ausgelesen wird Zeile für Zeile.

      Comment


      • #4
        ok, ich verstehe es nicht.
        wenn sie korrekt erhöht wird steht in

        globalposition.x++;

        der Wert.
        Christian

        Comment


        • #5
          JA, richtig nur muss ich erkennen wann die Zeile aufhört und hier beginnt meine problematik.... so wie die Funktion aufgebaut ist, wie komme ich an die Information wann eine Zeile vorbei ist um X wieder auf Null zu setzen. Ab da habe ich mich nämlich verhändert irgendwie beim denken und komm auf keinen grünen Zweig

          Comment


          • #6
            Eine Zeile ist zu Ende/oder neu, wenn mittels getline neu gelesen wird.... Würde ich erstmal so sehen
            Ggf. dort einen bool setzen neueZeile=true und mit diesem weiter arbeiten. D.h. er muss auf false gesetzt werden, um zu kennzeichnen, dass daran gearbeitet wird.
            Aber wie gesagt...ich verstehe das Problem so nicht
            Christian

            Comment


            • #7
              Das Problem ist, das die Funktion nicht erkennen kann wann innerhalb einer Zeile diese Zu Ende ist. Wodurch X immer weiter inkrementiert wird und so nie auf null gesetzt werden kann. getline holt hier auch nicht eine Zeile sondern nur ein object bis zum nächsten seperator " ".

              Comment

              Working...
              X