參閱 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);
以上為我自己的一些總結,如有不足和錯誤之處,還請各位批評指正!