gpt4 book ai didi

c++ - 我如何在此代码中使用键盘交互

转载 作者:行者123 更新时间:2023-11-28 04:18:12 25 4
gpt4 key购买 nike

我想使用键盘键移动路径上的对象,但在使用键盘功能后对象没有移动。请帮我解决这个问题。应用键盘功能后,对象没有从它的位置移动。

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();
}

我建议仅在 disaply 中进行缓冲区交换 ( glutSwapBuffers )。将其从其他函数中移除。
使用 glutPostRedisplay将当前窗口标记为需要连续重新显示。

关于c++ - 我如何在此代码中使用键盘交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56089789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com