Cocos2d-X引擎響應Android按鍵訊息

來源:互聯網
上載者:User

參閱   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);

以上為我自己的一些總結,如有不足和錯誤之處,還請各位批評指正!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.