• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obiekty nie zapisują się

VPS Starter Arubacloud
0 głosów
127 wizyt
pytanie zadane 5 maja 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)

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ę

1 odpowiedź

+1 głos
odpowiedź 5 maja 2016 przez maly Nałogowiec (37,190 p.)
wybrane 6 maja 2016 przez Avernis
 
Najlepsza
while (!plik.eof())
{
	std::getline(plik, *inscription1);
	lines++;
}

Po wykonaniu tego czegoś kolejne getline już się nie wykonają bo pozycja kursora jest na końcu pliku(eof).

komentarz 5 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Ale potem przecież odpala się druga pętla, a ta jest tylko do liczenia linii w pliku
komentarz 5 maja 2016 przez maly Nałogowiec (37,190 p.)
Pierwsza pętla kończy się bo niema już nic do odczytania więc jakim cudem druga mogła by dalej coś czytać?
komentarz 5 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Ale dal innych obiektów zapisuje, i tak jak pisałem jak daję bez ustawiania randomowej pozycji to wtedy nie zapisuje, jak dam pozycję z randomem to wszystko działa
komentarz 5 maja 2016 przez maly Nałogowiec (37,190 p.)
Jeśli działa ci kod który niema prawa działać to ja niewiem o co chodzi.
komentarz 5 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Widzisz jaki jestem dobry ;)
komentarz 6 maja 2016 przez Avernis Nałogowiec (27,400 p.)
Rozwiązałem problem, zrobiłem 2 std::ifstreamy 1 do liczenia, 2 do zapisu
komentarz 6 maja 2016 przez maly Nałogowiec (37,190 p.)

A wystarczy przed kolejną pęlą ustawić kursor pliku na początek.

plik.seekg(0, std::ios_base::beg);

 

Podobne pytania

0 głosów
2 odpowiedzi 645 wizyt
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 1 stycznia 2016 w C i C++ przez timrh Mądrala (6,030 p.)
0 głosów
2 odpowiedzi 522 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...