2

したがって、タイルを描画するためのマップとして機能する 2D 配列があります。

int sMap[12][20] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1, 2, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1},
  {1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 0, 1, 1, 2, 2, 2, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

タイルが読み込まれたら、これを使用しfunction()てタイルを配置します。

for (int y = 0; y < 12; y++){
    for (int x = 0; x < 20; x++){
        if    (sMap[y][x] == 1)
            glBindTexture( GL_TEXTURE_2D, brick1);
        else if (sMap[y][x] == 2)
            glBindTexture( GL_TEXTURE_2D, brick2);
        else
            glBindTexture( GL_TEXTURE_2D, wall );

        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(float(x + offsetx),     float(MAP_SIZEY - (y + offsety)), 0.0f); 
        glTexCoord2f(1.0f, 0.0f); glVertex3f(float(x + 1 + offsetx), float(MAP_SIZEY - (y + offsety)), 0.0f); 
        glTexCoord2f(1.0f, 1.0f); glVertex3f(float(x + 1 + offsetx), float(MAP_SIZEY - (y + 1 + offsety)), 0.0f); 
        glTexCoord2f(0.0f, 1.0f); glVertex3f(float(x + offsetx),     float(MAP_SIZEY - (y + 1 + offsety)), 0.0f);
        glEnd();
    }
}

OpenGLスプライトとして機能する基本的な正方形を描画すると、プログラムを実行すると黒い画面が表示されるため、タイルの座標系と混同した可能性があると思います。

これがタイルに対するスプライトのスケールが間違っていることを意味するのか、それともスプライトとタイルが異なるZ平面上にあるのかどうかはわかりません...

思ったほど理解できなかった場合に備えて、誰かが座標系を説明OpenGLし、同じ座標に正方形を描く方法を教えていただければ幸いです。

現在、基本的なスプライトを描画するためにこれを持っています:

struct RECT{float x, y, w, h;};
RECT sprite = {0, 0, 10, 10};

void drawSprite (RECT rect){
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);    
        glVertex3f(rect.x, rect.y, 0.0);
        glVertex3f(rect.x, rect.y+rect.h, 0.0);
        glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0);
        glVertex3f(rect.x+rect.w, rect.y, 0.0);
    glEnd();
}

編集:

画面のサイズ変更:

glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

シーンを描く:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(10.0f, 8.0f, 20.0f, 10.0f, 8.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glTranslatef(5.0f,4.0f,0.0f);
draw_tiles();
draw_sprite();
4

1 に答える 1

1

draw_tiles 関数では、間違った座標を渡している可能性があります。おそらく、x と y の値にタイル サイズを掛ける必要があります。

また、ブラック スクリーンの問題を解決するために、デプス テストとバックフェース カリングをオフにしてみてください。

glDisable( GL_DEPTH_TEST );
glDisable( GL_CULL_FACE );
于 2013-04-29T17:15:13.980 に答える