Cocos仿unity按钮机制

这篇博客记录了作者在开发Android TV游戏时,如何在Cocos2d-x中模仿Unity的按钮机制。尽管作者已转向使用Unity,并关注到廖大大和触控的薪资争议,但这篇文章仍提供了Cocos2d-x游戏开发的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去年做androidtv游戏时写的,记录在别的博客网站,一并拿过来。虽然现在已经投入unity的怀抱,加上看了廖大大和触控的工资纠纷。

--根据不同的平台绑定按键
if cc.Application:getInstance():getTargetPlatform() == 2 then
    GSKeyCode = {
        left = 26,
        right = 27,
        top = 28,
        bot = 29,
        ok = 35
        }
else
    GSKeyCode = {
        left = 159,
        right = 160,
        top = 161,
        bot = 162,
        ok = 163,
        menu = 18
        }
end

--初始化 监听系统的按键消息
function GSKeypadTool:start()
    local listener = cc.EventListenerKeyboard:create()
        listener:registerScriptHandler(handler(self,self.onKeyReleased),cc.Handler.EVENT_KEYBOARD_RELEASED)
        listener:registerScriptHandler(handler(self,self.onKeyPressed),cc.Handler.EVENT_KEYBOARD_PRESSED)

        cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(listener,1)

        cc.Director:getInstance():getScheduler():scheduleScriptFunc(handler(self,self.update),0,false)

        --保存按键的数据
        self.mKeyReleased = {}
        self.mKeyPressed = {}
    end

    --按键按上清空该按键的数据
    function GSKeypadTool:onKeyReleased(keyCode,event)
        --cc.KeyCode.Key_BACK
        --[[
            清空按下时间
        ]]
        self.mKeyPressed[keyCode] = nil
        --[[
            创建按上时间
        ]]
        --此处保存为false 然后再update改为true,update后的一帧改为false 确保这个事件只存活1帧
        self.mKeyReleased[keyCode] = false
    end

    --按键按下
    function GSKeypadTool:onKeyPressed(keyCode,event)
        --保存按键按下时的数据
        local pressedData = {}
        pressedData.frame = 0
        --每20帧处理一次点击效果,相当于长按
        pressedData.nextEffectFrame = 20
        pressedData.effectTimes = 0
        self.mKeyPressed[keyCode] = pressedData
    end


function GSKeypadTool:update(dt)

    for keyCode,keyData in pairs(self.mKeyReleased) do
        if keyData == false then
            self.mKeyReleased[keyCode] = true
         end
    end

    for keyCode,keyData in pairs(self.mKeyPressed) do
        keyData.frame = keyData.frame + 1

        if  keyData.frame > keyData.nextEffectFrame then

            keyData.effectTimes = keyData.effectTimes + 1
            --长按加速
            keyData.nextEffectFrame = math.max(keyData.nextEffectFrame - keyData.effectTimes * 6 , 5) + keyData.nextEffectFrame
        end
    end
end


function GSKeypadTool:getKeyUp(keyCode)
    return self.mKeyReleased[keyCode] 
end

function GSKeypadTool:getKeyDownTime(keyCode)
    if self.mKeyPressed[keyCode] then
        return self.mKeyPressed[keyCode].frame
    end
    return nil
end

GSKeypadTool:start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值