Androidゲーム制作心得(二)——ステータスマシンと定数類


著作権所有.すべての権利は保持されます.
転載を歓迎します.転載する時、出典を明記してください.
http://blog.csdn.net/xiaofei_it
この章では、ステータスマシンと定数クラスについて説明します.
まずはゲームの状態をご紹介します.ゲームの状態は通常、ウェルカム状態、レベル選択状態、異なるゲームモード状態、結果表示状態などがあります.
一般的にImageViewまたはSurface Viewは、状態によって異なる描画を行います.たとえば、ウェルカム状態でウェルカムインタフェースを描き、ゲームモードで各物体を描きます.
前章で紹介したonKeyDown関数も,その中でも異なる状態に応じて扱う.特にゲームを行う場合は、必ずゲームの進捗を保存します.
ステータスマシンは、ステータスを記述し、変更するクラスです.このクラスは通常Singleton設計モードを用いて実現される.ステートマシンは現在の状態を保存し、ユーザーの指示に従って次の状態に切り替えます.このスイッチングは通常パラメータを必要としないため,自動化が実現される.例えばゲームウェルカムモードでは,ユーザがステートマシンのmoveToNextStateを呼び出すことで,ステートマシンを自動的に次の状態に切り替えることができ,通常はゲーム状態である.
ゲームステータスは列挙タイプで表される.
public enum StateEnum
{
	welcome,gameMode,resultShow;
}

StateMachineのコード例を以下に示します.読者がSingletonのデザインパターンを知らない場合は、関連資料を参照してください.通常、このようなクラスには常にインスタンスが1つしかありません.使用するたびにgetInstance()関数が呼び出されます.
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関数は,対応する変更が望ましい.
ActivityのonResume関数では、次のコードを追加することが望ましいです.
StateMachine sm=StateMachine.getInstance();
preferenceにゲームの進捗記録があるかどうかを見て、ある場合はsm.setState()関数を使用して現在の状態を設定します.
定数クラスもSingletonで、ゲームパラメータを保存します.
以下にConstクラスの実装を示す.Initは構造関数とは異なります.Activity起動時に各パラメータを初期化する場合は、画面の高さや幅など、対応するパラメータを使用します.この場合はinitのパラメータでConstに渡すことができます.
Const内部のパラメータは2種類あり,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)
	{
	}
}