概要
登場人物が一人だけだと寂しいので、もう一人キャラクターを追加してみましょう。
プログラム
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
検証用コード
添付ファイル
このwikiの更新情報RSS