当它们全部被绘制时,仅绘制向量的最后一个对象

时间:2012-03-17 22:31:28

标签: c++ opengl

我有一个Application对象,它有一个GameChar对象向量作为其成员变量之一。此GameChar对象包含一个GLbatch,它在构造函数中初始化,并在调用GameChar对象的draw方法时绘制。当程序启动时,我创建一个应用程序对象和三个GameChar对象,然后使用push_back()方法将GameChar推送到Application对象的向量中。然后,在游戏循环中,我遍历向量并调用所有I'ts对象的draw方法。问题是只绘制了最后放在向量中的对象。我确信向量是正确迭代的,并且在所有对象上都调用了draw方法,但无论我以什么顺序调用这个draw方法(我已经尝试迭代向量从end到start来确保这一点),只有最后插入到矢量的对象才会被绘制。

以下是创建应用程序和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);
app.characters.push_back(character3);
app.characters.pop_back();

什么都没画,但如果不把它推进去,就像这样:

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 :(得分:0)

我终于设法解决了!我仍然不知道问题的原因是什么,但我已经将GameChar的向量更改为指向GameChar对象的向量,现在它可以工作了!