zoukankan      html  css  js  c++  java
  • 关于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也无效(还是需要添加监听代码)

    为什么不和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,将在下一篇文章中指出。

  • 相关阅读:
    mongoDB 常用函数
    无缓冲通道 vs 有缓冲通道
    go实现终端输出颜色文本
    JavaScript获取当前时间
    201521123082《Java程序设计》第2周学习总结
    201521123082 《Java程序设计》第1周学习总结
    201521123074 《Java程序设计》第2周学习总结
    第2周作业-Java基本语法与类库
    201521123094 《Java程序设计》第1周学习总结
    201521123047 《Java程序设计》第4周学习总结
  • 原文地址:https://www.cnblogs.com/songcf/p/4764444.html
Copyright © 2011-2022 走看看