Cocos2dx-Lua 长按手势

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

转载于:https://www.cnblogs.com/yolo1024/p/5943598.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值