现在的位置: 首页 > 综合 > 正文

Cocos2d-X引擎响应Android按键消息

2013年08月11日 ⁄ 综合 ⁄ 共 3347字 ⁄ 字号 评论关闭

参阅   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;

其中的消息类型kTypeBackClickedkTypeMenuClicked就是第二步中的消息类型的声明。

四、修改对应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.按照BackMenu键的方式添加自己想要处理的按键即可;另外如果org\cocos2dx\lib已经拷到自己的android工程目录,则相应的修改即可;

2.修改完成之后windows版本需要重新编译cocos2d-x源代码,运行cocos2d-x安装目录下的build-win32.bat即可;android版还是用cygwin编译即可,cygwin会重新编译已修改的源代码;

3.在自己的Layer类中添加消息的响应函数,如virtual void keyBackClicked();根据自己的需要实现就行,不过在用之前需要setKeypadEnabled(true);

以上为我自己的一些总结,如有不足和错误之处,还请各位批评指正!

抱歉!评论已关闭.