Только последний объект вектора рисуется, когда все они должны быть нарисованы - PullRequest
0 голосов
/ 18 марта 2012

У меня есть объект Application, в котором одна из переменных-членов имеет вектор объектов GameChar.Эти объекты GameChar содержат GLbatch, который инициализируется в конструкторе и рисуется при вызове метода draw объекта GameChar.Когда программа запускается, я создаю объект приложения и три объекта GameChar и помещаю GameChar в вектор объекта приложения с помощью метода push_back ().Затем внутри игрового цикла я перебираю вектор и вызываю метод draw всех объектов I'ts.Проблема в том, что рисуется только тот объект, который был последний раз помещен в вектор.Я заверил, что вектор повторяется правильно, и что метод draw вызывается на всех объектах, но независимо от того, в каком порядке я вызываю методы рисования (я пытался перебирать вектор от конца к началу, чтобы убедиться в этом),рисуется только тот объект, который был последний раз вставлен в вектор.

Вот код, который создает объекты application и GameChar (конструктор получает аргументы в следующем порядке: width, height, x, y):

Application app;
GameChar character(0.5f,0.5f,0.0f,0.0f);
GameChar character2(0.5f,0.5f,0.5f,0.5f);
GameChar character3(0.5f,0.5f,-1.0f,-1.0f);
app.characters.push_back(character);
app.characters.push_back(character2);
app.characters.push_back(character3);

И это цикл:

while (1)
{
    vector<GameChar>::size_type sz=characters.size();
    unsigned int i;
    for (i=0;i<sz;i++)
    {
        characters[i].update();
    }
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    for (i=0;i<sz;i++)
    {

        characters[i].draw();
    }

    glfwSwapBuffers();
}

ОБНОВЛЕНИЕ: Вот конструктор GameChar:

GameChar::GameChar(GLfloat lWidth,GLfloat lHeight,GLfloat lX,GLfloat lY)
{
    xPos=lX;
    yPos=lY;
    height=lHeight;
    width=lWidth;
    if (xPos<-1)
    {
        xPos=-1;
    }
    if (xPos+width>1)
        xPos=1-width;
    if (yPos<-1)
        yPos=-1;
    if (yPos+height>1)
        yPos=1-height;
    verts[0]=xPos;
    verts[1]=yPos;
    verts[2]=0.0f;
    verts[3]=xPos+width;
    verts[4]=yPos;
    verts[5]=0.0f;
    verts[6]=xPos;
    verts[7]=yPos+height;
    verts[8]=0.0f;
    verts[9]=xPos+width;
    verts[10]=yPos+height;
    verts[11]=0.0f;

    batch.Begin(GL_TRIANGLE_STRIP, 4);
    batch.CopyVertexData3f(verts);
    batch.End();
}

Метод рисования:

void GameChar::draw()
{
    batch.Draw();
}

И я обновил игровой цикл полным кодом.

Кроме того, если я попытаюсь изменить код:

for (i=0;i<sz;i++)
{
    characters[i].draw();
}

с этим кодом:

for (i=0;i<sz;i++)
{
    GLBatch batch;
    batch=characters[i].batch;
    batch.Draw();
}

Квадрат не рисуется.Я действительно нахожу все это ерундаесли не вставлять его, вот так:

Application app;
GameChar character(0.5f,0.5f,0.0f,0.0f);
GameChar character2(0.5f,0.5f,0.5f,0.5f);
GameChar character3(0.5f,0.5f,-1.0f,-1.0f);
app.characters.push_back(character);
app.characters.push_back(character2);

Второй символ рисуется.Поэтому я думаю, что проблема в том, что символы, которые уже находятся в векторе, становятся недействительными при нажатии на новый, но я не знаю, почему это происходит, или как это исправить

1 Ответ

0 голосов
/ 19 марта 2012

Мне наконец-то удалось это исправить! Я до сих пор не знаю, в чем причина проблемы, но я изменил вектор GameChar на вектор указателей на объекты GameChar, и теперь он работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...