onTouchBegan node
若是返回true:本層的後續Touch事件能夠被觸發,並阻擋向後層傳遞 函數
若是返回false,本層的後續Touch事件不能被觸發,並向後傳遞,也就是不會調用lua
onTouchMovedspa
簡單點來講,若是:code
1.Layer 只有一層的狀況:blog
1virtual
bool
onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,則ccTouchMoved(),ccTouchEnded()不會再接收到消息事件
b.返回true,則ccTouchMoved(),ccTouchEnded()能夠接收到消息ip
2.Layer 有多層的狀況:ci
1virtual
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:
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
二、多點觸摸
以上事件監聽器統一由 _eventDispatcher
來進行管理。
1.優先級越低,越先響應事件
2.若是優先級相同,則上層的(z軸)先接收觸摸事件
有兩種方式將 事件監聽器 listener 添加到 事件調度器_eventDispatcher 中:
(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);
|