cocos2d-x中新增TV按鍵響應
最近有個機頂盒專案,需要用到遙控器的方向鍵在遊戲中控制方向。
如果是一般Android裝置、iOS裝置或Win32平臺,cocos2d-x提供了“CCAccelerometer”類,可用於遊戲控制UI。但由於機頂盒在使用過程中是使用遙控器與玩家互動,而遙控器中缺少GSenser,所以只能暫時使用方向鍵和中鍵。好在機頂盒廠家使用了Android標準的鍵值,方向鍵和中鍵與Andriod DPAD按鍵一一對應。
下面講一下如何修改cocos2d-x,以使我們在遊戲中能感知DPAD按鍵訊息。
一 修改cocos2dx\keypad_dispatcher\CCKeypadDelegate.h
為” CCKeypadDelegate”新增2個虛擬函式,完成後為:
[cpp] view plaincopy
- class CC_DLL CCKeypadDelegate
- {
- public:
- // The back key clicked
- virtual void keyBackClicked() {}
- // The menu key clicked. only available on wophone & android
- virtual void keyMenuClicked() {};
- // The enter key clicked. only available on win32 & android
- virtual void keyEnterClicked() {};
- // The arrow key clicked. only available on win32 & android
- virtual void keyArrowClicked(int arrow) {};
- };
其中” keyEnterClicked”函式用於響應”Enter”鍵,”keyArrowClicked”函式用於響應方向鍵訊息。
二 cocos2dx\keypad_dispatcher\CCKeypadDispatcher.h
修改列舉 ccKeypadMSGType的定義為:
[cpp] view plaincopy
- typedef enum {
- // the back key clicked msg
- kTypeBackClicked = 1,
- // the menu key clicked msg
- kTypeMenuClicked,
- // the Enter key clicked msg
- kTypeEnterClicked,
- // the arrow key clicked msg
- kTypeLeftArrowClicked,
- kTypeUpArrowClicked,
- kTypeRightArrowClicked,
- kTypeDownArrowClicked,
- } ccKeypadMSGType;
三 cocos2dx\keypad_dispatcher\CCKeypadDispatcher.cpp
修改” dispatchKeypadMSG”函式,在:
[cpp] view plaincopy
- case kTypeMenuClicked:
- pDelegate->keyMenuClicked();
後新增:
[cpp] view plaincopy
- case kTypeEnterClicked:
- pDelegate->keyEnterClicked();
- break;
- case kTypeLeftArrowClicked:
- case kTypeUpArrowClicked:
- case kTypeRightArrowClicked:
- case kTypeDownArrowClicked:
- pDelegate->keyArrowClicked(nMsgType);
- break;
針對Android平臺還需要一下修改:
四 cocos2dx\platform\android\java\src\org\cocos2dx\lib\Cocos2dxGLSurfaceView.java
找到” onKeyDown”函式,在其中新增幾個鍵值處理,使函式如下:
[java] view plaincopy
- @Override
- public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
- switch (pKeyCode) {
- case KeyEvent.KEYCODE_BACK:
- case KeyEvent.KEYCODE_MENU:
- case KeyEvent.KEYCODE_DPAD_UP: // 19
- case KeyEvent.KEYCODE_DPAD_DOWN: // 20
- case KeyEvent.KEYCODE_DPAD_LEFT: // 21
- case KeyEvent.KEYCODE_DPAD_RIGHT: // 22
- case KeyEvent.KEYCODE_DPAD_CENTER: // 23
- this.queueEvent(new Runnable() {
- @Override
- public void run() {
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
- }
- });
- return true;
- default:
- return super.onKeyDown(pKeyCode, pKeyEvent);
- }
- }
*注意:專案目錄中proj.android\src\org\cocos2dx\lib\Cocos2dxGLSurfaceView.java需要修改與此相同。
五 cocos2dx\platform\android\jni\TouchesJni.cpp
找到:
[cpp] view plaincopy
- #define KEYCODE_BACK 0x04
- #define KEYCODE_MENU 0x52
緊接著在下面新增:
[cpp] view plaincopy
- #define KEYCODE_DPAD_UP 19
- #define KEYCODE_DPAD_DOWN 20
- #define KEYCODE_DPAD_LEFT 21
- #define KEYCODE_DPAD_RIGHT 22
- #define KEYCODE_DPAD_CENTER 23
然後修改”Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown”函式,如下:
[cpp] view plaincopy
- JNIEXPORT jboolean JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown(JNIEnv * env, jobject thiz, jint keyCode) {
- CCDirector* pDirector = CCDirector::sharedDirector();
- switch (keyCode) {
- case KEYCODE_BACK:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_MENU:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeMenuClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_DPAD_UP:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeUpArrowClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_DPAD_DOWN:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeDownArrowClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_DPAD_LEFT:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeLeftArrowClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_DPAD_RIGHT:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeRightArrowClicked))
- return JNI_TRUE;
- break;
- case KEYCODE_DPAD_CENTER:
- if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeEnterClicked))
- return JNI_TRUE;
- break;
- default:
- return JNI_FALSE;
- }
- return JNI_FALSE;
- }
至此Android平臺修改完成。
為了方便我們在VS2010中開發,還有針對Win32平臺進行修改:
六 cocos2dx\platform\win32\CCEGLView.cpp
找到”WindowProc”函式,找到:
[cpp] view plaincopy
- if (wParam == VK_F1 || wParam == VK_F2)
- {
- CCDirector* pDirector = CCDirector::sharedDirector();
- if (GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0)
- pDirector->getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked);
- }
- else if (wParam == VK_ESCAPE)
- {
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked);
- }
緊接著在後邊新增:
[cpp] view plaincopy
- else if (wParam == VK_RETURN)
- {
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeEnterClicked);
- }
- else if (wParam >= VK_LEFT && wParam <= VK_DOWN)
- {
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG((ccKeypadMSGType)(kTypeLeftArrowClicked + wParam - VK_LEFT));
- }
好,現在Win32平臺也新增完成了,程式中可以響應鍵盤上的方向鍵和Enter鍵。
使用方法如下:
假設我們要在繼承自CCLayer的HelloWorld中相應按鍵,那麼首先在HelloWorld的標頭檔案中新增兩個函式:
[cpp] view plaincopy
- void keyArrowClicked(int arrow);
- void keyEnterClicked();
然後,在HelloWorld初始化時啟用按鍵功能:
[cpp] view plaincopy
- setKeypadEnabled(true);
在HelloWorld中實現之前宣告的2個虛擬函式:
[cpp] view plaincopy
- void LLPlaneControlLayer::keyArrowClicked(int arrow)
- {
- if (arrow == kTypeLeftArrowClicked)
- {
- // 左方向鍵按下
- }
- else if (arrow == kTypeRightArrowClicked)
- {
- // 右方向鍵按下
- }
- if (arrow == kTypeUpArrowClicked)
- {
- // 上方向鍵按下
- }
- else if (arrow == kTypeDownArrowClicked)
- {
- // 下方向鍵按下
- }
- }
- void LLPlaneControlLayer::keyEnterClicked()
- {
- // Enter鍵按下
- }
當使用者按下方向鍵,keyArrowClicked會被執行,引數arrow表示按下的鍵;當使用者按下Enter鍵(Android平臺為DPAD_CENTER鍵),keyEnterClicked函式會執行。
相關文章
- textarea 響應按下Enter鍵
- 滑鼠按鍵響應越快越好嗎?
- win10系統按win鍵沒響應反應的解決方法Win10
- UWP 響應鍵盤組合快捷鍵
- 按鍵中斷驅動程式
- LVGL中實體按鍵的使用
- win10系統下鍵盤按F5重新整理鍵響應遲鈍如何解決Win10
- vxe-table 實現按Enter鍵自動新增一行
- android音視訊指南-響應媒體按鈕Android
- 按鍵原理
- 三行程式碼按鍵消抖 獨立按鍵 矩陣按鍵 長按 短按 雙擊行程矩陣
- 如何給 SAP Fiori Elements 應用新增自定義按鈕
- 上手做一個華為鴻蒙手錶應用 2 - 在主頁新增一個按鈕並響應點選事件鴻蒙事件
- idea 格式化快捷鍵按了無反應Idea
- Android按下返回鍵,將應用退到後臺Android
- [譯] 用 Flutter 實現 Facebook 的響應式按鈕Flutter
- 在 js 裡定義按鈕的響應函式JS函式
- iOS Tabbar中間新增凸起可旋轉按鈕iOStabBar
- 在全志T507開發板上新增兩個GPIO按鍵
- 鍵盤失靈按什麼鍵恢復 win10鍵盤恢復按鍵Win10
- [JS]bootstrapTable新增操作按鈕JSbootAPT
- AndroidTV開發中所有的遙控器按鍵監聽及注意事項,新增home鍵監聽Android
- 【esp32 專案】中斷讀取按鍵
- SpringBoot中的響應式web應用Spring BootWeb
- 12.2 實現鍵盤模擬按鍵
- Android TV開發——RecyclerView For TVAndroidView
- win10鍵盤按鍵速度在哪裡設定_win10鍵盤按鍵速度如何設定Win10
- Android Jetpack - Android TV 應用開發教程AndroidJetpack
- 【JavaScript】鍵盤按鍵Keycode對照表(鍵碼對照表)JavaScript
- 925. 長按鍵入
- nodemcu arduino設定按鍵UI
- iOS 11開發教程(二十一)iOS11應用檢視美化按鈕之實現按鈕的響應(1)iOS
- 亞馬遜釋出Fire TV Cube:機頂盒+智慧音響亞馬遜
- win10鍵盤部分按鍵錯亂怎麼辦_win10鍵盤按鍵錯亂如何解決Win10
- windows鍵按了沒反應怎麼辦 windows鍵被鎖失靈的解決方法Windows
- win10開始鍵按了沒反應怎麼辦_win10鍵盤選單鍵沒反應了修復方法Win10
- 鍵盤裝置執行正常卻不能打字如何解決 鍵盤全沒反應了按什麼鍵
- 戴爾進入bios按什麼鍵 戴爾重灌系統按什麼鍵iOS