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
}
Fixed the solution by adding another while loop and iterating through that instead.