Cześć. Mam taki problem że nie wiem gdzie jest błąd, a polega on na tym że do pliku zapisuje mi 60 razy tą samą liczbę zamiast pozycje x y z dla 20 obiektów. Błąd jest tym dziwniejszy że gdy dam losowanie pozycji to działa, ale gdy dam samo wczytywanie i zapis to już nie. Oto kody:
Generator o którym mowa:
WorldGenerator::WorldGenerator(int howMany, std::mt19937 &rand, Save &save)
{
objects = new Figures[howMany];
positions = new glm::vec3[howMany];
howManyObjects = howMany;
for (int i = 0; i < howMany; i++)
{
objects[i] = Figures("C:/Game/Blocks/brick/brick.txt", "C:/Game/Blocks/brick/brickTexture.txt");
if (under.checkWorldGenerator("C:/Game/Saves/Player/Save/Objects/generateWorld.txt") == "0")
{
objects[i].setTransform(glm::vec3(under.randomPosition(rand)), 0.0f, glm::vec3(1.0f, 1.0f, 1.0f));
under.setWorldGenerator("C:/Game/Saves/Player/Save/Objects/generateWorld.txt");
}
}
}
WorldGenerator::WorldGenerator()
{
}
WorldGenerator::~WorldGenerator()
{
}
void WorldGenerator::drawWorld(GLint &textureSlot, int textureValue, GLint &transforms, Save &save)
{
elipseMoving();
for (int i = 0; i < howManyObjects; i++)
{
objects[i].draw(textureSlot, 0, transforms);
}
}
Oraz klasy do zapisu pozycji:
Figures::Figures(std::string wayToFile, std::string wayToFileTex, Save &save)
{
std::ifstream numbers(wayToFile);
static unsigned int id = 0;
nr = id;
if (!numbers)
{
std::cout << "Can't open file with blackboard coords";
getchar();
return;
}
while (!numbers.eof())
{
GLfloat temp;
numbers >> temp;
blackboard.push_back(temp);
}
numbers.close();
std::ifstream texNumbers(wayToFileTex);
if (!texNumbers)
{
std::cout << "Can't open file with blackboard with texture";
getchar();
return;
}
while (!texNumbers.eof())
{
GLfloat temp;
texNumbers >> temp;
texture.push_back(temp);
}
texNumbers.close();
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * blackboard.size(), blackboard.data(), GL_STATIC_DRAW);
glGenBuffers(1, &textureVbo);
glBindBuffer(GL_ARRAY_BUFFER, textureVbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * texture.size(), texture.data(), GL_STATIC_DRAW);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, textureVbo);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
transform = glm::translate(glm::mat4(1.0f), position);
position = save.position[nr];
setTransform(save.position[nr], 0.0f, glm::vec3(1.0f, 1.0f, 1.0f));
id++;
}
void Figures::draw(GLint &textureSlot, int textureValue, GLint &transforms, Save &save)
{
save.position[nr] = position;
glUniformMatrix4fv(transforms, 1, GL_FALSE, glm::value_ptr(rot));
glUniform1i(textureSlot, textureValue);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, blackboard.size() / 3.0f);
}
Save::Save(std::string savePosition)
{
std::ifstream plik(savePosition);
if (!plik)
{
std::cout << "Cannnot open file" << std::endl;
exit(0);
}
std::string *inscription1 = new std::string;
int lines = 0;
while (!plik.eof())
{
std::getline(plik, *inscription1);
lines++;
}
delete inscription1;
std::string wiersz;
std::string **board = new std::string *[lines];
for (int i = 0; i < lines; i++)
{
board[i] = new std::string[3];
}
int y = 0;
int x = 0;
while (getline(plik, wiersz))
{
for (int i = 0; i < wiersz.length(); i++)
{
if (wiersz[i] == ' ')
{
x++;
continue;
}
board[y][x] += wiersz[i];
}
x = 0;
y++;
}
float **positions = new float *[lines];
for (int i = 0; i < lines; i++)
{
positions[i] = new float[3];
}
for (int i = 0; i < lines; i++)
{
for (int j = 0; j < 3; j++)
{
std::stringstream iss;
std::string inscription = board[i][j];
float number;
iss << inscription;
iss >> number;
positions[i][j] = number;
}
}
for (int i = 0; i < lines; i++)
{
position.push_back(glm::vec3(positions[i][0], positions[i][1], positions[i][2]));
}
}
void Save::savePos(std::string wayToFile)
{
std::ofstream output(wayToFile);
for (int i = 0; i < 21; i++)
{
output << position[i].x << " ";
output << position[i].y << " ";
output << position[i].z << std::endl;
}
}
No i jeszcze dla ustawiania pozycji:
void Figures::setTransform(glm::vec3 &newPosition, float angleValue, glm::vec3 rotValue)
{
angle = angleValue;
position = newPosition;
transform = glm::translate(glm::mat4(1.0f), newPosition);
rot = glm::rotate(transform, glm::radians(angleValue), rotValue);
}
Jeśli ktoś potrzebuje dodatkowych informacji to program miałby wylosować pozycje dla 20 obiektów a następnie ją zapisać i jak się ponownie wejdzie to żeby te obiekty miały tą samą pozycję