关于js-binding中Layer触摸事件的优化

关于js-binding中Layer触摸事件的优化

cocos2d-x 3.7


1. 目前js中监听触摸事件带来的不便(特别是cocosbuilder)

在目前的js-binding中,如果要监听layer的触摸事件,需要自己监听touch事件,如:

var touchLayer = cc.Layer.creat();
cc.eventManager.addListener({
        event: cc.EventListener.TOUCH_ONE_BY_ONE,
        onTouchBegan: function(event){
            cc.log("touch begin");
            return true;
        },
        onTouchMoved: function(event){
            cc.log("touch move");
        }
    }, touchLayer);

而不是像lua-binding一样,在c++层收到触摸消息(touchbegan/touchmove...)后,调用lua事先注册的触摸相应接口:

bool Layer::onTouchBegan(Touch *touch, Event *event)
{
#if CC_ENABLE_SCRIPT_BINDING
    if (kScriptTypeLua == _scriptType) //只有lua-binding
    {
        return executeScriptTouchHandler(EventTouch::EventCode::BEGAN, touch, event) == 0 ? false : true;
    }
#endif
    CC_UNUSED_PARAM(event);
    CCASSERT(false, "Layer#ccTouchBegan override me");
    return true;
}

带来的不便:

  1. js中每个需要响应触摸的地方,都要监听消息,移除消息,很麻烦
  2. cocosbuilder编辑的layer就算开启了touch enable也无效(还是需要添加监听代码)
    271643111409600.png

为什么不和lua-binding风格一样呢,那么cocosbuilder编辑的touchlayer就可以这么响应触摸了:

touchLayer.onTouchBegan = function(touch) { return true; };
touchLayer.onTouchMoved = function(touch) {};

So simple

手动创建的layer就可以这么写了

var touchLayer = cc.Layer.create();
//目前以下3个接口,均未绑定在js中
touchLayer.setsetTouchMode(1);
touchLayer.setSwallowsTouches(true);
touchLayer.setTouchEnabled(true);
touchLayer.onTouchBegan = function(touch) { return true; };
touchLayer.onTouchMoved = function(touch) {};

如此一来就不用每次再去添加事件,移除事件了。


2. 实现方法

1.允许layer的触摸事件发生时,c++回调js注册的触摸响应接口:

把layer中,所有if (kScriptTypeLua == _scriptType)的地方改为if (kScriptTypeNone != _scriptType),这样c++层在收到触摸消息后,就会回调js注册的接口了。(更改这一步,对于cocosbuilder编辑的layer足够了,那么用代码创建的layer需要做第二步)

2.将setsetTouchMode/setSwallowsTouches/setTouchEnabled三个接口绑定到js中(去掉它们的CC_DEPRECATED_ATTRIBUTE,然后重新运行一下自动绑定脚本即可)。

3.ScriptingCore中有一个触摸响应判断的bug,将在下一篇文章中指出。

转载于:https://www.cnblogs.com/songcf/p/4764444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值