版权所有。所有权利保留。
欢迎转载,转载时请注明出处:
http://blog.csdn.net/xiaofei_it
本章介绍状态机和常数类。
首先介绍游戏状态。游戏状态通常会有欢迎状态、关卡选择状态、不同游戏模式状态、结果显示状态等。
一般ImageView或者SurfaceView都会根据不同状态进行不同的绘制。比如在欢迎状态就要绘制欢迎界面,在游戏模式就要绘制各个物体。
上一章介绍的onKeyDown函数,其中也是根据不同状态进行处理的。尤其是在游戏进行时,一定要保存游戏进度。
状态机是一个描述和改变状态的类。这个类通常要使用Singleton设计模式实现。状态机保存当前的状态,并且根据用户指示切换到下一个状态。这个切换通常不需要参数,因此实现了自动化。比如游戏欢迎模式中,用户调用状态机的moveToNextState就可以让状态机自动切换到下一个状态,通常是游戏状态。
游戏状态用枚举类型表示。
public enum StateEnum { welcome,gameMode,resultShow; }
public class StateMachine { private StateEnum state; private static StateMachine instance=null; private StateMachine() { state=StateEnum.welcome; } public static StateMachine getInstance() { if (instance==null) instance=new StateMachine(); return instance; } public StateEnum getState() { return state; } public void setState(StateEnum state) { this.state=state; } public void moveToNextState() { switch (state) { case welcome: state=StateEnum.gameMode;break; case gameMode: state=StateEnum.resultShow;break; case resultShow: state=StateEnum.gameMode;break; } } }
在Activity的onResume函数中,最好添加以下代码:
StateMachine sm=StateMachine.getInstance();
看preference中有没有游戏进度记录,如果有,那么还要使用sm.setState()函数设置当前的状态。
常数类也是Singleton,保存游戏参数。
下来给出Const类的实现。init不同于构造函数。在Activity启动时初始化各参数的时候要用到相应的参数,比如屏幕高和宽,这个时候可以通过init的参数传给Const。
Const内部的参数分为两类,final和非final。注意其中的区别:final是游戏一开始就固定了的参数,之后不会再改变。而非final在之后会改变。所以final是public,可以由外部直接使用,而非final则不是。不过要注意,如果final成员是一个类,那么其内部的数据也是可以改变的,所以读者在设计时要谨慎。
public class Const { public final int i1; private int i2; private static Const instance=null; private Const() { } public void setI2(int i) { i2=i; } public int getI2() { return i2; } public static Const getInstance() { if (instance==null) instance=new Const(); return instance; } public void init(int i) { } }