状态模式(State)
公司目前项目做一款挂机卡牌游戏,核心战斗中角色的管理,场景的管理,都用到了状态模式。
状态模式是设计模式中,游戏开发最常用也是最重要的模式。
状态模式有三要素:
Context:拥有状态的类。
State:状态模式的基类。
ConcreteState:具体状态。
举个例子:一个手机的网络状态,
Context:手机的网络
State: 未连接,连接中 ,已连接。
ConcreteState:State 对应的图标。
状态过度:未连接 ---> 连接中 ---> 已连接。(因为就算是光速也需要时间)
可以是枚举,懒得写了, 1 ,2,3 对应:未连接,连接中 ,已连接
现在是敲代码时间:
Phone.cs
public class Phone :Entity
{
State mState = null;
}
public void Request(int cValue)
{
mState.Handle(cValue);
}
public void SetState(State cState)
{
mState=cState;
}
State.cs
public abstract class State
{
Context mContext = null;
public State (Context cContext)
{
mContext = cContext;
}
public abstract void Handle(int cValue);
}
public class ConcreteState01 : State
{
public override void Handle(int cValue)
{
//这里是状态过度,由 1 到 2
if(cValue == 2)
{
// ConcreteState02 是连接中
mContext.SetState(New ConcreteState02(mContext) )
}
}
}
...
以上3个具体类,都需要重新定义 Handle ,用来区分具体的 显示WIFI图标。这里就省略了。
void test()
{
Phone tPhone = new Phone();
tPhone .SetState(New ConcreteState01());
if(xxx) //这里是业务逻辑,比如:这个电话目前断网,刚有信号
tPhone.Request(2);
}
ET里边真实项目用到最多的就是FSM。网上我看有很多人都实现过,回头找到一个好的版本贴到这里。