2016-05-15 53 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