Iterationsproblem



  • Hallo, Ich habe folgendes Problem:

    Ich habe eine Datei die eine Tilemap repräsentiert die in eine Datenstruktur überführt werden soll.
    Und zwar ist es Ziel zum Schluss einen Vector von Tiles zubekommen die dann anderweitig verarbeitet
    werden können.
    Die Map hat folgendes format:

    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
    

    Um dies zu erreichen habe ich zwei Funktionen:

    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;
    
                }
            }
    

    Das Problem ist, das die Funktion CheckMap 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 der Form (x,y) bis zum nächsten seperator " ".
    Ich benötige aber die Information wo auf der Karte ein Tile ist um später diese unterandem Korrekt auf dem Bildschirm zu zeichnen

    Ich habe das gefühl das ich ein Brett vor dem Kopf habe, weil mir auch keine andere Lösung für das problem Momentan einfällt.



  • Du könntest erstmal durch die Zeilen iterieren und diese anschließend in die Werte aufspalten.



  • Oh grauen.

    1. benutze getline bis zum Zeilenende(wahrscheinlich ist das gar nicht nötig, aber ich will dir jetzt nicht zu nem ordentlichen parser raten)
    2. benutze std::stringstream zum lesen der ints aus der Zeile und bastel nicht mit atoi oder ähnlichem rum. Mach nur vorher ein peek um zu sehen, ob das erste Zeichen ein x ist.
    3. vorwärtsdeklaration von variablen innerhalb einer Funktion ist höchst unübersichtlich
    4. Wenn du einen Vektor von Tiles haben willst, dann solltest du einen Vektor von Tiles erzeugen, und nicht einen Vektor von pointern auf Tiles. Das erspart dir eine Menge Scherereien (Thema Exceptions und Geschwindigkeit und Codekomplexität...)


Anmelden zum Antworten