参阅 http://www.haogongju.net/art/1908278
一、修改cocos2dx/platform/android/jni目录下TouchesJni.cpp文件,添加你想处理的键值,该值务必与Android对应键值保持一致,下面为返回按键和菜单按键的例子,可以添加自己想要的键值:
#define KEYCODE_BACK 0x04
#define KEYCODE_MENU 0x52
#define KEYCODE_DPAD_UP 0x00000013//上键
#define KEYCODE_DPAD_DOWN 0x00000014//下键
#define KEYCODE_DPAD_LEFT 0x00000015//左键
#define KEYCODE_DPAD_RIGHT 0x00000016//右键
#define KEYCODE_DPAD_CENTER 0x00000017//确定键
#define KEYCODE_HOME 0x00000003//Home键
#define KEYCODE_POWER 0x0000001a//电源键
#define KEYCODE_VOLUME_DOWN 0x00000019//音量减
#define KEYCODE_VOLUME_UP 0x00000018//音量加
#define KEYCODE_CAMERA 0x0000001b//相机
二、修改该文件下的jboolean Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown(JNIEnv * env, jobject thiz, jint keyCode)函数如下:
jboolean 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;
default:
return JNI_FALSE;
}
return JNI_FALSE;
}
}
对应的keyCode就是等待处理的键值。
三、修改cocos2dx/keypad_dispatcher目录下CCKeypadDispatcher.h文件如下枚举:
typedef enum {
// the back key clicked msg
kTypeBackClicked = 1,
kTypeMenuClicked,
} ccKeypadMSGType;
其中的消息类型kTypeBackClicked和kTypeMenuClicked就是第二步中的消息类型的声明。
四、修改对应CPP文件CCKeypadDispatcher.cpp,修改函数dispatchKeypadMSG(ccKeypadMSGType nMsgType),添加自己想要处理的消息类型,这里还是用返回和菜单键举例:
if (m_pDelegates->count() > 0)
{
CCObject* pObj = NULL;
CCARRAY_FOREACH(m_pDelegates, pObj)
{
CC_BREAK_IF(!pObj);
pHandler = (CCKeypadHandler*)pObj;
pDelegate = pHandler->getDelegate();
switch (nMsgType)
{
case kTypeBackClicked:
pDelegate->keyBackClicked();
break;
case kTypeMenuClicked:
pDelegate->keyMenuClicked();
break;
default:
break;
}
}
}
其中switch语句中要处理的就是自定义的消息类型.
五、修改当前目录下的CCKeypadDelegate.h文件,为CC_DLL CCKeypadDelegate添加如下接口,即为对应消息的响应函数:
class CC_DLL CCKeypadDelegate
{
public:
// The back key clicked
virtual void keyBackClicked() {}
// The menu key clicked. only available on wophone & android
virtual void keyMenuClicked() {};
};
六、在要响应的类中实现以上接口即可。
七.修改cocos2dx\platform\android\java\src\org\cocos2dx\lib下的Cocos2dxGLSurfaceView.java文件
@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
switch (pKeyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
this.queueEvent(new Runnable() {
@Override
public void run() {
Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
}
});
return true;
default:
return super.onKeyDown(pKeyCode, pKeyEvent);
}
}
注意:
1.按照Back和Menu键的方式添加自己想要处理的按键即可;另外如果org\cocos2dx\lib已经拷到自己的android工程目录,则相应的修改即可;
2.修改完成之后windows版本需要重新编译cocos2d-x源代码,运行cocos2d-x安装目录下的build-win32.bat即可;android版还是用cygwin编译即可,cygwin会重新编译已修改的源代码;
3.在自己的Layer类中添加消息的响应函数,如virtual void keyBackClicked();根据自己的需要实现就行,不过在用之前需要setKeypadEnabled(true);
以上为我自己的一些总结,如有不足和错误之处,还请各位批评指正!