2012-03-03 54 views
1

我正在努力讓鍵盤輸入在GLUT中工作,我有很多時間。基本上我的問題是我設置爲與某些鍵相關的操作無法正常工作。Glutkeyboard輸入不註冊沒有奇怪的循環來幫助

這是我的聲明和glutKeyboardFunc的定義和glutKeyboardUpFunc:

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。

我再定義一些事情要做基於這些按鍵:然後

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

} 

keyOperations叫我glutDisplayFunc。

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

如果你在我身邊吧,我的一些變量沿主要功能如下所示:

for循環我已經包括在主函數
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(); 
} 

的重置整個keyStates陣列0.最終應該與glutKeyboardUpFunc具有相同的效果,但由於某些原因,如果沒有for循環,keyOperations將無法正確執行。

我已經搜索了一些類似於我的使用glutKeyboardUpFunc的代碼示例,但它找不到明顯相似的東西。我知道glutKeyboardUpFunc和glutKeyboardFunc中的操作只是在它到達那段代碼時插入某種退出命令來執行。

如果您刪除glutReshapeFunc(reshape),則此代碼應以其當前形式進行編譯;

我的問題具體是:這個for循環是什麼導致所需的旋轉效果,似乎沒有它沒有發生?如果你知道,我該如何解決這個問題?

另外,通過按a和d鍵在空白平面上的旋轉不明顯,但按w和s應該旋轉一些。根據計算機的速度,您可能需要更改xspeed和yspeed的數量以使其旋轉得更快/更慢。

回答

1

這個for循環是什麼引起了期望的旋轉效果,如果沒有它,似乎不會發生?

它被稱爲「初始化您的數據」。任何分配的內存都是未初始化的(因此包含隨機垃圾),除非類型具有構造函數。而bool沒有。你是默認的初始化這個數組bool,這將給他們所有的垃圾值。

您的循環爲它們提供了一個明確的值。即,錯誤。

做你正在做什麼正確的方法是這樣的:

bool keyStates[256] = {false}; 

C++是不是Java;您不必動態分配所有內容。這將創建一個元素的靜態數組。{false}部分將第一個初始化爲false;通過C++規則,其餘所有成員都進行了值初始化(與默認初始化不同)。初始化值bool包含false。所以這初始化了我們所有的bool

不需要循環。

順便說一句,你可能要考慮開溜FreeGLUT GLFW。它爲你存儲一個關鍵狀態的適當列表,所以你不必自己管理它。如果你正在做這樣的事情,你可能正在製作一個應用程序,你會遇到其他使用FreeGLUT的問題。

+0

啊,謝謝,現在我覺得我可能認識到這一點,當我第一次添加循環。我會研究GLFW。實際上,這個項目(我剝去了大部分代碼)只是在很短的時間內完成的,我已經試圖將我們的代碼從WinAPI轉換爲freeglut,因爲我們真的獲得了我們在opengl和window方面的第一次經驗管理等。 – Cerin 2012-03-03 05:13:25