
onTouchBegan
如果返回true:本層的后續Touch事件可以被觸發,並阻擋向后層傳遞
如果返回false,本層的后續Touch事件不能被觸發,並向后傳遞,也就是不會調用
onTouchMoved
簡單點來說,如果:
1.Layer 只有一層的情況:
1virtual
bool
onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,則ccTouchMoved(),ccTouchEnded()不會再接收到消息
b.返回true,則ccTouchMoved(),ccTouchEnded()可以接收到消息
2.Layer 有多層的情況:
1virtual
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:
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、多點觸摸


- 觸摸事件 (EventListenerTouch)
- 鍵盤響應事件 (EventListenerKeyboard)
- 加速記錄事件 (EventListenerAcceleration)
- 鼠標響應事件 (EventListenerMouse)
- 自定義事件 (EventListenerCustom)
以上事件監聽器統一由 _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);
|