【Cocos2dx 3.3 Lua】触屏事件

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

onTouchBegan    node

若是返回true:本层的后续Touch事件能够被触发,并阻挡向后层传递               函数

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

 

onTouchMovedspa

简单点来讲,若是:code

1.Layer 只有一层的状况:blog

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

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

b.返回true,则ccTouchMoved(),ccTouchEnded()能够接收到消息ip

 

2.Layer 有多层的状况:ci

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

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

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

 

二、多点触摸

        
    注意:
            多点触摸,onTouchsBegan函数的参数和返回值与单点触摸的参数和返回值的差别
 
三、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);
相关文章
相关标签/搜索