Cocos2dx中关于事件监听的问题,没搞懂,求大拿详解

addEventListenerWithSceneGraphPriority函数和addEventListenerWithFixedPriorit函数,我的理解是前者是把监听加到具体的node上,而后者就不太理解了,不清楚到底是给有固定优先级的node加监听,还是给监听事件加优先级,或者其他的意思。两者使用是可以同时使用,还是只能选择一个使用,各有什么优点,求解..................拜谢、

addEventListenerWithFixedPriorit是把固定优先值的监听器添加到一个node

addEventListenerWithSceneGraphPriority函数和addEventListenerWithFixedPriority函数会在添加事件监听器时设置一个已注册标识,一旦设置了标识,就不能再用于注册事件监听了 后者在node移除时手动移除监听器 而前者是随着节点的析构被移除 至于什么时候要用哪个需要具体分析

前者事件派发优先级是根据绑定的节点的Z序来决定

而后者适用于自定义优先级 这就看需求来决定了。

addEventListenerWithFixedPriority这个需要手动删除,优先级从1开始

addEventListenerWithSceneGraphPriority这个的优先级是0

addEventListenerWithFixedPriorit 可以自己为节点设置优先级 下面是我的例子
local layer = cc.Layer:create()

local sprite1 = cc.Sprite:create("icon_life.png")
sprite1:setPosition(100,160)
layer:addChild(sprite1)
local sprite2 = cc.Sprite:create("icon_life.png")
sprite2:setPosition(220,160)
layer:addChild(sprite2)
local sprite3 = cc.Sprite:create("icon_life.png")
sprite3:setPosition(340,160)
layer:addChild(sprite3)

local function onTouchBegan1(touch,event)
    local location = sprite1:convertToNodeSpace(touch:getLocation())
    local s = sprite1:getContentSize()
    local rect = cc.rect(0,0,s.width,s.height)
    
    if cc.rectContainsPoint(rect,location) then
        print("sprite1 was clicked")
    end
    
    return true
end

local function onTouchBegan2(touch,event)
    local location = sprite2:convertToNodeSpace(touch:getLocation())
    local s = sprite2:getContentSize()
    local rect = cc.rect(0,0,s.width,s.height)

    if cc.rectContainsPoint(rect,location) then
        print("sprite2 was clicked")
    end
    
    return true
end

local function onTouchBegan3(touch,event)
    local location = sprite3:convertToNodeSpace(touch:getLocation())
    local s = sprite3:getContentSize()
    local rect = cc.rect(0,0,s.width,s.height)

    if cc.rectContainsPoint(rect,location) then
        print("sprite3 was clicked")
    end
    
    return true
end

local listener1 = cc.EventListenerTouchOneByOne:create()
local listener2 = cc.EventListenerTouchOneByOne:create()
local listener3 = cc.EventListenerTouchOneByOne:create()
listener1:registerScriptHandler(onTouchBegan1,cc.Handler.EVENT_TOUCH_BEGAN)
listener2:registerScriptHandler(onTouchBegan2,cc.Handler.EVENT_TOUCH_BEGAN)
listener3:registerScriptHandler(onTouchBegan3,cc.Handler.EVENT_TOUCH_BEGAN)
local dispatcher = layer:getEventDispatcher()
dispatcher:addEventListenerWithFixedPriority(listener1,-1)
dispatcher:addEventListenerWithFixedPriority(listener2,-2)
dispatcher:addEventListenerWithFixedPriority(listener3,-3)

local function onExit()
    dispatcher:removeAllEventListeners()  
end

local function onNodeEvent(event)
    if "exit" == event then
        onExit()
    end
end

layer:registerScriptHandler(onNodeEvent)

return layer