2dx-lua精灵添加触摸事件

来源:互联网 发布:js防水涂料是柔性的吗 编辑:程序博客网 时间:2024/05/01 03:00

-----1.直接上代码:

local sprite = cc.Sprite:create("rabbit.png")

sprite:setPosition(500, 500)

self:addChild(sprite)


local listener = cc.EventListenerTouchOneByOne:create()

local function onTouchBegan(touch, event)

local target = event:getCurrentTarget()

local size = target:getContentSize()

local rect = cc.rect(0, 0, size.width, size.height)

local p = touch:getLocation()

p = target:convertTouchToNodeSpace(touch)

if cc.rectContainsPoint(rect, p) then

return true

end

return false

end

local function onTouchMoved(touch, event)  end

local function onTouchEnded(touch, event) 

print("触摸事件")

end

listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )

listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )

listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )

cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, sprite)

-----2.不过这样有一个问题,当精灵放在滚动层里的时候,滚动层不显示的部分也会接受到触摸事件,解决方法:

获取滚动层,然后加上滚动层的区域判断

local function onTouchBegan(touch, event)
local target = event:getCurrentTarget()
local size = target:getContentSize()
local rect = cc.rect(0, 0, size.width, size.height)
local p = target:convertTouchToNodeSpace(touch)
--[[scroll之外不触发事件]]
local scrollTouch = true
if scroll then
local size1 = scroll:getContentSize()
local rect1 = cc.rect(0, 0, size1.width, size1.height)
local p1 = scroll:convertTouchToNodeSpace(touch)
if not cc.rectContainsPoint(rect1, p1) then
scrollTouch = false
end
end

if cc.rectContainsPoint(rect, p) and listTouch then
return true
end
return false
end

-----3.最后来说下滚动层中精灵触摸的问题,因为滚动的时候是不希望精灵触发点击事件的,直接上代码:

self.touchLock = false
self.offset = 5     --[[允许便宜量]]
self.isMove = true  --[[移动时是否触发点击事件]]

--[[按钮事件]]
local listener = cc.EventListenerTouchOneByOne:create()
listener:setSwallowTouches(false)
local function onTouchBegan(touch, event)
self.touchLock = false
local target = event:getCurrentTarget()
local size = target:getContentSize()
local rect = cc.rect(0, 0, size.width, size.height)
local p = target:convertTouchToNodeSpace(touch)
--[[scroll之外不触发事件]]
local scrollTouch = true
if scroll then
local size1 = scroll:getContentSize()
local rect1 = cc.rect(0, 0, size1.width, size1.height)
local p1 = scroll:convertTouchToNodeSpace(touch)
if not cc.rectContainsPoint(rect1, p1) then
scrollTouch = false
end
end


if cc.rectContainsPoint(rect, p) and scrollTouch then
return true
end
return false
end
local function onTouchMoved(touch, event)
if self.isMove then
local offX = math.abs(touch:getStartLocation().x - touch:getLocation().x)
local offY = math.abs(touch:getStartLocation().y - touch:getLocation().y)
if offX > self.offset or offY > self.offset then
self.touchLock = true
end
end
end
local function onTouchEnded(touch, event) 
if not self.touchLock then
print("点击事件")
end
end
listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )
listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, self.confirmBtn_)

0 0
原创粉丝点击