
Cocos2dx只有touchUpInsID的按钮或菜单,有时可能会想要一个长按手势来触发事件。
-- 这是类名,命名这件事还是很麻烦的,凑合就是button吧
local button = {}
-- 触发时间,按多长时间触发
local mTriggerTime = 0.5-- 可抖动区域,如果在长按触发前移动超过这个距离则不会触发事件
local removabledis = 10
-- 类方法sprite -- 给谁添加这个事件 longPressHandler -- 长按触发回调方法
clickHandler -- 还可以添加单击事件(touchIn)可设定触发时间 triggerTime
button.registerLongPressHandler = function(sprite,longPressHandler,clickHandler,triggerTime)triggerTime = triggerTime or mTriggerTime
-- 记录长按时间
local countTime = nil
-- 是用scheduler 来计时的,记录scheduler 的ID
local sID = nil
-- 开始位置
local beganPoint= nil
-- 有没有回调过
local haveCall = false
-- 有没移动(超出可移动范围)
local isMoved = false-- 有没已添加过监听
if sprite.m_Listenner_initFlag then
return
end
-- 计时方法
local function countTimeFunc( delay )
countTime = countTime or 0
countTime = countTime + delay
if countTime > triggerTime then
-- 回调
if longPressHandler then
longPressHandler(sprite,"longPressBegin")
end
-- 停止计时
local scheduler = cc.Director:getInstance():getScheduler()
scheduler:unscheduleScriptEntry(sID)
sID = nil
countTime = nil
haveCall = true
end
end
-- 触摸开始
local function ontouchBegin(touch,event) button.isCancel = false local UIUtil = require("ui/UIUtil") if UIUtil.isNodeVisible(sprite) and cc.rectContainsPoint(sprite:getBoundingBox(),sprite:getParent():converttouchToNodeSpace(touch)) then beganPoint = touch:getLocation() -- 开始计时 if longPressHandler then local scheduler = cc.Director:getInstance():getScheduler() sID = scheduler:scheduleScriptFunc( function ( delay ) countTimeFunc(delay) end,0.1,false) end return true else return false end end -- 触摸移动 local function ontouchmoved( touch,event ) if haveCall == false and sID then local location = touch:getLocation() local wIDth = location.x - beganPoint.x local height = location.y - beganPoint.y -- 停止计时 if math.abs(wIDth) > removabledis or math.abs(height) > removabledis then local scheduler = cc.Director:getInstance():getScheduler() scheduler:unscheduleScriptEntry(sID) sID = nil countTime = nil isMoved = true end end end -- 触摸结束 local function ontouchended( touch,event ) if sID then local scheduler = cc.Director:getInstance():getScheduler() scheduler:unscheduleScriptEntry(sID) sID = nil end if not button.isCancel then if haveCall then if longPressHandler then longPressHandler(sprite,"longPressEnded") end else if isMoved == false and clickHandler then clickHandler(sprite) end end end beganPoint=nil haveCall = false isMoved = false end function button.cancel_long_press() ontouchended() button.isCancel = true end -- 添加监听 local Listenner = cc.EventListenertouchOneByOne:create() Listenner:setSwallowtouches(false) Listenner:registerScriptHandler(ontouchBegin,cc.Handler.EVENT_touch_BEGAN) Listenner:registerScriptHandler(ontouchmoved,cc.Handler.EVENT_touch_MOVED) Listenner:registerScriptHandler(ontouchended,cc.Handler.EVENT_touch_ENDED) local eventdispatcher = sprite:getEventdispatcher() eventdispatcher:addEventListenerWithSceneGraPHPriority(Listenner,sprite) sprite.m_Listenner_initFlag = true return sprite end -- 取消事件 button.isCancel = false return button 总结以上是内存溢出为你收集整理的Cocos2dx-Lua 长按手势全部内容,希望文章能够帮你解决Cocos2dx-Lua 长按手势所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)