cocos2d-x中添加Enter键和方向键按键响应
来源:互联网 发布:速卖通产品数据分析 编辑:程序博客网 时间:2024/05/01 08:52
最近有个机顶盒项目,需要用到遥控器的方向键在游戏中控制方向。
如果是一般Android设备、iOS设备或Win32平台,cocos2d-x提供了“CCAccelerometer”类,可用于游戏控制UI。但由于机顶盒在使用过程中是使用遥控器与玩家交互,而遥控器中缺少GSenser,所以只能暂时使用方向键和中键。好在机顶盒厂家使用了Android标准的键值,方向键和中键与Andriod DPAD按键一一对应。
下面讲一下如何修改cocos2d-x,以使我们在游戏中能感知DPAD按键消息。
一 修改cocos2dx\keypad_dispatcher\CCKeypadDelegate.h
为” CCKeypadDelegate”添加2个虚函数,完成后为:
- 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) {};
- };
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的定义为:
- 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;
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”函数,在:
- case kTypeMenuClicked:
- pDelegate->keyMenuClicked();
case kTypeMenuClicked: pDelegate->keyMenuClicked();
后添加:
- case kTypeEnterClicked:
- pDelegate->keyEnterClicked();
- break;
- case kTypeLeftArrowClicked:
- case kTypeUpArrowClicked:
- case kTypeRightArrowClicked:
- case kTypeDownArrowClicked:
- pDelegate->keyArrowClicked(nMsgType);
- break;
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”函数,在其中添加几个键值处理,使函数如下:
- @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);
- }
- }
@Overridepublic boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {switch (pKeyCode) {case KeyEvent.KEYCODE_BACK:case KeyEvent.KEYCODE_MENU:case KeyEvent.KEYCODE_DPAD_UP:// 19case KeyEvent.KEYCODE_DPAD_DOWN:// 20case KeyEvent.KEYCODE_DPAD_LEFT:// 21case KeyEvent.KEYCODE_DPAD_RIGHT:// 22case KeyEvent.KEYCODE_DPAD_CENTER:// 23this.queueEvent(new Runnable() {@Overridepublic void run() {Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);}});return true;default:return super.onKeyDown(pKeyCode, pKeyEvent);}}
五 cocos2dx\platform\android\jni\TouchesJni.cpp
找到:
- #define KEYCODE_BACK 0x04
- #define KEYCODE_MENU 0x52
#define KEYCODE_BACK 0x04 #define KEYCODE_MENU 0x52
紧接着在下面添加:
- #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
#define KEYCODE_DPAD_UP19 #define KEYCODE_DPAD_DOWN20 #define KEYCODE_DPAD_LEFT21 #define KEYCODE_DPAD_RIGHT22 #define KEYCODE_DPAD_CENTER23
- 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;
- }
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; }
为了方便我们在VS2010中开发,还有针对Win32平台进行修改:
六 cocos2dx\platform\win32\CCEGLView.cpp
找到”WindowProc”函数,找到:
- 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);
- }
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); }
- 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));
- }
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));}
使用方法如下:
假设我们要在继承自CCLayer的HelloWorld中相应按键,那么首先在HelloWorld的头文件中添加两个函数:
- void keyArrowClicked(int arrow);
- void keyEnterClicked();
void keyArrowClicked(int arrow);void keyEnterClicked();
- setKeypadEnabled(true);
setKeypadEnabled(true);
- void LLPlaneControlLayer::keyArrowClicked(int arrow)
- {
- if (arrow == kTypeLeftArrowClicked)
- {
- // 左方向键按下
- }
- else if (arrow == kTypeRightArrowClicked)
- {
- // 右方向键按下
- }
- if (arrow == kTypeUpArrowClicked)
- {
- // 上方向键按下
- }
- else if (arrow == kTypeDownArrowClicked)
- {
- // 下方向键按下
- }
- }
- void LLPlaneControlLayer::keyEnterClicked()
- {
- // Enter键按下
- }
void LLPlaneControlLayer::keyArrowClicked(int arrow){if (arrow == kTypeLeftArrowClicked){// 左方向键按下}else if (arrow == kTypeRightArrowClicked){// 右方向键按下}if (arrow == kTypeUpArrowClicked){// 上方向键按下}else if (arrow == kTypeDownArrowClicked){// 下方向键按下}}void LLPlaneControlLayer::keyEnterClicked(){// Enter键按下}
- cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应
- (转)cocos2d-x中添加Enter键和方向键按键响应
- cocos2d-x中添加Enter键和方向键按键响应 (转)
- cocos2d-x中添加TV按键响应
- Android中Cocos2d-X引擎响应按键消息
- cocos2d-x在android中按键触发
- cocos2dx实现电脑Enter、Escape、方向键的响应
- cocos2d-x在android中响应返回键
- cocos2d-x在android中响应返回键
- cocos2d-x在Linux平台上添加按键监听
- Cocos2d-x 添加安卓按键监听事件
- Cocos2d-x键盘按键
- cocos2d-x 响应android TV 遥控器 手柄的添加
- adb shell am 的用法
- strtok学习实例
- Invalid action class configuration that references an unknown class named错误解决
- mssqlserver2008 收缩日志文件
- Qt主窗口没有最小化,最大化按钮且最大化显示
- cocos2d-x中添加Enter键和方向键按键响应
- 摄像头测脉搏的原理
- 矩阵的求逆
- 利用摄像头做一个手写书法程序(设想)
- Oracle Data Security - Advanced Security
- 人力资源总监面试时是怎么想的?
- 关于web页面播放声音
- 个人电脑配置外网可以访问服务器
- 深入浅出Swing事件分发线程