2012-03-17 10 views
0

GameCharオブジェクトのベクトルをメンバー変数の1つとして持つApplicationオブジェクトがあります。このGameCharオブジェクトには、コンストラクタで初期化され、GameCharオブジェクトのdrawメソッドを呼び出すときに描画されるGLbatchが含まれます。プログラムが起動すると、アプリケーションオブジェクトと3つのGameCharオブジェクトが作成され、push_back()メソッドを使ってGameCharをApplicationオブジェクトのベクトルにプッシュします。次に、ゲームのループの中で、私はベクトルを繰り返し、すべてのI'tsオブジェクトのdrawメソッドを呼び出します。問題は、最後にベクトルに配置されたオブジェクトだけが描画されることです。私はベクトルが正しく反復され、drawメソッドがすべてのオブジェクトに対して呼び出されることを保証しましたが、どのような順序でこの描画メソッドを呼び出しても問題ありません(私はベクトルを最後まで繰り返してこのことを保証しようとしました)。ベクトルに最後に挿入されたオブジェクトだけが描画されます。 (:幅、高さ、X、Yのコンストラクタがこの順に引数を取得):ベクトルの最後のオブジェクトだけが描画されるときに描画されます

​​

、これはループである:

ここ

は、アプリケーションとGameCharオブジェクトを作成するコードであります

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(); 
} 

UPDATE:ここ は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(); 
} 

ませ正方形が描画されません取得します。私は本当にこのすべてのナンセンスを見つける

別の更新:

このように、中にそれを押した後、私は第三の目的を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); 
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); 

2文字目が描画されます。だから私は、問題は、すでにベクターに入っている文字が新しいものがプッシュされたときに無効になることだと思うが、どうしてこのようなことが起こるのか、それをどう修正するのか分からない。

+0

最後のものだけが描かれたことをどのように知っていますか?他の人たちの後ろにいるのだろうか?あなたは何を見ますか?オブジェクトをどの角度から見ていますか? – selalerer

+2

'draw'は実際に何をしていますか? –

+0

@selalerer私は別の位置にそれらを描画するので、私はそれを知っています。たとえば、押されている最後の文字がcharacter2の場合、X:0.5とY:0.5で描画されます(座標は両方の軸で-1から1までです)。ただし、character3が最後の場合は - 1、-1、GameCharsのコンストラクタの最後の2つのパラメータで確認できます。 – XaitormanX

答えて

0

私はそれを最終的に解決した!私はまだ問題の原因を知りませんが、GameCharのベクトルをGameCharオブジェクトのポインタのベクトルに変更しました。

関連する問題