Android中Cocos2d-X引擎响应按键消息【原】

转载请注明出处,谢谢!

一、修改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() {};

六、修改/org/cocos2dx/lib/Cocos2dxGLSurfaceView.java文件中的onKeyDown方法,在switch语句中添加自己定义的消息类型。

七、在要响应的类中实现以上接口即可。

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

posted on 2013-03-30 13:53  米兰冬天  阅读(1063)  评论(0)    收藏  举报

导航