HGE2D引擎按键消息分析(续)
繼續(xù)上一章對(duì)其按鍵消息處理抽絲剝繭。看BuildEvent()函數(shù)里面
?
我們先來(lái)分析其這段代碼
?
if(type==INPUT_KEYDOWN){if((flags & HGEINP_REPEAT) == 0) keyz[key] |= 1;ToAscii(key, scan, kbstate, (unsigned short *)&eptr->event.chr, 0);}if(type==INPUT_KEYUP){keyz[key] |= 2;ToAscii(key, scan, kbstate, (unsigned short *)&eptr->event.chr, 0);}if(type==INPUT_MOUSEWHEEL){eptr->event.key=0; eptr->event.wheel=key;ScreenToClient(hwnd,&pt);}else { eptr->event.key=key; eptr->event.wheel=0; }if(type==INPUT_MBUTTONDOWN){keyz[key] |= 1;SetCapture(hwnd);bCaptured=true;}if(type==INPUT_MBUTTONUP){keyz[key] |= 2;ReleaseCapture();Input_SetMousePos(Xpos, Ypos);pt.x=(int)Xpos; pt.y=(int)Ypos;bCaptured=false;}
?
?
再看外面怎么調(diào)用的
?
case WM_SYSKEYDOWN:if(wparam == VK_F4){if(pHGE->procExitFunc && !pHGE->procExitFunc()) return FALSE;return DefWindowProc(hwnd, msg, wparam, lparam);}else if(wparam == VK_RETURN){pHGE->System_SetState(HGE_WINDOWED, !pHGE->System_GetState(HGE_WINDOWED));return FALSE;}else{pHGE->_BuildEvent(INPUT_KEYDOWN, wparam, HIWORD(lparam) & 0xFF, (lparam & 0x40000000) ? HGEINP_REPEAT:0, -1, -1);return FALSE;}case WM_KEYDOWN:pHGE->_BuildEvent(INPUT_KEYDOWN, wparam, HIWORD(lparam) & 0xFF, (lparam & 0x40000000) ? HGEINP_REPEAT:0, -1, -1);return FALSE;
?
所有鍵盤(pán)按鍵響應(yīng),都會(huì)響應(yīng)WM_SYSKEYDOWN消息,這里的INPUT_KEYDOWN和INPUT_KEYUP已經(jīng)包括了特殊系統(tǒng)按鍵,即TAB,CTRL,ALT;
?
除此之外,還有很重要的東西,那就是關(guān)于keyz數(shù)組的應(yīng)用。
這個(gè)就是表格驅(qū)動(dòng)法的典型應(yīng)用(引自【代碼大全】)
?
思想就是將按鍵的鍵值和鼠標(biāo)的左,中, 右三個(gè)鍵值看做一個(gè)維度,將按鍵行為作為另一個(gè)維度。
我們可以看到代碼中就是把鍵值作為數(shù)組的下標(biāo),數(shù)組元素初始化為0,
用和0x01,0x10的或操作來(lái)記錄DOWN和UP的行為。
?
這樣做的好處便于數(shù)據(jù)表的維護(hù),不至于添加新的鍵值或者修改舊的鍵值的同時(shí),需要去維護(hù)一大堆if else邏輯代替的代碼。
同時(shí)在整個(gè)代碼設(shè)計(jì)上來(lái)說(shuō),實(shí)現(xiàn)了新的分層,將行為層與邏輯處理層分隔開(kāi),符合內(nèi)聚原則。
?
?
我們可以看到外面需要獲取按鍵情況的時(shí)候,接口如下:
?
bool CALL HGE_Impl::Input_KeyDown(int key) {return (keyz[key] & 1) != 0; }bool CALL HGE_Impl::Input_KeyUp(int key) {return (keyz[key] & 2) != 0; }
?
其中傳進(jìn)來(lái)的key值就是一個(gè)代表是左鍵按下或者右鍵按下的值。
再想想,我們完全可以把這種處理放到我們的程序中,并作為一個(gè)單件使用。
總結(jié)
以上是生活随笔為你收集整理的HGE2D引擎按键消息分析(续)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Guice基本用法
- 下一篇: WinSock I/O 模型 -- IO