2016-05-15 18 views
0

嗯,我在GLUT项目(我使用CodeBlocks)上有以下C代码。 它绘制了一些2D形状(类似Robot:p)。在OpenGL中使用箭头键移动一些形状 - 它缩小而不是移动

我想让整个绘图形状可以通过键盘上的箭头键移动。我写了以下内容,但由于某种原因,当我按下箭头键时,它看起来像放大/缩小。它不动。

#include <GL/glut.h> 

GLuint head_x1=5, head_y1=30, head_x2=15, head_y2=30, head_x3=15,head_y3=40, head_x4=5,head_y4=40; 

// shape 
GLuint listID; 
void MrRobot(GLsizei displayListID) 
{ 
    glNewList(displayListID,GL_COMPILE); 

    //Save current colour state 
    glPushAttrib(GL_CURRENT_BIT); 

    // body 
    glColor3f(0.5,0.5,0.5); 
    glBegin(GL_POLYGON); 
    glVertex2f(0,10); 
    glVertex2f(20,10); 
    glVertex2f(20,30); 
    glVertex2f(0,30); 
    glEnd(); 

    // head 
    glColor3f(0,0,1); 
    glBegin(GL_POLYGON); 
    glVertex2f(head_x1,head_y1); 
    glVertex2f(head_x2,head_y2); 
    glVertex2f(head_x3,head_y3); 
    glVertex2f(head_x4,head_y4); 
    glEnd(); 

    // legs 
    glColor3f(1,0,0); 
    glBegin(GL_TRIANGLE_FAN); 
    glVertex2f(10,10); 
    glVertex2f(20,0); 
    glVertex2f(10,-5); 
    glVertex2f(0,0); 
    glEnd(); 

    // right hand 
    glColor3f(0,1,0); 
    glBegin(GL_TRIANGLES); 
    glVertex2f(20,30); 
    glVertex2f(30,27.5); 
    glVertex2f(20,25); 
    glEnd(); 

    // left hand 
    glColor3f(0,1,0); 
    glBegin(GL_TRIANGLES); 
    glVertex2f(-10,27.5); 
    glVertex2f(0,30); 
    glVertex2f(0,25); 
    glEnd(); 

    //Recall saved colour state 
    glPopAttrib(); 

    glEndList(); 
} 

void display() 
{ 
    glClearColor(0,0,0,0); 

    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(1,0,0); 

    //Defining a modelview transform matrix 
    glScalef(0.3,0.3,0.3); 

    //Execute the display list (the modelview matrix will be applied) 
    glCallList(listID); 

    glFlush(); 
} 

void keyboard(unsigned char key,int x, int y) 
{ 
    printf("\nKeyboard event detected. \nCharacter key: %c\nMouse pointer position: x=%d y=%d",key,x,y); 

    if (key==GLUT_KEY_UP) 
    { 
     head_y1++; 
     head_y2++; 
     head_y3++; 
     head_y4++; 
    } 
    if (key==GLUT_KEY_DOWN) 
    { 
     head_y1--; 
     head_y2--; 
     head_y3--; 
     head_y4--; 
    } 
    if (key==GLUT_KEY_LEFT) 
    { 
     head_x1--; 
     head_x2--; 
     head_x3--; 
     head_x4--; 
    } 
    if (key==GLUT_KEY_RIGHT) 
    { 
     head_x1++; 
     head_x2++; 
     head_x3++; 
     head_x4++; 
    } 

    glutPostRedisplay(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitWindowPosition(50,50); 
    glutInitWindowSize(800,600); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutCreateWindow("Mr Robot"); 

    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(-5,35,-5,30); 

    listID=glGenLists(1); 

    MrRobot(listID); 

    glutDisplayFunc(display); 
    glutSpecialFunc(keyboard); 
    glutMainLoop(); 

    return 0; 
} 

也许是轴的东西,但不知道我应该改变。

任何帮助?

+0

你为什么要叫'glutSpecialFunc',而不是'glutKeyboardFunc ' –

回答

0

那么存在很多问题。你似乎在写OpenGL有点不同。

反正这里是问题所在。

  • 它缩放的原因是因为每次打电话显示时,您都会在不加载单位矩阵的情况下调用glScalef(0.3, 0.3, 0.3);
  • 此外,当您按下某个键时,增量正在发生,但您还没有在display函数中调用MrRobot()。你只有在main功能
  • 你也叫display之前把它叫做一旦你必须调用glMatrixMode(GL_MODELVIEW);或者一直变换你会影响GL_PROJECTION矩阵
+0

非常感谢!对不起,代码错误,我基于我的老师给我的一些例子。我应用了你所描述的变化,并且这一举措正在起作用。只有一个问题:经过一些按键后,形状正在移动,但从一个点,然后,形状扭曲,并采取整个屏幕。任何想法解决它?如果您需要复制/粘贴最终代码给您,请告诉我。 – user3594130