您的位置:首页 > 其它

状态机--状态机2,关于战斗中兵种状态的新增状态

2015-04-02 20:34 239 查看
从上一篇状态机1来看,似乎没有什么大问题,状态之间的切换很简单嘛,但是,出现

但是了,但是策划是种天生具备加需求的生物,而做为将需求变成代码逻辑的程序猿来

说,只能say ok,I look(好吧,我看看),好吧,那来看看有什么新的需求

战斗模块在有各种复杂的技能,技能中包含着一种控制行为的buff,称为控制行为buff,

比较常见的控件行为buff有冰冻,眩晕,击飞等等,以下是一个带有控制行为buff的技能

描述:霜冻 造成100点伤害,并冰冻敌人3s

受到对应控制行为buff的作用角色会进入到对应的状态,

如角色中了一个冰冻buff,那么角色会进入到冰冻状态,表现为角色动画停止在当前帧,

并带有冰冻特效,无法进行攻击,ok,我们先不管什么复杂的技能,来看代码如何变化,

这里有一个新的状态是冰冻,那么我们在兵种类中加一个冰冻的接口,具体代码如下:

local Soldier = class("Soldier")

function Soldier:ctor()

end

--待机
function Soldier:onIdle()
print("切换到待机状态")
end

--行走
function Soldier:onWalk()
print("切换到行走状态")
end

--攻击
function Soldier:onAttack()
print("切换到攻击状态")
end

--冰冻
function Soldier:onFrozen()
print("切换到冰冻状态")
end

return Soldier


新加了一个onFrozen,在这个接口下实现状态的切换,在角色中了一个冰冻buff时就调用这个接口,

使角色的动画停在当前帧,并带有冰冻特效,但根据冰冻的作用来看这里有很大的问题,冰冻状态

会持续一段时间,在这段时间内角色不能切换到待机状态,行走状态,攻击状态,状态的切换有条件

限制,好的,那来修改代码呗,修改后的代码如下:

这里加一个文件,定义状态id,比较简单,理解上没有难度

local StateId = {}

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

return StateId


兵种的代码如下:

local StateId = require("app.edition3.StateId")

local Soldier = class("Soldier")

function Soldier:ctor()
self.iStateId = StateId.unKnown
end

--待机
function Soldier:onIdle()
if self:isFrozen() then return end
self.iStateId = StateId.idle
print("切换到待机状态")
end

--行走
function Soldier:onWalk()
if self:isFrozen() then return end
self.iStateId = StateId.walk
print("切换到行走状态")
end

--攻击
function Soldier:onAttack()
if self:isFrozen() then return end
self.iStateId = StateId.attack
print("切换到攻击状态")
end

--冰冻
function Soldier:onFrozen()
if self:isFrozen() then return end
self.iStateId = StateId.frozen
print("切换到冰冻状态")
end

function Soldier:isFrozen()
return self.iStateId == StateId.frozen
end

return Soldier


加了一个isFrozen()的函数,返回角色是否处于冰冻状态,然后在其他几个函数中,

在切换状态前先做一下判断,有一点不是一定的,就是当前状态切换到当前状态,

如冰冻状态切换到冰冻状态,这个看需求了,大部分情况下这种切换是无意义的

经过简单的修改,代码逻辑也能按照预想的逻辑走了,一切看似正常,就加了一点点

代码问题就解决了,真的解决了吗?不是的,要知道,要谨记下面这一句话:

策划是种天生具备加需求的生物

是啊,需求总是在变化的,想想,如果要求加一个眩晕的状态,那会有多少的改动?

按照上面的做法,每加一个状态都需要去检查是否需要去给其他状态切换加一些约束

条件,如冰冻,到项目后期,兵种的状态越来越多,那加一个状态需要检查多少代码,

想想都疯掉,恨不得把策划揍一顿,可是想想这些状态需求都是合理的,那做为工程师

(为什么我不说程序员,因为两者是有区别的),我们是需要一个良好的解决方案的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: