日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HGE2D引擎按键消息分析(续)

發布時間:2024/7/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HGE2D引擎按键消息分析(续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

繼續上一章對其按鍵消息處理抽絲剝繭。看BuildEvent()函數里面

?

我們先來分析其這段代碼

?

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;}

?

?

再看外面怎么調用的

?

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;

?

所有鍵盤按鍵響應,都會響應WM_SYSKEYDOWN消息,這里的INPUT_KEYDOWN和INPUT_KEYUP已經包括了特殊系統按鍵,即TAB,CTRL,ALT;

?

除此之外,還有很重要的東西,那就是關于keyz數組的應用。

這個就是表格驅動法的典型應用(引自【代碼大全】)

?

思想就是將按鍵的鍵值和鼠標的左,中, 右三個鍵值看做一個維度,將按鍵行為作為另一個維度。

我們可以看到代碼中就是把鍵值作為數組的下標,數組元素初始化為0,

用和0x01,0x10的或操作來記錄DOWN和UP的行為。

?

這樣做的好處便于數據表的維護,不至于添加新的鍵值或者修改舊的鍵值的同時,需要去維護一大堆if else邏輯代替的代碼。

同時在整個代碼設計上來說,實現了新的分層,將行為層與邏輯處理層分隔開,符合內聚原則。

?

?

我們可以看到外面需要獲取按鍵情況的時候,接口如下:

?

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; }

?

其中傳進來的key值就是一個代表是左鍵按下或者右鍵按下的值。

再想想,我們完全可以把這種處理放到我們的程序中,并作為一個單件使用。

總結

以上是生活随笔為你收集整理的HGE2D引擎按键消息分析(续)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。