トップページ > ゲーム制作 > 有限ステートマシンを実装する - 4



概要


登場人物が一人だけだと寂しいので、もう一人キャラクターを追加してみましょう。


プログラム

NPC.as
package
{
	public class NPC extends Entity
	{	
		public function NPC()
		{
			_name = "NPC";
			_fsm.state = StateHome.instance; // 最初は家にいる
		}
	}
}
 
NPCという新しいキャラクターを追加します。


StateHome.as
package  
{
	public class StateHome implements State
	{	
		private static var _instance:StateHome;
		public function StateHome(lock:SingletonLock) {}
		public static function get instance():StateHome
		{
			if (_instance == null) _instance = new StateHome(new SingletonLock());
			return _instance;
		}
 
		public function enter(entity:Entity):void
		{
			trace(entity.name + "は家に帰った");
		}
 
		public function update(entity:Entity):void
		{
			switch(int(Math.random() * 4))
			{
				case 0:
					trace(entity.name + "「ZZZ...」");
					break;
				case 1:
					trace(entity.name + "は現在読書中");
					break;
				case 2:
					trace(entity.name + "「腹減った・・・」");
					break;
				case 3:
					trace(entity.name + "「街へ遊びに行こうかな」");
					entity.fsm.state = StateTown.instance;
					break;
			}
		}
 
		public function exit(entity:Entity):void
		{
			trace(entity.name + "は家から出た");
		}
	}
}
 
class SingletonLock {}
 
NPCが住んでいる家を表すStateHomeクラスです。


StateTown.as
package  
{
	public class StateTown implements State
	{	
		private static var _instance:StateTown;
		public function StateTown(lock:SingletonLock) {}
		public static function get instance():StateTown
		{
			if (_instance == null) _instance = new StateTown(new SingletonLock());
			return _instance;
		}
 
		public function enter(entity:Entity):void
		{
			trace(entity.name + "は街に出た");
		}
 
		public function update(entity:Entity):void
		{
			switch(int(Math.random() * 4))
			{
				case 0:
					trace(entity.name + "は武器屋に入った");
					break;
				case 1:
					trace(entity.name + "はベンチで一休みしている");
					break;
				case 2:
					trace(entity.name + "「大きい本屋とかないかな」");
					break;
				case 3:
					trace("そろそろ家に帰ろうかな");
					entity.fsm.state = StateHome.instance;
					break;
			}
		}
 
		public function exit(entity:Entity):void
		{
			trace(entity.name + "は街から出た");
		}
	}
}
 
class SingletonLock {}
 
NPCがよく訪れる街であるStateTownクラスです。


Main.as
package
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	public class Main extends Sprite
	{
		private var entities:Vector.<Entity> = new Vector.<Entity>();
 
		public function Main()
		{
			entities.push(new Player());
			entities.push(new NPC());
 
			var timer:Timer = new Timer(15, 1000);
			timer.addEventListener(TimerEvent.TIMER, onTimer);
			timer.start();
		}
 
		private function onTimer(event:TimerEvent):void 
		{
			for each (var entity:Entity in entities)
			{
				entity.update();
			}
		}
	}
}
 
entitiesベクターにNPCオブジェクトを追加させます。


実行結果

主人公はダンジョンに進入した
NPCは家に帰った
主人公はモンスターを倒した!! HP25/30
NPCは現在読書中
主人公はモンスターを倒した!! HP21/30
NPCは現在読書中
主人公はモンスターを倒した!! HP17/30
NPC「街へ遊びに行こうかな」
NPCは家から出た
NPCは街に出た
主人公はモンスターを倒した!! HP12/30
NPC「大きい本屋とかないかな」
主人公はモンスターを倒した!! HP10/30
NPCは武器屋に入った
主人公はモンスターを倒した!! HP4/30
そろそろ家に帰ろうかな
NPCは街から出た
NPCは家に帰った
主人公はモンスターを倒した!! HP0/30
主人公はダンジョンから脱出した
主人公は宿屋に入った
NPCは現在読書中
ZZZ... : HP5/30
NPCは現在読書中
ZZZ... : HP10/30
NPC「ZZZ...」
ZZZ... : HP15/30
NPC「腹減った・・・」
ZZZ... : HP20/30
NPC「腹減った・・・」
ZZZ... : HP25/30
NPCは現在読書中
ZZZ... : HP30/30
主人公は宿屋から出た
主人公はダンジョンに進入した
NPC「街へ遊びに行こうかな」
NPCは家から出た
NPCは街に出た
主人公はモンスターを倒した!! HP28/30
そろそろ家に帰ろうかな
NPCは街から出た
NPCは家に帰った
主人公はモンスターを倒した!! HP25/30
NPC「街へ遊びに行こうかな」
NPCは家から出た
NPCは街に出た
主人公はモンスターを倒した!! HP19/30
NPC「大きい本屋とかないかな」
主人公はモンスターを倒した!! HP17/30
NPCは武器屋に入った
主人公はモンスターを倒した!! HP11/30
NPCは武器屋に入った
主人公はモンスターを倒した!! HP8/30
NPCは武器屋に入った
主人公はモンスターを倒した!! HP3/30
NPCはベンチで一休みしている
主人公はモンスターを倒した!! HP0/30
 


検証用コード


|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|
添付ファイル