状态机--状态机2,关于战斗中兵种状态的新增状态
2015-04-02 20:34
239 查看
从上一篇状态机1来看,似乎没有什么大问题,状态之间的切换很简单嘛,但是,出现
但是了,但是策划是种天生具备加需求的生物,而做为将需求变成代码逻辑的程序猿来
说,只能say ok,I look(好吧,我看看),好吧,那来看看有什么新的需求
战斗模块在有各种复杂的技能,技能中包含着一种控制行为的buff,称为控制行为buff,
比较常见的控件行为buff有冰冻,眩晕,击飞等等,以下是一个带有控制行为buff的技能
描述:霜冻 造成100点伤害,并冰冻敌人3s
受到对应控制行为buff的作用角色会进入到对应的状态,
如角色中了一个冰冻buff,那么角色会进入到冰冻状态,表现为角色动画停止在当前帧,
并带有冰冻特效,无法进行攻击,ok,我们先不管什么复杂的技能,来看代码如何变化,
这里有一个新的状态是冰冻,那么我们在兵种类中加一个冰冻的接口,具体代码如下:
新加了一个onFrozen,在这个接口下实现状态的切换,在角色中了一个冰冻buff时就调用这个接口,
使角色的动画停在当前帧,并带有冰冻特效,但根据冰冻的作用来看这里有很大的问题,冰冻状态
会持续一段时间,在这段时间内角色不能切换到待机状态,行走状态,攻击状态,状态的切换有条件
限制,好的,那来修改代码呗,修改后的代码如下:
这里加一个文件,定义状态id,比较简单,理解上没有难度
兵种的代码如下:
加了一个isFrozen()的函数,返回角色是否处于冰冻状态,然后在其他几个函数中,
在切换状态前先做一下判断,有一点不是一定的,就是当前状态切换到当前状态,
如冰冻状态切换到冰冻状态,这个看需求了,大部分情况下这种切换是无意义的
经过简单的修改,代码逻辑也能按照预想的逻辑走了,一切看似正常,就加了一点点
代码问题就解决了,真的解决了吗?不是的,要知道,要谨记下面这一句话:
策划是种天生具备加需求的生物
是啊,需求总是在变化的,想想,如果要求加一个眩晕的状态,那会有多少的改动?
按照上面的做法,每加一个状态都需要去检查是否需要去给其他状态切换加一些约束
条件,如冰冻,到项目后期,兵种的状态越来越多,那加一个状态需要检查多少代码,
想想都疯掉,恨不得把策划揍一顿,可是想想这些状态需求都是合理的,那做为工程师
(为什么我不说程序员,因为两者是有区别的),我们是需要一个良好的解决方案的
但是了,但是策划是种天生具备加需求的生物,而做为将需求变成代码逻辑的程序猿来
说,只能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()的函数,返回角色是否处于冰冻状态,然后在其他几个函数中,
在切换状态前先做一下判断,有一点不是一定的,就是当前状态切换到当前状态,
如冰冻状态切换到冰冻状态,这个看需求了,大部分情况下这种切换是无意义的
经过简单的修改,代码逻辑也能按照预想的逻辑走了,一切看似正常,就加了一点点
代码问题就解决了,真的解决了吗?不是的,要知道,要谨记下面这一句话:
策划是种天生具备加需求的生物
是啊,需求总是在变化的,想想,如果要求加一个眩晕的状态,那会有多少的改动?
按照上面的做法,每加一个状态都需要去检查是否需要去给其他状态切换加一些约束
条件,如冰冻,到项目后期,兵种的状态越来越多,那加一个状态需要检查多少代码,
想想都疯掉,恨不得把策划揍一顿,可是想想这些状态需求都是合理的,那做为工程师
(为什么我不说程序员,因为两者是有区别的),我们是需要一个良好的解决方案的
相关文章推荐
- 状态机--状态机4,关于战斗中负责兵种状态切换的状态机
- 状态机--状态机6,关于战斗兵种的状态机初步优化和状态设计
- 状态机--状态机1,关于战斗中兵种状态的初步设计
- 状态机--状态机7,关于战斗兵种的状态机进阶设计与消息系统
- 状态机--状态机5,关于战斗兵种的多状态
- 状态机--状态机3,关于战斗中兵种状态的状态的结束
- 状态机--状态机8,关于战斗兵种的复合状态和动作融合技术
- 宿主中操作状态机工作流的状态
- 关于状态机的一点心得体会
- 关于复杂问题向01两种状态转化的一点看法
- 关于err-disabled状态的一切
- 关于ASP.NET State service状态服务的问题
- 关于HTTP及XMLHTTP状态代码一览
- 从工作流状态机实践中总结状态模式使用心得(转载)
- 关于状态机
- 请问一个关于GridView不同数据源切换后,换页状态的保持的问题!
- 关于VHDL状态机:不听老人言,吃亏在眼前。
- 关于视图状态
- 关于在界面中反馈长时间运算的状态的方法
- 关于快要成功这几天的状态!