• 【Cocos2dx 3.3 Lua】触屏事件


    cocos2dx 3.x触屏时间分为单点触摸和多点触摸:
        单点触摸:(即只有注册的Layer才能接收触摸事件)
         多点触摸点单用法(多个Layer获取屏幕事件)
         
     
              
    1、单点触摸
            1.1 基本函数

    onTouchBegan    

    如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递               

    如果返回false,本层的后续Touch事件不能被触发,并向后传递,也就是不会调用

    onTouchMoved

    简单点来说,如果:

    1.Layer 只有一层的情况:

    1
    virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

    a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息

    b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息

    2.Layer 有多层的情况:

    1
    virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

    a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息

    b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息

     
    1.2 使用示例
    在Layer中添加如下代码,并重载onTouchxxx函数
         
    ps:  

            listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响;

    listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B;

    Cocos2dx Lua 单点触摸事件

    Link: http://codepad.org/WqK2Sqak    [ raw code | fork ]  
    local BaseMap=class("BaseMap",function()
        return cc.Layer:create()
    end)
    
    BaseMap.init=function(self)
        self._size=cc.Director:getInstance():getVisibleSize()
        self._mapres=""
        self._level=0
    end
    
    BaseMap.setTouchEnable=function(self,enable)
        local function onTouchBegin(touch, event)
            self:onTouchBegin(touch:getLocation())
        end
    
        local function onTouchEnd(touch, event)
            self:onTouchEnd(touch:getLocation())
        end
    
        if enable == true then
            local listener = cc.EventListenerTouchOneByOne:create()
            listener:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCH_BEGAN )
            listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED )
            local eventDispatcher = self:getEventDispatcher()
            eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self)
        end
    end
    
    BaseMap.onTouchBegin=function(self,touch)
    
    end
    
    BaseMap.onTouchEnd=function(self,touch)
    
    end
    
    return BaseMap

    2、多点触摸

            
        注意:
                多点触摸,onTouchsBegan函数的参数和返回值与单点触摸的参数和返回值的差异
     
    3、eventDispatcher
         _eventDispatcher 是 Node 的属性,通过它管理当前节点(如 场景 、层、精灵等 )的所有事件分发情况。但是它本身是一个单例模式值的引用,在 Node 构造函数中,通过 "Director::getInstance()>getEventDispatcher();" 获取,有了这个属性,我们能更为方便的调用。
     
        3.1 获取方法
            
     
        3.2 事件监听类型
        事件监听器包含以下几种:
    • 触摸事件 (EventListenerTouch)
    • 键盘响应事件 (EventListenerKeyboard)
    • 加速记录事件 (EventListenerAcceleration)
    • 鼠标响应事件 (EventListenerMouse)
    • 自定义事件 (EventListenerCustom)

    以上事件监听器统一由 _eventDispatcher 来进行管理。

        
        3.3 优先权

            1.优先级越低,越先响应事件

            2.如果优先级相同,则上层的(z轴)先接收触摸事件

           有两种方式将 事件监听器 listener 添加到 事件调度器_eventDispatcher 中:

            

        addEventListenerWithSceneGraphPriority实现:
     
        addEventListenerWithFixedPriority实现:
     
    注意:

    (1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。这里当我们再次使用 listener 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addEventListenerWithSceneGraphPriority 或者 addEventListenerWithFixedPriority 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。

        clone实现:

        

    (2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

    addEventListenerWithFixedPriority  listener 移除方法:

    1
    dispatcher->removeEventListener(listener);
     

     
     
  • 相关阅读:
    iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]
    数字统计(0)<P2010_1>
    数字反转(0)<P2011_1>
    质因数分解(0)<P2012_1>
    记数问题(0)<P2013_1>
    珠心算测验(0)<P2014_1>
    金币(0)<P2015_1>
    归并排序
    循环语句(while语句和do...while语句)
    循环语句(for语句的用法)
  • 原文地址:https://www.cnblogs.com/luosongchao/p/4339080.html
Copyright © 2020-2023  润新知