【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);
相關文章
相關標籤/搜索