→ 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