状态机--状态机4,关于战斗中负责兵种状态切换的状态机

本文介绍了如何设计一个状态机,用于游戏中兵种的状态切换。状态切换由事件驱动,如onIdle()、onWalk()等,且存在进入和退出状态的逻辑。状态机包含有限制条件的状态切换规则,如冰冻状态下无法切换到攻击或行走状态。通过状态机、状态规则配置、状态创建器和状态基类实现状态管理。状态机在Soldier类中被绑定并调用update()接口进行状态更新。该设计遵循开闭原则,易于扩展和维护。

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

前面花了4篇文章废话了那么多却没有提到传说中的状态机,那么这一篇就来讲讲那个

传说中的状态机到底是个长什么样的东东,前面几篇主要是做铺垫用,下面总结下:


1.状态切换由事件驱动,如调用onIdle()进入待机状态,调用onWalk()进入行走状态

2.状态有进入,也有退出,如调用onFrozen()进入冰冻状态,调用onFrozenEnd()退出冰冻状态

3.状态之间的切换是有限制条件的,如处于冰冻状态不能切换到攻击状态或行走状态


流程:事件--->状态机--->匹配状态切换规则--->可切换,新状态进入,旧状态退出


简单说下代码逻辑,兵种类中提供事件接口,如onWalk(),onAttack()等

实现一个状态机,将状态机绑定到兵种对象上,将状态切换规则提取出,

绑定到状态机上,实现一个状态创建器用来创建状态,绑定到状态机中,

从结构上看就是兵种身上有一个状态机,状态机里有状态切换规则和状态

创建器,下面来看代码:


StateId.lua,首先定义状态id,这个比较简单,不多说,下面的name不是必要的,只是方便调试

local StateId = {}

StateId.unKnown = -1
StateId.idle = 1 --待机
StateId.walk = 2 --行走
StateId.attack = 3 --攻击
StateId.frozen = 4 --冰冻
StateId.vertigo = 5 --眩晕

StateId.name = {}
StateId.name[StateId.idle] = "待机状态"
StateId.name[StateId.walk] = "行走状态"
StateId.name[StateId.attack] = "攻击状态"
StateId.name[StateId.frozen] = "冰冻状态"
StateId.name[StateId.vertigo] = "眩晕状态"

return StateId


Soldier.lua,兵种类,定义了事件接口,绑定状态机,将状态切换委托给状态机去处理:

local StateId = require("app.edition5.state.StateId")
local Soldier = class("Soldier")

function Soldier:ctor()

end

--绑定状态机
function Soldier:bindStateMachine(stateMachine)
    self.stateMachine = stateMachine  
    self.stateMachine:bindSoldier(self)      
end

--待机
function Soldier:onIdle()
    self:toggleState(StateId.idle)
end

--行走
function Soldier:onWalk()
    self:toggleState(StateId.walk)
end

--攻击
function Soldier:onAttack()
    self:toggleState(StateId.attack)
end

--冰冻
function Soldier:onFrozen()
    self:toggleState(StateId.frozen)
end

--冰冻结束
function Soldier:onFrozenEnd()
    self:onIdle()
end

--眩晕
function Soldier:onVertigo()
    self:toggleState(StateId.vertigo)
end

--切换状态
function Soldier:toggleState(iStateId)
    self.stateMachine:toggleState(iStateId)
end

--切换状态失败
function Soldier:toggleStateFail(iCurrentStateId, iNewStateId)
    print("无法从状态 ( " .. StateId.name[iCurrentStateId] .. " ) 切换到状态 ( " .. StateId.name[iNewStateId] .. " )")
end

return Soldier


StateRuleConfig.lua:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值