http://www.25kx.com/art/1908278
http://blog.csdn.net/u012839224/article/details/37764193
一、修改cocos2dx/platform/android/jni目录下TouchesJni.cpp文件,添加你想处理的键值,该值务必与Android对应键值保持一致,下面为返回按键和菜单按键的例子,可以添加自己想要的键值:
1 #define KEYCODE_BACK 0x04 2 #define KEYCODE_MENU 0x52
二、修改该文件下的jboolean Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown(JNIEnv * env, jobject thiz, jint keyCode)函数如下:
1 jboolean Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown(JNIEnv * env, jobject thiz, jint keyCode) { 2 CCDirector* pDirector = CCDirector::sharedDirector(); 3 switch (keyCode) { 4 case KEYCODE_BACK: 5 if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked)) 6 return JNI_TRUE; 7 break; 8 case KEYCODE_MENU: 9 if (pDirector->getKeypadDispatcher()->dispatchKeypadMSG(kTypeMenuClicked)) 10 return JNI_TRUE; 11 break; 12 default: 13 return JNI_FALSE; 14 } 15 return JNI_FALSE; 16 } 17 }
对应的keyCode就是等待处理的键值。
三、修改cocos2dx/keypad_dispatcher目录下CCKeypadDispatcher.h文件如下枚举:
1 typedef enum { 2 // the back key clicked msg 3 kTypeBackClicked = 1, 4 kTypeMenuClicked, 5 } ccKeypadMSGType;
其中的消息类型kTypeBackClicked和kTypeMenuClicked就是第二步中的消息类型的声明。
四、修改对应CPP文件CCKeypadDispatcher.cpp,修改函数dispatchKeypadMSG(ccKeypadMSGType nMsgType),添加自己想要处理的消息类型,这里还是用返回和菜单键举例:
1 if (m_pDelegates->count() > 0) 2 { 3 CCObject* pObj = NULL; 4 CCARRAY_FOREACH(m_pDelegates, pObj) 5 { 6 CC_BREAK_IF(!pObj); 7 8 pHandler = (CCKeypadHandler*)pObj; 9 pDelegate = pHandler->getDelegate(); 10 11 switch (nMsgType) 12 { 13 case kTypeBackClicked: 14 pDelegate->keyBackClicked(); 15 break; 16 case kTypeMenuClicked: 17 pDelegate->keyMenuClicked(); 18 break; 19 default: 20 break; 21 } 22 } 23 }
其中switch语句中要处理的就是自定义的消息类型.
五、修改当前目录下的CCKeypadDelegate.h文件,为CC_DLL CCKeypadDelegate添加如下接口,即为对应消息的响应函数:
1 public: 2 // The back key clicked 3 virtual void keyBackClicked() {} 4 5 // The menu key clicked. only available on wophone & android 6 virtual void keyMenuClicked() {};
六、在要响应的类中实现以上接口即可。
以上为我自己的一些总结,如有不足和错误之处,还请各位批评指正!