2013-03-27 140 views
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(); 
+0

“坐标系”...什么坐标系?您没有显示您的'GL_PROJECTION' *或*'GL_MODELVIEW'矩阵。 – genpfault 2013-03-27 15:34:46

+1

哎呀,对不起。我现在编辑我的问题。谢谢。 – Reanimation 2013-03-27 15:43:11

回答

1

在draw_tiles函数中,它看起来像你可能传递了不正确的坐标 - 也许你应该乘以瓦片大小的x和y值。

另请尝试关闭深度测试和背面剔除以帮助解决您的黑屏问题。

glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE);