對於一個C++/OpenGL遊戲,我讓我既想要鍵盤輸入處理程序,又想要不斷更新屏幕,因爲遊戲中存在不斷移動的部分。 現在我讀過了,我可以使用glutKeyboardFunc()作爲鍵盤監聽器,並且可以使用一個簡單的while循環來更新常量(gameRunning {...})。帶鍵盤監聽器的遊戲循環
但是我怎樣才能將兩者結合起來,因爲如果我使用while循環,關鍵聽者將永遠不會被調用,因爲遊戲仍在運行while循環。
對於一個C++/OpenGL遊戲,我讓我既想要鍵盤輸入處理程序,又想要不斷更新屏幕,因爲遊戲中存在不斷移動的部分。 現在我讀過了,我可以使用glutKeyboardFunc()作爲鍵盤監聽器,並且可以使用一個簡單的while循環來更新常量(gameRunning {...})。帶鍵盤監聽器的遊戲循環
但是我怎樣才能將兩者結合起來,因爲如果我使用while循環,關鍵聽者將永遠不會被調用,因爲遊戲仍在運行while循環。
看來你正在尋找glutIdleFunc你將有一個不斷的屏幕更新(記得在最後調用glutPostRedisplay
)。雖然你不會有固定的時間步長(但不能保證以固定的時間間隔被調用)。必須閱讀fix your timestep。
恕我直言,你需要溝通所有在一起,並得到像SDL或GLFW更好的圖書館。
This tutorial at Lighthouse3d.com涵蓋了你所說的一切。關鍵觀察:您不使用自己的'while'循環來創建動畫。該循環內置於函數glutMainLoop()
中,一旦將所有設置完成,您就可以調用該函數。
您可以使用多個線程,一個用於顯示,一個用於鍵盤捕獲,另一個用於物理更新。如果物理需要在固定頻率運行,這裏是Windows XP或更高版本的使用,如果高頻率計數器和睡眠的代碼片段也有足夠的「空閒」時間:
typedef unsigned long long UI64; /* unsigned 64 bit int */
#define FREQ 400 /* 400 hz */
static LARGE_INTEGER liPerfFreq; /* 64 bit frequency */
LARGE_INTEGER liPerfTemp; /* used for query */
UI64 uFreq = FREQ; /* process frequency */
UI64 uOrig; /* original tick */
UI64 uWait; /* tick rate/freq */
UI64 uRem = 0; /* tick rate % freq */
UI64 uPrev; /* previous tick based on original tick */
UI64 uDelta; /* current tick - previous */
UI64 u2ms; /* 2ms of ticks */
UI64 i;
timeBeginPeriod(1); /* set period to 1ms */
Sleep(128); /* wait for it to stabilize */
u2ms = ((UI64)(liPerfFreq.QuadPart)+499)/((UI64)500);
QueryPerformanceCounter(&liPerfTemp);
uOrig = uPrev = liPerfTemp.QuadPart;
for(i = 0; i < (uFreq*30); i++){
/* physics step code goes here */
/* update uWait and uRem based on uRem */
uWait = ((UI64)(liPerfFreq.QuadPart) + uRem)/uFreq;
uRem = ((UI64)(liPerfFreq.QuadPart) + uRem) % uFreq;
/* wait for uWait ticks */
while(1){
QueryPerformanceCounter(&liPerfTemp);
uDelta = (UI64)(liPerfTemp.QuadPart - uPrev);
if(uDelta >= uWait)
break;
if((uWait - uDelta) > u2ms)
Sleep(1); /* up to 2ms on win xp */
}
}
爲什麼以前沒有把它開始循環? – Eejin