用于平铺输出的C ++ 2D阵列映射

时间:2013-03-27 00:12:45

标签: c++ tile

我创建了一个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();
    }
}

出于某种原因,我的Map被倒置了......(因此上面map的数字的最后一行是屏幕上的第一行数字,第二行是map 1}}是屏幕上的第二行图块。)

我的理解是,您通过选择每个数字并分配正确的图块来迭代。我已尝试更改x/y,但会在屏幕上旋转地图,以便x上的12个图块和y上的20个图块。

我希望我的瓷砖在屏幕上代表上面的地图。任何想法如何解决这一问题?感谢。

1 个答案:

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

而不是外循环的现有开始,就是这样。但是,无论如何,知道它不会像你想象的那样被意外颠倒是很好的 - 这只是坐标系统。