当按下OPENGL上的一个按键时,我的形状不想移动
问题描述:
我想使用sin函数在水平移动时使形状执行跳转,但当它按下时它甚至不响应“j”按钮? 我仍然在学习Opengl。任何关于错误在哪里的帮助?当按下OPENGL上的一个按键时,我的形状不想移动
#include <GLUT/glut.h>
#include <math.h>
float pointone = 0;
float ydir =0;
GLboolean turn ;
void Display();
void DrawWall();
void Anim();
void Keyboard(unsigned char key, int x, int y);
int main(int argc, char** argr) {
glutInit(&argc, argr);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(1000, 600);
glutInitWindowPosition(50, 50);
glutKeyboardFunc(Keyboard);
glutIdleFunc(Anim);
glutCreateWindow("Kbeer El Haramiya");
glutDisplayFunc(Display);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glPointSize(20.0);
gluOrtho2D(0.0, 1000.0, 0.0, 600.0);
glutMainLoop();
}
void Display() {
glClear(GL_COLOR_BUFFER_BIT);
DrawWall();
glPushMatrix();
if(pointone<=850 && turn ==true){
pointone+=3;
turn=true;}
else if (pointone==0){
turn=true;}
else {
turn = false;
pointone-=3;
}
glTranslatef(pointone, ydir, 0);
glBegin(GL_POLYGON);
glColor3f(0.97f,0.96f,0.768f);
glVertex2i(0.0f, 0.0f);
glVertex2i(50.0f, 0.0f);
glVertex2i(50.0f, 50.0f);
glColor3f(0.70f,0.196f,0.12f);
glVertex2i(0.0f, 50.0f);
glEnd();
glPopMatrix();
glFlush();
}
void DrawWall(){
glBegin(GL_POLYGON);
glColor3f(0.97f,0.96f,0.768f);
glVertex2i(999, 0);
glVertex2i(999,600);
glVertex2i(900, 600);
glVertex2i(900, 0);
glEnd();
glBegin(GL_POLYGON);
glVertex2i(0, 200);
glVertex2i(700,200);
glVertex2i(700, 150);
glVertex2i(0,150);
glEnd();
}
void Keyboard(unsigned char key, int x, int y){
if(key == 'j') {
for(int i =0; i<361;i++){
ydir =sin(i);
glutPostRedisplay();
}
}
}
void Anim(){
glutPostRedisplay();
}
答
解决办法很简单,我应该叫Keyboardfunc之前创建的窗口! :)
答
您必须更新ydir
Display()
函数中的某处。当您尝试在循环外对其进行更新时,在Keyboard
函数结束后,只会安排一次重绘。
代码可以看看(例如)在某种程度上是这样的:
int yint = -1; //-1 means no moving
void Display() {
if (yint > 360) // Reset when > 360°
yint = -1;
if (yint >= 0 && yint <= 360) //Update until 360° is reached
yint++;
float ydir = sin(yint);
//Draw code here
}
void Keyboard(unsigned char key, int x, int y){
if(key == 'j')
yint = 0;
}