1

嘿,我目前正在制作一个 sfml 平台游戏并打算使用地图图块,但是在实现我的地图类之后,它出现了一个未处理的异常。我先调用初始化函数,然后在最后调用drawmap。这是代码..

    void Map::Initialise(const char *filename)
{
     std::ifstream openfile(filename);
    if(openfile.is_open())
    {
        std::string tempLine;
        std::getline(openfile, tempLine);

        tempLine.erase(std::remove (tempLine.begin(), tempLine.end(), ' '), tempLine.end());
        MapX = tempLine.length();

        openfile.seekg(0, std::ios::beg);

        while(!openfile.eof())
        {

            openfile >> MapFile[loadCountX][loadCountY];
            loadCountX++;
            if(loadCountX >= MapX)
            {
                loadCountX = 0;
                loadCountY++;
            }
        }
        MapY = loadCountY;
    }

}

void Map::DrawMap(sf::RenderWindow &Window)
{
    sf::Shape rect = sf::Shape::Rectangle(0, 0, BLOCKSIZE, BLOCKSIZE, sf::Color(255, 255, 255, 255));
    sf::Color rectCol;
    for(int i = 0; i < MapX; i++)
    {
        for(int j = 0; j < MapY; j++)
        {
            if(MapFile[i][j] == 0)
                rectCol = sf::Color(44, 117, 255);
            else if (MapFile[i][j] == 1)
                rectCol = sf::Color(255, 100, 17);

            rect.SetPosition(i * BLOCKSIZE, j * BLOCKSIZE);
            rect.SetColor(rectCol);
            Window.Draw(rect);
        }
    }
4

1 回答 1

1

您的文件循环很糟糕,使用eof循环可能会导致未定义的行为,并且通常是文件循环的一种糟糕方法。而是遵循此结构的循环:

fileIn >> data
//while fileIn object is good
while(fileIn) {
    //handle data variable
    fileIn >> data; //re-read data in
}

如果您想在读取下一个变量之前操作和处理您的数据,那么您正在做相反的事情。因此,您的文件到达 eof,但您尝试最后一次读取数据并处理它,这会引发您的异常。

扩展我上面所说的:

openfile >> MapFile[loadCountX][loadCountY];

//while your input stream is still good
while(openfile)
        {
        //handle your file data
            loadCountX++;
            if(loadCountX >= MapX)
            {
                loadCountX = 0;
                loadCountY++;
            }
        //now read in again AFTER
        openfile >> MapFile[loadCountX][loadCountY];
        }

应该正确读入和存储数据。

于 2013-04-02T20:41:09.580 回答