2dx关于js响应layer触摸消息的bug

2dx关于js响应layer触摸消息的bugcocos2dx 关于 js 响应 layer 触摸消息的 bugcocos2d x3 7 问题描述 目前这个版本中 3 7 c 层的 layer 触摸消息只能通过消息的方式发送给 js 不能像 lua 一样直接回调 js 注册的触摸回调接口 为了方便 我们更改一下 layer 类的 onTouchBegan onTouchMove 等接口 使其支持在 layer 的触摸响应中直接回调 js 接口 具体实现见 http w

cocos2dx关于js响应layer触摸消息的bug

cocos2d-x 3.7


问题描述:

目前这个版本中(3.7),c++层的layer触摸消息只能通过消息的方式发送给js,不能像lua一样直接回调js注册的触摸回调接口,为了方便,我们更改一下layer类的onTouchBegan/onTouchMove...等接口,使其支持在layer的触摸响应中直接回调js接口。
具体实现见:http://www.cnblogs.com/songcf/p/4764444.html


//Layer判断是否捕获该touch,取决于executeScriptTouchHandler函数调用的返回值 bool Layer::onTouchBegan(Touch *touch, Event *event) { #if CC_ENABLE_SCRIPT_BINDING if (kScriptTypeNone != _scriptType) { return executeScriptTouchHandler(EventTouch::EventCode::BEGAN, touch, event) == 0 ? false : true; } #endif CC_UNUSED_PARAM(event); CCASSERT(false, "Layer#ccTouchBegan override me"); return true; } //再来看看executeScriptTouchHandler的返回值,取决于ScriptingCore::sendEvent int Layer::executeScriptTouchHandler(EventTouch::EventCode eventType, Touch* touch, Event* event) { #if CC_ENABLE_SCRIPT_BINDING if (kScriptTypeNone != _scriptType) { TouchScriptData data(eventType, this, touch, event); ScriptEvent scriptEvent(kTouchEvent, &data); return ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent); } #endif //can not reach it return 0; } //再看sendEvent中发送触摸消息的代码 //这里可以看出layer是否捕获触摸取决于handleTouchEvent的返回值 int ScriptingCore::sendEvent(ScriptEvent* evt) { //...... case kTouchEvent: { TouchScriptData* data = (TouchScriptData*)evt->data; return handleTouchEvent(data->nativeObject, data->actionType, data->touch, data->event); } break; case kTouchesEvent: { TouchesScriptData* data = (TouchesScriptData*)evt->data; return handleTouchesEvent(data->nativeObject, data->actionType, data->touches, data->event); } break; //...... } //你可以继续往下跟进去就会知道,最终返回的值到底是什么 

没错!如你所见,最后的返回值是JS_CallFunctionName是否调用成功,即这里c++调用js的onTouchBegan函数是否成功
只要调用成功,touch就会被该layer捕获!跟onTouchBegan的返回值没半毛钱关系。那么正确的返回值应该是js端onTouchBegan的返回值。

解决方案:

修改ScriptingCorehandleTouchEvent/handleTouchesEvent两个接口,让它们的返回值为js端onTouchBegan的返回值:

bool ScriptingCore::handleTouchEvent(void* nativeObj, cocos2d::EventTouch::EventCode eventCode, cocos2d::Touch* touch, cocos2d::Event* event) { JS::RootedValue ret(_cx); if (handleTouchEvent(nativeObj, eventCode, touch, event, &ret)){ return JS::ToBoolean(ret); } else { return false; } } bool ScriptingCore::handleTouchesEvent(void* nativeObj, cocos2d::EventTouch::EventCode eventCode, const std::vector<cocos2d::Touch*>& touches, cocos2d::Event* event) { JS::RootedValue ret(_cx); if (handleTouchesEvent(nativeObj, eventCode, touches, event, &ret)){ return JS::ToBoolean(ret); } else { return false; } }

其实我不太明白官方为什么在layer的触摸响应中,只用c++回调lua接口,而js使用发消息的方式(不用c++回调js接口),性能?!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178818.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:28
下一篇 2026年3月26日 下午4:28


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号