Cocos2d-x 3.6中的registerScriptKeypadHandler在Android真机上无法响应back键的问题

Cocos2d-x 3.6中使用Lua脚本作为主要开发语言,基于新的mvc框架,根据查到的响应安卓真机设备的返回按键back的方法,registerScriptKeypadHandler为Node下的注册按键事件侦听方法,新的框架中对此还进行了一次封装,在LayerEx.lua中的onKeypad实现,完成后的按键侦听代码如下:

function MyView:onKeypad(event)  
    if event == "backClicked" then
        -- back clicked!
    end
end
-- ...
function MyView:onCreate()
    display.newLayer()
        :onTouch(handler(self, self.onTouch))
        :onKeypad(handler(self, self.onKeypad))
        :addTo(self)
end

在Windows模拟器上测试时可以看到键盘上的任意键按下时都会触发这个回调函数,但是参数均为nil,读了一下源码发现在CCLuaEngine.cpp中的回调原生代码实现如下:

int LuaEngine::handleKeypadEvent(void* data)
{
    if (NULL == data)
        return 0;
    
    KeypadScriptData* keypadScriptData = static_cast<KeypadScriptData*>(data);
    if (NULL == keypadScriptData->nativeObject)
        return 0;
    
    int handler = ScriptHandlerMgr::getInstance()->getObjectHandler(keypadScriptData->nativeObject, ScriptHandlerMgr::HandlerType::KEYPAD);
    
    if (0 == handler)
        return 0;
    
    EventKeyboard::KeyCode action = keypadScriptData->actionType;

    switch(action)
    {
		case EventKeyboard::KeyCode::KEY_BACKSPACE:
			_stack->pushString("backClicked");
			break;
		case EventKeyboard::KeyCode::KEY_MENU:
            _stack->pushString("menuClicked");
			break;
		default:
			break;
    }

    int ret = _stack->executeFunctionByHandler(handler, 1);
    _stack->clean();
    return ret;
}

可以看到,这个回调函数的实现只会在安卓的后退和菜单键触发时传递标识参数backClicked和menuClicked,其它按键只会触发回调而已,所以win版回调的参数都是nil。
接下来测试Android真机,结果发现backClicked不会传入,但menuClicked会传入,于是在cpp的原生代码中加入log打印action保存的KeyCode,发现按下back时打印的值是6,可KEY_BACKSPACE的值为7,所以不会触发backClicked的事件,查看了一下KeyCode的枚举值,发现6对应的是KEY_ESCAPE和KEY_BACK,于是修改一下源码中case对应的值为KEY_BACK,再次测试,问题解决。

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。