fina2011fina怎么读用手柄

刚接了wp8的,又要转接TV版的啦!又是一顿忙活。
一开始接了第三方的android SDK 发现UI线程会被卡死。然后又自己new thread 去跑手柄控制。但是还是会发生cocos2d-x render 上的崩溃。
每次看报告都是崩溃在线程跳转上。最后还是决定用CCkeypadDelegate 的逻辑去实现。
具体实现方式可以参考:http://blog.csdn.net/keshuiyun/article/details/9788533。 感觉博主。
但是还是存在一个小问题。
就是 我这边上下左右无法连续响应。注册OnkeyLongPess 也无法响应。最后采用定时器自己去连续触发的方式。
我的实现方法:
Cocos2dxGLSurfaceView.java 中添加如下函数:
void runqueueEvent()
this.queueEvent(new Runnable() {
void run() {
Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(mCurKeyCode);
void startTimer()
if(mTimer ==null)
new Timer();
& & & & if (mTimerTask ==null) { &
& & & & & & mTimerTask =
new TimerTask() { &
& & & & & & & & @Override &
& & & & & & & & public
void run() { &
& & & & & & & & //Log.e(&TAG&,&startTimer KeyCode: = &+mCurKeyCode);
& & & & & & & & runqueueEvent();
& & & & & & & & } &
& & & & & & }; &
& & & & } &
& & & & if(mTimer !=null &&
mTimerTask !=null ) &
& & & & & & mTimer.schedule(mTimerTask,delay,
& & private void stopTimer(){ &
& & & & if (mTimer !=null) { &
& & & & & & mTimer.cancel(); &
& & & & & & mTimer =
& & & & } &
& & & & if (mTimerTask !=null) { &
& & & & & & mTimerTask.cancel(); &
& & & & & & mTimerTask =
& & & & }& & &
public boolean onKeyUp(finalint pKeyCode,
final KeyEvent pKeyEvent)&
Log.e(&TAG&,&onKeyUp KeyCode: = &+pKeyCode);
if(pKeyCode == KeyEvent.KEYCODE_DPAD_LEFT || pKeyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
stopTimer();
super.onKeyUp(pKeyCode, pKeyEvent);
boolean onKeyDown(final
int pKeyCode, final KeyEvent pKeyEvent) {
int nRepeatCount = pKeyEvent.getRepeatCount();
& & long tempLastClickTime = System.currentTimeMillis();
if ((tempLastClickTime -mLastClickTime) &
returntrue;
mLastClickTime = tempLastClickT
Log.e(&TAG&,&onKeyDown KeyCode: = &+pKeyCode);
//Log.e(&TAG&,&onKeyDown nRepeatCount: = &+nRepeatCount);
switch (pKeyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_BUTTON_A:
case KeyEvent.KEYCODE_BUTTON_1:
case KeyEvent.KEYCODE_BUTTON_B:
case KeyEvent.KEYCODE_BUTTON_2:
case KeyEvent.KEYCODE_BUTTON_X:
case KeyEvent.KEYCODE_BUTTON_4:
case KeyEvent.KEYCODE_BUTTON_Y:
case KeyEvent.KEYCODE_BUTTON_3:
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
this.queueEvent(new Runnable() {
void run() {
Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
returntrue;
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (nRepeatCount == 0){//左右连续按钮
mCurKeyCode = pKeyC
startTimer();
this.queueEvent(new Runnable() {
void run() {
Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
returntrue;
super.onKeyDown(pKeyCode, pKeyEvent);
///////////
& &#define KEYCODE_BACK 0x04
& & #define KEYCODE_MENU 0x52
& & #define KEYCODE_DPAD_UP & & &19
& & #define KEYCODE_DPAD_DOWN & &20
& & #define KEYCODE_DPAD_LEFT & &21
& & #define KEYCODE_DPAD_RIGHT & 22
& & #define KEYCODE_DPAD_CENTER &23
& & #define KEYCODE_BUTTON_A & & 96
& & #define KEYCODE_BUTTON_B & & 97
& & #define KEYCODE_BUTTON_X & & 99
& & #define KEYCODE_BUTTON_Y & & 100
& & #define KEYCODE_BUTTON_1 & & 188
& & #define KEYCODE_BUTTON_2 & & 189
& & #define KEYCODE_BUTTON_3 & & 190
& & #define KEYCODE_BUTTON_4 & & 191
&../cocos2d-x-2.2.4/cocos2dx/platform/android/jni/TouchesJni.cpp 中修改 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyDown函数
&CCDirector* pDirector = CCDirector::sharedDirector();
& & & & switch (keyCode) {
& & & & & & case KEYCODE_BACK:
& & & & & & & & & if (pDirector-&getKeypadDispatcher()-&dispatchKeypadMSG(kTypeBackClicked))
& & & & & & & & & & return JNI_TRUE;
& & & & & & & &
& & & & & & case KEYCODE_MENU:
...依次添加就好。
&.../cocos2d-x-2.2.4/cocos2dx/keypad_dispatcher/CCKeypadDelegate.h&
添加一个响应按键的虚函数:
class CC_DLL CCKeypadDelegate
& & // The back key clicked
& & virtual void keyBackClicked() {}
& & // The menu key clicked. only available on wophone & android
& & virtual void keyMenuClicked() {};
& & // The menu key clicked. only available on wophone & android
& & virtual void keyArrowClicked(int nKeyCode) {};
../cocos2d-x-2.2.4/cocos2dx/keypad_dispatcher/CCKeypadDispatcher.cpp 添加响应就可以了
bool CCKeypadDispatcher::dispatchKeypadMSG(ccKeypadMSGType nMsgType)
& & CCKeypadHandler* &pHandler = NULL;
& & CCKeypadDelegate* pDelegate = NULL;
& & m_bLocked =
& & if (m_pDelegates-&count() & 0)
& & & & CCObject* pObj = NULL;
& & & & CCARRAY_FOREACH(m_pDelegates, pObj)
& & & & & & CC_BREAK_IF(!pObj);
& & & & & & pHandler = (CCKeypadHandler*)pO
& & & & & & pDelegate = pHandler-&getDelegate();
& & & & & & switch (nMsgType)
& & & & & & {
& & & & & & case kTypeBackClicked:
& & & & & & & & pDelegate-&keyBackClicked();
& & & & & & & &
& & & & & & case kTypeMenuClicked:
& & & & & & & & pDelegate-&keyMenuClicked();
& & & & & & & &
& & & & & & case kTypeButton_A_Clicked:
& & & & & & case kTypeButton_B_Clicked:
& & & & & & case kTypeButton_X_Clicked:
& & & & & & case kTypeButton_Y_Clicked:
& & & & & & case kTypeUpArrowClicked:
& & & & & & case kTypeDownArrowClicked:
& & & & & & case kTypeLeftArrowClicked:
& & & & & & case kTypeRightArrowClicked:
& & & & & & case kTypeEnterClicked:
& & & & & & & & & & pDelegate-&keyArrowClicked(nMsgType);
& & & & & & & & & &
& & & & & & default:
& & & & & & & &
& & & & & & }
...剩余部分省略。
//还忘记了CCKeypadDispatcher.h 添加枚举按键类型
&* @addtogroup input
typedef enum {
& & // the back key clicked msg
& & kTypeBackClicked = 1,
& & kTypeMenuClicked,
& & kTypeButton_A_Clicked,
& & kTypeButton_B_Clicked,
& & kTypeButton_X_Clicked,
& & kTypeButton_Y_Clicked,
& & kTypeUpArrowClicked,
& & kTypeDownArrowClicked,
& & kTypeLeftArrowClicked,
& & kTypeRightArrowClicked,
& & kTypeEnterClicked,
} ccKeypadMSGT
CClayer.cpp 添加。
void CCLayer::keyArrowClicked(int nKeyCode)
& & if (m_pScriptKeypadHandlerEntry)
& & & & CCScriptEngineManager::sharedManager()-&getScriptEngine()-&executeLayerKeypadEvent(this, nKeyCode);
// 这样就实现了
class IntroLayer : public CCLayer...
& & virtual void keyArrowClicked(int nKeyCode);
///////////////////////
我用cocos2d-x 版本是2.2.4的测试可以满足TV版的按钮响应需求。
本文已收录于以下专栏:
相关文章推荐
最近有个机顶盒项目,需要用到遥控器的方向键来控制游戏。
如果是一般Android设备、iOS设备或Win32平台,cocos2d-x提供了“CCAccelerometer”,可用于游戏控制UI。但由于...
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
一、按键事件
      使用I...
在游戏开发中,需要对安卓平台的菜单键和返回键的点击做处理,如下:3.x 版本auto keyboardListener = EventListenerKeyboard::create();
最近有个机顶盒项目,需要用到遥控器的方向键在游戏中控制方向。
如果是一般Android设备、iOS设备或Win32平台,cocos2d-x提供了“CCAccelerometer”类,可用于游戏控...
众所周知,当今大部分智能手机是没有物理键盘的,在使用cocos开发Android应用时,自然也就不会去注意不必要的键值的注册。然而有些时候,我们需要游戏具有高精度的操控体验,就会用到键盘。然而当我们在...
本教程将向你介绍在Cocos2d-x v3.2 rc0中如何支持iOS和Android的游戏控制器。
游戏控制器的测试
使用以下步骤测试游戏控制器
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

参考资料