c++ - 在 Tile Map 上绘制 Sprite

标签 c++ opengl

所以我有一个二维数组,它充当要绘制的图 block 的 map 。

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

我想我可能把自己与图 block 的坐标系搞混了,因为当我绘制一个基本的 OpenGL 正方形作为 Sprite 时,我在运行程序时只是黑屏。

我不确定这是否意味着 Sprite 与图 block 的比例错误,或者 Sprite 和图 block 是否在不同的 Z 平面上...

如果有人能解释坐标系,以防我不像我想的那样理解坐标系,我将不胜感激,并建议我如何在相同的坐标上绘制 OpenGL正方形。

目前我有这个来绘制我的基本 Sprite :

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

最佳答案

在 draw_tiles 函数中,您似乎传递了不正确的坐标 - 也许您应该将 x 和 y 值乘以您的图 block 大小。

同时尝试关闭深度测试和背面剔除以帮助解决黑屏问题。

glDisable( GL_DEPTH_TEST );
glDisable( GL_CULL_FACE );

关于c++ - 在 Tile Map 上绘制 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15662585/

相关文章:

c++ - 为什么只允许一个隐式转换将参数解析为 C++ 中的函数?

c++ - 在 Windows 上以像素为单位获取 OpenGL 点大小?

c++ - 使用 bool 导出压缩结构

c++ - GLSL 属性位置返回 -1

java - 另一个 JNI、C++、DLL、UnsatisfiedLinkError <Native Method>

c++ - sqlite:检查读写器锁

c++ - QOpenGLFunctions 的渲染问题

opengl - cmake 不使用 QtOpenGL 链接 libGLU

java - 在运行 OSX 10.8.5 的 iMac 上使用 LWJGL 创建 FBO

opengl - 安装了新台面,但 glxinfo 显示旧台面