c++ - How I can use Keyboard interaction in this code
问题描述
i want to use keyboard key to move the object on the path but after using keyboard function the object is not moving.Please help me with this.after applying keyboard function the object is not moving from its place.
i want to add 3 different function for wave/path so keyboard interaction is necessary for me, so that i may able to use different keys for different scenes.
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;
}
解决方案
您必须在显示回调中绘制场景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();
}
我建议只做缓冲区交换(glutSwapBuffers
)disaply
。从其他功能中删除它。
用于glutPostRedisplay
将当前窗口标记为需要连续重新显示。
推荐阅读
- c++ - C++ 位移在相反方向上具有相同的常数,具有不同的结果与较小的代码更改
- browser - 从哪里获得预构建的 Chromium 以轻松进行修改?
- python - 如何在python中使用mysql.connector时回收mysql连接
- android - 如何将可绘制资产作为整数返回?
- linux - 如果文件归特定用户所有,则删除文件
- vuejs2 - vue.js 2 输入数字和百分比如何绑定模型
- jquery - 如何在ajax中以表格格式添加if语句?
- kotlin - 当我添加 -notifyDataSetChanged() 时应用程序崩溃 - 代码运行完美并在数据库中获取帖子但是
- python - 如何解决与 PortAudio 相关的错误?
- compiler-errors - MYSQL_INCLUDE_DIR 未找到