美文网首页cocos2d-Luacocos2d
cocos2d-lua 简单状态机 机制

cocos2d-lua 简单状态机 机制

作者: 人气小哥 | 来源:发表于2017-11-02 10:52 被阅读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

相关文章

  • cocos2d-lua 简单状态机 机制

    以前讲过cocos-lua的状态机组件 传送门1: http://www.jianshu.com/p/cd5821...

  • 浅谈TCP(2):流量控制与拥塞控制

    上文浅谈TCP(1):状态机与重传机制介绍了TCP的状态机与重传机制。本文介绍流量控制(Flow Control,...

  • Boost.Msm 介绍

    原文:Boost.Msm guide译者:penghuster 1 简单状态机 简单状态机按照如下工作流程: 它包...

  • Flink状态机制

    什么是状态 首先要知道,状态指的是算子的状态。为什么算子需要状态,状态的用处无非两点: 实现算子的逻辑(作为一种中...

  • 3. 状态机的设计

    参考链接:1. C语言实现简单状态机2. C语言最优状态机规范3. geek青年的状态机

  • 浅析 Redis 主从复制实现原理

    本篇主要分三部分讨论Redis主从复制的实现原理:主从复制过程、状态机、源码解析。Redis从节点使用了状态机机制...

  • Tendermint的学习

    简介 什么是Tendermint? Tendermint是一个基于pBFT(实用拜占庭容错)共识机制生成的状态机,...

  • 有限状态机与JavaScript

    有限状态机与JavaScript 有限状态机是一种很有用的编程模型,简单来说,我理解的有限状态机一个显著的作用是降...

  • 游戏开发中怪物AI实现方案总结

    前言 在游戏开发中实现怪物AI逻辑的主要技术有两种:1、状态机2、行为树。 他们两者的实现机制不一样,其中状态机是...

  • LabVIEW笔记(二)——基础知识

    12.利用数据依赖确定事件顺序 13.状态机编程创建项目时创建简单状态机project14.控件赋值contrl ...

网友评论

    本文标题:cocos2d-lua 简单状态机 机制

    本文链接:https://www.haomeiwen.com/subject/bzcopxtx.html