【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);
 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM