如何在此代码中使用键盘交互
Posted
技术标签:
【中文标题】如何在此代码中使用键盘交互【英文标题】:How I can use Keyboard interaction in this code 【发布时间】:2019-05-11 11:15:29 【问题描述】:我想使用键盘键移动路径上的对象,但使用键盘功能后,对象没有移动。请帮我解决这个问题。应用键盘功能后,对象没有从它的位置移动。
我想为波形/路径添加 3 个不同的功能,所以我需要键盘交互,这样我就可以在不同的场景中使用不同的键。
void object()
glPushMatrix();
glTranslatef(x, y, 0);
glBegin(GL_LINES);
glColor3f(0, 0, 0);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glEnd();
glPopMatrix();
glFlush();
void drawsine()
glBegin(GL_LINE_STRIP);//Primitive
glColor3f(255, 0, 0);//Set drawing color
int i = 0;
float x = 0, y = 0;
for (x = -5; x < 6; x = x + 0.1)
y = (sin(3.142*x)) / 3.142*x;
glVertex2f(x, y);
sinex[i] = x;
siney[i] = y;
i++;
glEnd();
glFlush();
void doFrame(int v)
//x = sinex[i];
//y = siney[i];
if (x < 5.9)
x += 0.1;
y = (sin(3.142*x)) / 3.142*x;
glutPostRedisplay();
//glutTimerFunc(x,doFrame,0);
void scene1()
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
drawsine();
glPopMatrix();
//glScaled(0.3, 0.3, 1);
object();
//glutTimerFunc(30,doFrame,0);
glutSwapBuffers();
void exit(void)
exit(-1);
void myKeyboard(unsigned char key, int x, int y)
switch (key)
case 'h':
scene1();
break;
case 'e':
exit();
break;
void display()
//glClear(GL_COLOR_BUFFER_BIT);
void init()
glClearColor(1, 1, 1, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5, 7, -5, 5, -1, 1);
glMatrixMode(GL_MODELVIEW);
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(700, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Roller Coaster Simulation");
init();
glutDisplayFunc(display);
glutTimerFunc(200, doFrame, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
return 0;
【问题讨论】:
你能提供一些代码吗?这将帮助我们了解问题出在哪里。 请提供Minimal, Complete, and Verifiable example。 我现在已经提供了代码。 【参考方案1】:你必须在显示回调glutDisplayFunc
中绘制场景。
添加场景状态(current_scene
),并在按键时切换状态:
例如
int current_scene = 1;
void myKeyboard(unsigned char key, int x, int y)
switch (key)
case 'h': current_scene = 1; break;
case 'i': current_scene = 2; break;
// [...]
在显示回调中根据状态绘制场景:
void display()
glClear(GL_COLOR_BUFFER_BIT);
switch(current_scene)
case 1: scene1(); break;
case 2: scene2(); break;
// [...]
glutSwapBuffers();
glutPostRedisplay();
我建议仅在 disaply
中进行缓冲区交换 (glutSwapBuffers
)。将其从其他功能中删除。
使用glutPostRedisplay
将当前窗口标记为需要连续重新显示。
【讨论】:
@HooriaKhalid Lighthouse3d.com 有一个 GLUT 教程可能值得一看。以上是关于如何在此代码中使用键盘交互的主要内容,如果未能解决你的问题,请参考以下文章
如何与 Xamarin UITest 中的自定义键盘进行交互?
InputAccessoryView 使用键盘交互显示/隐藏上下移动表格视图