[AS3]Progression4でPRML形式のXMLを読み込み動的にシーン作成+シーンごとにデータをもたせる

2010/05/16

こんにちは。きんくまです。

ひきつづきProg4です。
Prog本によるとPRML形式のXMLを使う事で、シーン(実際に見えるページではなく構造だけ)を動的に生成することができるそうです。
PRMLはProgressionで定義されているXMLの一種で、公式にもマニュアルがありました。

>> PRML リファレンス

それで、これを使って動的にサイトのシーン構造を生成して、さらにそのXMLにシーンごとのデータを埋め込むことができるので、結構いろいろなことができます。

そんで、prog本を参考にしつつ作ってみました。

まずもととなるXML
■scenedata.xml

<?xml version="1.0" encoding="utf-8" ?>
<prml version="2.0.0" type="text/prml">
	<scene name="index" cls="IndexScene" title="Index">
		<bookname>Prog入門</bookname>
		<scene name="scene1" cls="Scene1" title="Scene1">
			<bookname>Prog4をはじめてみよう</bookname>
		</scene>
	</scene>
</prml>

■ドキュメントクラス Index
ここでprog本のサンプルデータの方は大丈夫だったんだけど書籍版だとPRMLLoaderのコンストラクタの
第3引数にautoGoto:trueをするって書いてなくて最初なにもおこらんかったです。
なので、そこに気をつければ大丈夫。

※追記 nium先生の紹介によりautoGotoをしなくても手動でXMLよみこみ+サイトルートにいけるみたいです。
方法は下記サイトにより紹介されてますです。
>> Progression4(正式版)のPRMLLoaderが変わった | 5ive.blog

package {
	import flash.net.URLRequest;
	import jp.progression.casts.CastDocument;
	import jp.progression.config.WebConfig;
	import jp.progression.loader.PRMLLoader;
	
	public class Index extends CastDocument 
	{
		public function Index() {
			super(null, null, new WebConfig() );
			
			//XMLでひもづけているシーン用のクラスを宣言しておく
			IndexScene; 
			Scene1;
		} 
		
		override protected function atReady():void 
		{
			//第3引数のautoGoto:trueをしないとドキュメントクラスに移動しない
			var prml:PRMLLoader = new PRMLLoader(stage, new URLRequest("scenedata.xml"), {autoGoto:true});
		}
	}
}

■IndexScene
Debugger関係はドキュメントクラスでやるとうまくいかなかったので、
サイトルートであるこのクラスのatSceneLoadでやるといいかも。
あと、XMLに書いたデータはSceneObject.dataHolder.dataにXML形式で入っているので、
XMLUtilっていう便利クラスをつかってオブジェクトに変換してあげると使い勝手がいいみたい。

package {
	import jp.nium.utils.XMLUtil;
	import jp.progression.debug.Debugger;
	import jp.progression.scenes.SceneId;
	import jp.progression.scenes.SceneObject;
	
	public class IndexScene extends SceneObject {
		
		public function IndexScene( name:String = null, initObject:Object = null ) 
		{
			super( name, initObject );
		}
		
		override protected function atSceneLoad():void 
		{
			//ドキュメントクラスでこの設定をするとエラーになるのでここでやる
			Debugger.addTarget(manager); 
			manager.sync = true;
		}
		
		override protected function atSceneInit():void
		{
			var xmlData:XMLList = new XMLList(dataHolder.data);
			var obj:Object = XMLUtil.xmlToObject(xmlData);
			trace(obj.bookname); //出力:Prog入門
			
			//シーン移動
			manager.goto(new SceneId("/index/scene1"));
		}
	}
}

■移動先Scene1

package  
{
	import jp.nium.utils.XMLUtil;
	import jp.progression.scenes.SceneObject;

	public class Scene1 extends SceneObject
	{
		
		public function Scene1( name:String = null, initObject:Object = null ) 
		{
			super( name, initObject );
		}
		
		override protected function atSceneInit():void
		{
			var xmlData:XMLList = new XMLList(dataHolder.data);
			var obj:Object = XMLUtil.xmlToObject(xmlData);
			trace(obj.bookname); //出力:Prog4をはじめてみよう
		}
	}

}

シーンごとに任意のデータを保持できるので、ベースとなるクラスを作って、各シーンのデータごとにシーンを変化させることで、いろいろと使い回しがきくようになると思います。


自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る