OpenGL と C を使用して小さなタイリング ゲーム エンジンを作成しましたが、何が問題なのかわかりません。私のメインループは次のようになります。
void main_game_loop()
{
(poll for events and respond to them)
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
draw_block(WALL, 10, 10);
}
draw_block:
void draw_block(block b, int x, int y)
{
(load b's texture from a hash and store it in GLuint tex)
glPushMatrix();
glTranslatef(x, y, 0);
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
//BLOCK_DIM is 32, the width and height of the texture
glTexCoord2i(0, 0); glVertex3f(0, 0, 0);
glTexCoord2i(1, 0); glVertex3f(BLOCK_DIM, 0, 0);
glTexCoord2i(1, 1); glVertex3f(BLOCK_DIM, BLOCK_DIM, 0);
glTexCoord2i(0, 1); glVertex3f(0, BLOCK_DIM, 0);
glEnd();
glPopMatrix;
}
初期化関数: (main_game_loop の前に呼び出されます)
void init_gl()
{
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0, 0, 0, 0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
実行すると、黒い画面が表示されます。ただし、glViewport 呼び出しを削除すると、テクスチャが表示されているように見えますが、巨大でウィンドウの隅に表示されます。スクリーンショット:
テクスチャは正しく描画されています。大きな倍率でスケールアウトすると、画像全体が見えるからです。y 軸も、gluOrtho2D 呼び出しで使用したものとは反転しているようです (イベントで画像の x/y 座標を加算または減算し、y 座標から減算すると画像が下に移動することで発見されました)。これは私が考えることができる最も単純な例であるため、私はイライラし始めています。私は SDL を使用しており、SDL_OPENGL を SDL_SetVideoMode に渡しています。ここで何が起こっているのですか?