我是OpenGL的新手,我正在尝试绘制一个火柴人,然后使用键盘上的箭头键移动它。 我的想法是为火柴人使用全局变量,并在按下某个键时更改它们。然后再次调用draw-function(myDisplay())。 不幸的是我总是收到以下错误消息: “错误10错误C2371:'myDisplay':重新定义;不同的基本类型” 当我替换myDisplay()时 - 在某些教程中建议使用glutPostRedisplay()调用键盘函数时,我会读取错误消息disapears并且构建成功。但按键时火柴人不动。
这是我的代码:
#include <GL/glut.h>
GLint x; GLint y; GLint d; //parameters for the stickman
void myKeyboard(unsigned char key, int mx, int my) {
int x1 = mx;
int y1 = 480 - my;
switch(key){
case GLUT_KEY_LEFT :
x = x-50;
myDisplay();
break;
case 'E' :
exit(-1);
break;
default:
break;
}
}
void stickman () {
glBegin(GL_LINES); //body
glVertex2i(x, y);
glVertex2i(x, y-2*d);
glVertex2i(x-d, y-d);
glVertex2i(x+d, y-d);
glVertex2i(x, y-2*d);
glVertex2i(x-d, y-3*d);
glVertex2i(x, y-2*d);
glVertex2i(x+d, y-3*d);
glEnd();
glBegin(GL_LINE_LOOP); //head
glVertex2i(x,y);
glVertex2i(x+0.5*d, y);
glVertex2i(x+0.5*d, y+0.5*d);
glVertex2i(x-0.5*d, y+0.5*d);
glVertex2i(x-0.5*d, y);
glEnd();
}
void myDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
stickman();
glFlush();
}
void myInit() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
void main(int argc, char** argv) {
x = 320;
y = 350;
d = 100;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(200, 50);
glutCreateWindow("Stickman");
glutDisplayFunc(myDisplay);
glutKeyboardFunc(myKeyboard);
glutPostRedisplay();
myInit();
glutMainLoop();
}
答案 0 :(得分:1)
正如我发现的那样(GLUT Keyboard Tutorial)问题不是图片的重绘,而是左箭头键无法识别。 我需要为我的特殊键(如箭头键)编写另一个键盘功能。
现在我的代码看起来像这样,它可以工作:
void processNormalKeys (unsigned char key, int mx, int my) {
if (key == 'E')
exit(-1);
}
void processSpecialKeys (int key, int mx, int my) {
switch(key){
case GLUT_KEY_LEFT :
x = x-5;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT :
x = x+5;
glutPostRedisplay();
break;
case GLUT_KEY_UP :
y = y+5;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN :
y = y-5;
glutPostRedisplay();
break;
default:
break;
}
}
我还必须调整主要功能:
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);
但是谢谢你的帮助!
答案 1 :(得分:0)
glutPostRedisplay()
用于告诉标记当前窗口需要重新显示,如文档中所述。这意味着您需要在myKeyboard
函数的末尾调用此函数。
我还建议您使用双缓冲或缓冲缓冲来避免不良后果。对于双缓冲区,您需要使用glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
更改glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
,然后在显示功能结束时添加glutSwapBuffers();
。您可以在http://www.swiftless.com/tutorials/opengl/smooth_rotation.html
找到更多信息。