看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《winston1215 (Winston)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : windows : 大神告訴我說用thread(執行緒) 恕刪
winston1215:還是不太懂XD 因為我的遊戲裡會有getch的指令01/02 06:38
winston1215:這樣不會因為抓鍵盤的指令而有所停頓嗎?01/02 06:39
1. 推文裡 LPH 大之意見要參透,我估你的遊戲用不到多行緒。 2. 如果你有硬體設計經驗的話,可以想想「鍵盤防彈跳」是怎麼做的, 軟體實作上可以用類似概念。 3. 如果時間夠的話可考慮架構改用 Console Functions 做, 原因是只要用到 getch,基本上這遊戲應該是做不出來 4. 以下範例為:在 Console 中顯示 * ,接受↓↑→← 控制改變位置, 具「連擊」的效果 (一直按↑就會一直跑),要改具「組合鍵」的效果也可。 5. 指令以 C language 為主 (其實也只有 putchar 是 C), 不加以封裝類別。 --- 一般而言在設計 Console 動態遊戲,像俄羅斯方塊、貪食蛇等, 絕不會用 getch 等類似相關指令,原因在於它們是阻塞式的等待 user 輸入, 所使用的指令反而是以下幾個 kbhit、GetAsyncKeyState、ReadConsoleInput 接著有幾個東西要講,像要指定游標位置的話,去翻 Win32 Console Functions, 寫出來大概長如此 #define HOUT (GetStdHandle(STD_OUTPUT_HANDLE)) #define HIN (GetStdHandle( STD_INPUT_HANDLE)) void gotoxy(const int x, const int y) { COORD point={x,y}; SetConsoleCursorPosition(HOUT,point); } 而 main 裡面,對於 keyin 偵測掌握一個原則: 使用 kbhit 與 ReadConsoleInput 去「主動查看目前鍵盤的狀況」, 而不是 「被動等待使用者輸入」,同時這部份最好另外寫成 key_control() 部份整體架構適合這麼做 const int Flex = 20; // 鍵盤連擊的流暢度 const int Delay = 20; // 每次延時, ms while(1) { for(int i=0; i<Flex; ++i) { if(kbhit()) { // 有按下鍵盤 key_control(); // 呼叫 key_control } Sleep(Delay); // 延時 } } 而 key_control 等於是你自己要寫的 key <---> function 對應表 // -------------------- void key_control() { static DWORD count; static INPUT_RECORD ir; ReadConsoleInput (HIN, &ir, 1, &count); if (!ir.Event.KeyEvent.bKeyDown) return; switch (ir.Event.KeyEvent.wVirtualKeyCode) { case VK_ESCAPE: Exit = true; break; case VK_DOWN :Down(); break; case VK_LEFT :Left(); break; case VK_RIGHT:Right(); break; case VK_UP :Up(); break; } } 上面的 ReadConsoleInput、INPUT_RECORD 看不懂的話上 msdn 查 (文末附網址)。 如果要加上計時 3 secs 沒按就結束的話就很簡單了,從剛剛的 while 那裡下手 clock_t t=clock(); while(1) { for(int i=0; i<Flex; ++i) { if(kbhit()) { // 有按下鍵盤 t = clock(); // 重新計時 key_control(); // 呼叫 key_control } Sleep(Delay); // 延時 } if((double)(clock() - t) / CLK_TCK > 3.0) break; // 判斷歷時 } 此部份範例程式碼大致如此 http://codepad.org/qV4nZln0 我跑起來還蠻順的。 ----- Reference Win32 Console Functions : http://0rz.tw/mFiGU Console Functions 一些封裝 : http://0rz.tw/SRiKk kbhit : http://0rz.tw/4aalF GetAsyncKeyState : http://0rz.tw/Z6kK ReadConsoleInput : http://0rz.tw/F5qXn -- 世界上有種, 不可能 轉換為 無限可能 的強大力量, 我稱它為 - 信念 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.201
diabloevagto:(worship) 01/02 10:28
winston1215:真得很謝謝你優 講的真得很詳細呢! 01/02 13:10
cory8249: 推 11/01 04:28