Glutkeyboard输入未注册没有奇数循环帮助

Glutkeyboard Input Not Registering Without Odd Loop To Help Out

本文关键字:循环 帮助 输入 注册 Glutkeyboard      更新时间:2023-10-16

我正在努力让键盘输入在GLUT中工作,我有很多时间。基本上,我的问题是我设置为与某些键关联的操作无法正常工作。

以下是我对glutKeyboardFunc和glutKeyboard UpFunc的声明和定义:

glutKeyboardFunc(keyPressed);
glutKeyboardUpFunc(keyUp);
void keyPressed (unsigned char key, int x, int y) {
    keyStates[key] = true;
}
void keyUp (unsigned char key, int x, int y) {
    keyStates[key] = false; 
}

这样做的目的只是在按下时将键设置为true,在释放时将键设为false。

然后,我根据按下的键定义了一些要做的事情:

void keyOperations (void) {
if (keyStates[int('w')] || keyStates[int('W')]){
    xspeed-=0.001f;
}
if (keyStates[int('s')] || keyStates[int('S')]){
    xspeed+=0.001f;
}
if (keyStates[int('a')] || keyStates[int('A')]){
    yspeed+=0.001f;
}
if (keyStates[int('d')] || keyStates[int('D')]){
    yspeed-=0.001f;
}

if (keyStates[' ']){
    yspeed=0.0f;
    xspeed=0.0f;
}
}

然后在我的glutDisplayFunc中调用keyOperations。

void display(void) {
keyOperations();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,-1.0f,z);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
    glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);glVertex3f(-100.0f, -0.0001f, -100.0f);
    glTexCoord2f(0.0f, 1.0f);glVertex3f( 100.0f, -0.0001f, -100.0f);  
    glTexCoord2f(0.0f, 0.0f);glVertex3f( 100.0f, -0.0001f,  100.0f);  
    glTexCoord2f(1.0f, 0.0f);glVertex3f(-100.0f, -0.0001f,  100.0f);  
glEnd();
xrot+=xspeed;
yrot+=yspeed;
glutSwapBuffers();
}

如果你仍然和我在一起,我的主要函数和一些变量看起来是这样的:

GLfloat xrot;               
GLfloat yrot;               
GLfloat xspeed;             
GLfloat yspeed;             
GLfloat z=-50.0f;           
bool* keyStates = new bool[256];
int main (int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Test");
for(int i=0; i<=255; i++){ //this is the odd loop I'm referring to
    keyStates[i]=0;
}
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glutDisplayFunc(display);
glutIdleFunc (display);
glutReshapeFunc(reshape);

glutKeyboardFunc(keyPressed);
glutKeyboardUpFunc(keyUp);
glutMainLoop();
}

我在主函数中包含的for循环将整个keyStates数组重置为0。它最终应该具有与glutKeyboardUpFunc相同的效果,但由于某种原因,如果没有这个for循环,keyOperations就无法正常执行。

我已经使用glutKeyboardUpFunc搜索了一些与我相似的代码示例,但在找到明显相似的代码方面进展不顺利。我知道glutKeyboardUpFunc和glutKeyboard Func中的操作只需在到达该代码段时插入某种退出命令即可执行。

如果删除glutReshapeFunc(整形),则此代码应以其当前形式编译;

我的具体问题是:如果没有循环,循环会产生想要的旋转效果,而这种效果似乎不会发生,那该怎么办?如果你知道的话,我该怎么补救?

此外,按a和d键在空白平面上的旋转并不明显,但按w和s键应该会产生一些旋转。您可能需要更改xspeed和yspeed的数量,以便根据计算机的速度使其旋转得更快/更慢。

这个循环会产生想要的旋转效果,如果没有它,这种效果似乎不会发生?

这叫做"初始化数据"。任何分配的内存都是未初始化的(因此包含随机垃圾),除非该类型具有构造函数。而CCD_ 1没有。默认情况下,您正在初始化这个bool数组,这将为它们提供所有垃圾值。

您的循环为它们提供了一个显式值。也就是说,错误。

做你正在做的事情的正确方法是:

bool keyStates[256] = {false};

C++不是Java;您不必动态地分配所有内容。这将创建一个由256个bool元素组成的静态数组。{false}部分将第一个初始化为false;根据C++规则,其余所有成员都进行了值初始化(与默认初始化不同)。初始化的值bool包含false。因此,这将初始化我们所有的bool s。

不需要循环。

顺便说一句,你可能想考虑放弃FreeGLUT,转而使用GLFW。它为你存储了一个适当的关键状态列表,所以你不必自己管理它。如果你正在做这样的事情,你可能正在制作一个应用程序,使用FreeGLUT会遇到其他问题。