2010-09-04 60 views
3

我正在使用GLUT並開發一個FPS遊戲。我需要一種方法來捕捉鼠標,以便相機繼續移動,因爲現在當鼠標位置超出監視器限制時,無法計算X中的變化或Y中的變化。我怎樣才能「捕捉」鼠標GLUT?誘捕鼠標?

感謝

+1

有趣的標題... hehehe ... – 2010-09-04 19:51:38

+5

使用捕鼠器。咄。 – BoltClock 2010-09-04 19:58:45

+1

@BoltClock:別忘了奶酪。 – 2010-09-04 20:04:28

回答

3

我建議用現成的發動機一樣OGRE 3D代替,但如果你真的要推倒重來,這裏的如何...

在所有情況下,我所知道的,PC FPS遊戲通過註冊鼠標動作回調來「捕捉」指針,注意相對運動,然後將指針變回到窗口中心。

下面是一些代碼我寫的鼠標輸入添加到樣品乒乓球檯在OpenGL與C++課程一年或兩年前:

void resetPointer() { 
    glutWarpPointer(TABLE_X/2, TABLE_Y/2); 
    lastMousePos = TABLE_Y/2; 
} 

void mouseFunc(int sx, int sy) { 
    if (!started) { return; } 
    int vertMotion = lastMousePos - sy; 
    lastMousePos = sy; 
    player1.move(vertMotion); 

    // Keep the pointer from leaving the window. 
    if (fabs(TABLE_X/2 - sx) > 25 || fabs(TABLE_Y/2 - sy) > 25) { 
     resetPointer(); 
    } 
} 

// This goes in with your "start new game" code if you want a menu 
resetPointer(); 
glutSetCursor(GLUT_CURSOR_NONE); 
glutPassiveMotionFunc(mouseFunc); 

,只會追蹤垂直運動,但添加水平是微不足道。

+0

「if(fabs(TABLE_X/2-sx)> 25 || fabs(TABLE_Y/2-sy)> 25)」是什麼意思?爲什麼不在每一幀中更換鼠標? – Calvin1602 2010-09-09 10:54:30

+0

從技術上講,框架和鼠標移動事件並不是一回事。無論如何,我不記得確切,但我認爲這是爲了防止XWarpPointer(glutWarpPointer在Linux上使用)成爲一個問題。示例代碼的基於時間間隔的計時大大地擴大了存在的任何性能問題,並且我沒有時間完全重寫它。 – ssokolow 2010-09-09 19:28:59