2014-02-26 74 views
0

對於一個C++/OpenGL遊戲,我讓我既想要鍵盤輸入處理程序,又想要不斷更新屏幕,因爲遊戲中存在不斷移動的部分。 現在我讀過了,我可以使用glutKeyboardFunc()作爲鍵盤監聽器,並且可以使用一個簡單的while循環來更新常量(gameRunning {...})。帶鍵盤監聽器的遊戲循環

但是我怎樣才能將兩者結合起來,因爲如果我使用while循環,關鍵聽者將永遠不會被調用,因爲遊戲仍在運行while循環。

+0

爲什麼以前沒有把它開始循環? – Eejin

回答

0

看來你正在尋找glutIdleFunc你將有一個不斷的屏幕更新(記得在最後調用glutPostRedisplay)。雖然你不會有固定的時間步長(但不能保證以固定的時間間隔被調用)。必須閱讀fix your timestep

恕我直言,你需要溝通所有在一起,並得到像SDL或GLFW更好的圖書館。

1

This tutorial at Lighthouse3d.com涵蓋了你所說的一切。關鍵觀察:您不使用自己的'while'循環來創建動畫。該循環內置於函數glutMainLoop()中,一旦將所有設置完成,您就可以調用該函數。

0

您可以使用多個線程,一個用於顯示,一個用於鍵盤捕獲,另一個用於物理更新。如果物理需要在固定頻率運行,這裏是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 */ 
     } 
    }