最近有个机顶盒项目,需要用到遥控器的方向键在游戏中控制方向。
如果是一般Android设备、iOS设备或Win32平台,cocos2d-x提供了“CCAccelerometer”类,可用于游戏控制UI。但由于机顶盒在使用过程中是使用遥控器与玩家交互,而遥控器中缺少GSenser,所以只能暂时使用方向键和中键。好在机顶盒厂家使用了Android标准的键值,方向键和中键与Andriod DPAD按键一一对应。
下面讲一下如何修改cocos2d-x,以使我们在游戏中能感知DPAD按键消息。
一 修改cocos2dxkeypad_dispatcherCCKeypadDelegate.h
为” CCKeypadDelegate”添加2个虚函数,完成后为:
- classCC_DLLCCKeypadDelegate
- {
- public:
-
- virtualvoidkeyBackClicked(){}
-
-
- voidkeyMenuClicked(){};
-
- //Theenterkeyclicked.onlyavailableonwin32&android
- voidkeyEnterClicked(){};
- //Thearrowkeyclicked.onlyavailableonwin32&android
- voidkeyArrowClicked(intarrow){};
- };
其中” keyEnterClicked”函数用于响应”Enter”键,”keyArrowClicked”函数用于响应方向键消息。
二 cocos2dxkeypad_dispatcherCCKeypadDispatcher.h
修改枚举 ccKeypadMSGType的定义为:
copy
typedefenum{
- //thebackkeyclickedmsg
- kTypeBackClicked=1,
- //themenukeyclickedmsg
- kTypeMenuClicked,0); background-color:inherit">//theEnterkeyclickedmsg
- kTypeEnterClicked,0); background-color:inherit">//thearrowkeyclickedmsg
- kTypeLeftArrowClicked,248)"> kTypeUpArrowClicked,
- kTypeRightArrowClicked,248)"> kTypeDownArrowClicked,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> }ccKeypadMSGType;
三 cocos2dxkeypad_dispatcherCCKeypadDispatcher.cpp 修改” dispatchKeypadMSG”函数,在:
copy
casekTypeMenuClicked:
- pDelegate->keyMenuClicked();
后添加:
copy
casekTypeEnterClicked:
- pDelegate->keyEnterClicked();
- break;
- casekTypeLeftArrowClicked:
- casekTypeUpArrowClicked:
- casekTypeRightArrowClicked:
- casekTypeDownArrowClicked:
- pDelegate->keyArrowClicked(nMsgType);
- break;
针对Android平台还需要一下修改:
四cocos2dxplatformandroidjavasrcorgcocos2dxlibCocos2dxGLSurfaceView.java 找到” onKeyDown”函数,在其中添加几个键值处理,使函数如下:
@Override
- publicbooleanonKeyDown(finalintpKeyCode,finalKeyEventpKeyEvent){
- switch(pKeyCode){
- caseKeyEvent.KEYCODE_BACK:
- caseKeyEvent.KEYCODE_MENU:
- caseKeyEvent.KEYCODE_DPAD_UP:
- caseKeyEvent.KEYCODE_DPAD_DOWN:
- caseKeyEvent.KEYCODE_DPAD_LEFT:
- caseKeyEvent.KEYCODE_DPAD_RIGHT:
- caseKeyEvent.KEYCODE_DPAD_CENTER:
- this.queueEvent(newRunnable(){
- @Override
- voidrun(){
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
- }
- });
- returntrue;
- default:
- super.onKeyDown(pKeyCode,pKeyEvent);
- }
- }
*注意
:项目目录中proj.androidsrcorgcocos2dxlibCocos2dxGLSurfaceView.java需要修改与此相同。
五 cocos2dxplatformandroidjniTouchesJni.cpp
找到:
copy
#defineKEYCODE_BACK0x04
- #defineKEYCODE_MENU0x52
紧接着在下面添加:
copy
#defineKEYCODE_DPAD_UP19
- #defineKEYCODE_DPAD_DOWN20
- #defineKEYCODE_DPAD_LEFT21
- #defineKEYCODE_DPAD_RIGHT22
- #defineKEYCODE_DPAD_CENTER23
然后修改”Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown”函数,如下:
copy
JNIEXPORTjbooleanJNICALLJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown(JNIEnv*env,jobjectthiz,jintkeyCode){
- CCDirector*pDirector=CCDirector::sharedDirector();
- switch(keyCode){
- caseKEYCODE_BACK:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked))
- returnJNI_TRUE;
- caseKEYCODE_MENU:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeMenuClicked))
- caseKEYCODE_DPAD_UP:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeUpArrowClicked))
- caseKEYCODE_DPAD_DOWN:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeDownArrowClicked))
- caseKEYCODE_DPAD_LEFT:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeLeftArrowClicked))
- caseKEYCODE_DPAD_RIGHT:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeRightArrowClicked))
- caseKEYCODE_DPAD_CENTER:
- if(pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeEnterClicked))
- returnJNI_FALSE;
- }
至此Android平台修改完成。
为了方便我们在VS2010中开发,还有针对Win32平台进行修改:
六 cocos2dxplatformwin32CCEGLView.cpp
找到”WindowProc”函数,找到:
copy
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);
- elseif(wParam==VK_ESCAPE)
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked);
- 紧接着在后边添加:
copy
if(wParam==VK_RETURN)
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeEnterClicked);
- if(wParam>=VK_LEFT&&wParam<=VK_DOWN)
- CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG((ccKeypadMSGType)(kTypeLeftArrowClicked+wParam-VK_LEFT));
- 好,现在Win32平台也添加完成了,程序中可以响应键盘上的方向键和回车键。
使用方法如下:
假设我们要在继承自CCLayer的HelloWorld中相应按键,那么首先在HelloWorld的头文件中添加两个函数:
copy
intarrow);
- voidkeyEnterClicked();
然后,在HelloWorld初始化时启用按键功能:
copy
setKeypadEnabled(true);
在HelloWorld中实现之前声明的2个虚函数:
copy
voidLLPlaneControlLayer::keyArrowClicked(intarrow)
- if(arrow==kTypeLeftArrowClicked)
- //左方向键按下
- if(arrow==kTypeRightArrowClicked)
- //右方向键按下
- if(arrow==kTypeUpArrowClicked)
- {
- //上方向键按下
- if(arrow==kTypeDownArrowClicked)
- //下方向键按下
- voidLLPlaneControlLayer::keyEnterClicked()
- //Enter键按下
- 当用户按下方向键,keyArrowClicked会被执行,参数arrow表示按下的键;当用户按下Enter键(Android平台为DPAD_CENTER键),keyEnterClicked函数会执行。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|