cocos2d-Luacocos2d

cocos2d-lua 简单状态机 机制

2017-11-02  本文已影响12人  人气小哥

以前讲过cocos-lua的状态机组件

传送门1: http://www.jianshu.com/p/cd5821fa8ebd
传送门2: http://www.jianshu.com/p/fb53c90ccc49
传送门3: http://www.jianshu.com/p/5ec3dfd895ec
传送门4: http://www.jianshu.com/p/1493194e59ed

今天我们要讲个简单的状态机
直接上代码 看注释

--[[--设置家族加入按钮状态 自动 禁用 已满等
--使用样例
g_setAddHhBtnState({
    --控件
    addBtn = args.addBtn,       --加入按钮 下面有3个文本子控件
    applyBtn = args.applyBtn,   --申请按钮

    --值
    joinType = args.joinType,   --服务器传过来的加入家族审核状态
    nMyPlayerLv = args.nMyPlayerLv,     --自己的家族等级
    nNeedPlayerLv = args.nNeedPlayerLv, --该家族设置的准入等级
    nCurMemNum = args.nCurMemNum,--当前成员数量
    nMaxMemNum = args.nMaxMemNum,--最大成员数量
    guildId = args.guildId,     --公会id
})
]]
function g_setAddHhBtnState(args)--把需要形成状态的控件和值放到一个表里面传进来
    --dump(args, "设置家族加入按钮状态")

    --这里用自己的变量把表里面的变量存起来 方便以后改需求时维护
    --控件
    local addBtn = args.addBtn
    local applyBtn = args.applyBtn

    --值
    local joinType = args.joinType
    local nMyPlayerLv = args.nMyPlayerLv
    local nNeedPlayerLv = args.nNeedPlayerLv
    local nCurMemNum = args.nCurMemNum
    local nMaxMemNum = args.nMaxMemNum
    local guildId = args.guildId

    local m_Label_JoinHh = g_seekWidgetByName(addBtn, "m_Label_JoinHh")--加载部分子控件
    local m_Label_NoOpen = g_seekWidgetByName(addBtn, "m_Label_NoOpen")
    local m_Label_LevelLimit = g_seekWidgetByName(addBtn, "m_Label_LevelLimit")

    --这里就是根据条件创造出不同的状态
    --如果需求发生改变 可以直接在这里改条件导致状态的逻辑
    local btnState = MsgHhData.ADDHH_REFUSE--默认给个拒绝先

    if nCurMemNum >= nMaxMemNum then--已满
        btnState = MsgHhData.ADDHH_MEMMAX
    else
        if joinType == GameConst.GUILD_APPLY_REFUSE then--拒绝
            btnState = MsgHhData.ADDHH_REFUSE
        elseif joinType == GameConst.GUILD_APPLY_APPROVE then--批准
            btnState = MsgHhData.ADDHH_APPROVAL
        elseif joinType == GameConst.GUILD_APPLY_AUTO then--自动
            if nMyPlayerLv >= nNeedPlayerLv then
                btnState = MsgHhData.ADDHH_IMMEDIATELY--自动满足条件
            else
                btnState = MsgHhData.ADDHH_LEVEL
            end
        end
    end

    --对自己的控件做点击处理
    addBtn.btnState = btnState
    applyBtn.btnState = btnState

    local function callback(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            NetMsg_xxx.XXX(guildId, 1)--发包
        end
    end
    addBtn:addTouchEventListener(callback)

    local function callback(sender, eventType)
        if eventType == ccui.TouchEventType.ended then
            NetMsg_xxx.XXX(guildId, 1)--发包
        end
    end
    applyBtn:addTouchEventListener(callback)

    --根据状态刷新显示效果
    if btnState == MsgHhData.ADDHH_REFUSE then -- 1
        addBtn:show()
        applyBtn:hide()

        addBtn:setEnabled(false)

        m_Label_JoinHh:setString("加入")
        m_Label_NoOpen:show()
        m_Label_LevelLimit:hide()
        
    elseif btnState == MsgHhData.ADDHH_IMMEDIATELY then -- 2
        addBtn:show()       
        applyBtn:hide()

        addBtn:setEnabled(true)

        m_Label_JoinHh:setString("加入")
        m_Label_NoOpen:hide()
        m_Label_LevelLimit:hide()
        
    elseif btnState == MsgHhData.ADDHH_APPROVAL then -- 3
        addBtn:hide()       
        applyBtn:show()
        
    elseif btnState == MsgHhData.ADDHH_LEVEL then -- 4
        addBtn:show()       
        applyBtn:hide()

        addBtn:setEnabled(false)

        m_Label_JoinHh:setString("加入")
        m_Label_NoOpen:hide()
        m_Label_LevelLimit:show()
        m_Label_LevelLimit:setString("等级>=" .. nNeedPlayerLv)
        
    elseif btnState == MsgHhData.ADDHH_MEMMAX then -- 5
        addBtn:show()       
        applyBtn:hide()

        addBtn:setEnabled(false)

        m_Label_JoinHh:setString("已满")
        m_Label_NoOpen:hide()
        m_Label_LevelLimit:hide()
        
    end 
end

需求:


image.png
上一篇 下一篇

猜你喜欢

热点阅读