0

配置するタイルのマップを表す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 y = 11; y >= 0; y--){
    for (int x = 0; x < 20; x++){ //for (int x = 19; x >= 0; 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),     float(y), 0.0f);
            glTexCoord2f(1.0f, 0.0f); glVertex3f(float(x + 1), float(y), 0.0f);
            glTexCoord2f(1.0f, 1.0f); glVertex3f(float(x + 1), float(y + 1), 0.0f);
            glTexCoord2f(0.0f, 1.0f); glVertex3f(float(x),     float(y + 1), 0.0f);
        glEnd();
    }
}

何らかの理由で、myMapが反転しています...(したがって、上記の数字の一番下の行はmap画面上のタイルの一番上の行であり、上の2map番目の行は画面上のタイルの2番目の行です)。

私の理解では、各桁を選択して正しいタイルを割り当てることを繰り返します。を変更してみましたx/yが、画面上でマップが回転し、12タイルが、x20タイルがになりyます。

画面上のタイルが上の地図を表すようにしたい。これを修正する方法はありますか?ありがとう。

4

1 に答える 1

2

問題は、OpenGLが実際には、ポイント(0、0)がビューポートの左下部分にある座標系を持っているという事実にあります。したがって、その行列を描画するのと同じ方法でコードで表現する場合は、描画するためのy座標をとして計算する必要があります<height of viewport> - (calculated y)。その高さを取得する方法-それはあなた次第です、おそらくあなたはそれをコードの前半で定義しました。たとえば、float(y + 1 + offsety)になりfloat(HEIGHT - (y + 1 + offsety))ます。

編集

ああ、私はちょうど気づきました-あなたはそのループを持っているので、あなたは置くことができます

for (int y = 11; y >= 0; y--){

代わりに、外部ループの既存の開始とそれだけです。しかし、とにかく、あなたが思ったようにそれが誤って反転されていないことを知っておくのは良いことです-それは座標系次第です。

于 2013-03-27T00:23:28.043 に答える