Unable to assign saved values to list from file

17 views Asked by At

We're developing a game engine which will involve loading sprites, audio clips and such, all extending from the 'Actor' abstract class. We're able to iterate through a list of actor elements through a for loop and save the following values:

Type << ID << x << y << width << height << textureDirectory << endl;

Each line in the file represents one actor and its properties. When loading, the values for each line prints out perfectly, however the actors merge when rendering in the level editor, so in fact the properties are adding onto each one another.

Here is the code for loading in the actors:

GLvoid Load::loadActor(list<Components::Actor*>::iterator it)
{
    // Clear scene data
    Components::Actor::actors.clear();

    // Open file
    std::cout << "\nOpen: ";
    cin >>  cinData;
    inFile.open("Content/Maps/" + cinData + ".sol", std::ifstream::in);

    // Iterate and add actor types to Actor::actors list
    string line;
    vector <int> getType;
    vector <int> getID;
    vector <float> getX;
    vector <float> getY;
    vector <float> getWidth;
    vector <float> getHeight;
    vector <string> getTexDir;
    int lines = 0;

    while (getline(inFile, line))
    {
        stringstream iss(line);
        int type;
        int id;
        float x;
        float y;
        float w;
        float h;
        string td;

        // Read and pack temp values in vector lists
        if (iss >> type >> id >> x >> y >> w >> h >> td)
        {
            getType.push_back(type);
            getID.push_back(id);
            getX.push_back(x);
            getY.push_back(y);
            getWidth.push_back(w);
            getHeight.push_back(h);
            getTexDir.push_back(td);

            cout << "All values have been read..." << endl;
        }

        // Reset temp values
        type = 0;
        id = 0;
        x = 0.0f;
        y = 0.0f;
        w = 0.0f;
        h = 0.0f;
        td = "";

        // Create actor types
        switch(type)
        {
        case Components::Actor::T_SPRITE:

            Components::ActorHandler::create(new Components::Sprite(true));
            for ( it = Components::Actor::actors.begin(); it != Components::Actor::actors.end(); it++)
            {
                Components::Actor *actorList = (*it);

                actorList->setID(getID[lines]);
                actorList->setX(getX[lines]);
                actorList->setY(getY[lines]);
                actorList->setWidth(getWidth[lines]);
                actorList->setHeight(getHeight[lines]);
                actorList->setTextureDir(getTexDir[lines]);
                actorList->texture2D.loadTexture(getTexDir[lines]);

                std::cout << "Type: " << actorList->getType() << " ID: " << actorList->getID() << " X pos: " << actorList->getX() << " Y pos: " << actorList->getY() << " Width: " << actorList->getWidth() << " Height: "  << actorList->getHeight() << " TexDir: "  << actorList->getTextureDir() << endl;
            }
            break;

        default:
            break;
        }

        lines++;
    }

    std::cout << "Lines detected: " << lines << endl;

    // Close file
    inFile.close();

    // Destroy temp data
    getType.clear();
    getID.clear();
    getX.clear();
    getY.clear();
    getWidth.clear();
    getHeight.clear();
    getTexDir.clear();

    std::cout << "Load success!" << endl;
    enter code here

}
1

There are 1 answers

0
DrStrange On

Fixed the solution by adding another while loop and iterating through that instead.