cocos2d-x中添加Enter键和方向键按键响应
来源:互联网 发布:淘宝十大cos店铺 编辑:程序博客网 时间:2024/05/22 09:40
原文地址http://blog.csdn.net/keshuiyun/article/details/9788533
最近有个机顶盒项目,需要用到遥控器的方向键在游戏中控制方向。
如果是一般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) {};
- };
其中” 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;
三 cocos2dx\keypad_dispatcher\CCKeypadDispatcher.cpp
修改” dispatchKeypadMSG”函数,在:
- case kTypeMenuClicked:
- pDelegate->keyMenuClicked();
后添加:
- 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);
- }
- }
五 cocos2dx\platform\android\jni\TouchesJni.cpp
找到:
- #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
- 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);
- }
- 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();
- 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键按下
- }
- 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 遥控器 手柄的添加
- 魔术子弹系统启动;的联盟营销谁了大失望的叙事
- Quaternion 学习与应用
- Exchange、Domino、MDaemon、winmail、Postfix等使用邮件中继反复进入CBL,XBL黑名单问题
- 如何创建滑出式导航面板
- 将apache添加为开机启动与编译的httpd不支持chkconfig的解决方法
- cocos2d-x中添加Enter键和方向键按键响应
- C语言 用来清空输入缓存,以便不影响后面输入的东西
- ReportStudio入门教程(六十一) - JS-清空多选框
- 利用过滤器解决jsp中的乱码问题
- vim安装插件
- linux常用命令大全
- JavaScript内存优化
- Kaggle[2] - Predict the click through rate (KDD12 trackl2)
- POJ 1577 Falling Leaves 二叉树题解