-----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_)