2008/11/07 | 18:38 pm

xml からシーンとボタンを作る

「Is It So Easy」の northprint さんのこのエントリーを参考に作ってみます。

各ボタンは、xml を読み込んだ時にシーンと一緒に作成。
そして、その各ボタンは navi と言う名前の CastSprite に addChild します。
っで、navi を Event.RESIZE のイベントハンドラーで位置を操作する感じ。

private function setSiteNavigation():void {

	navi = new SiteNavigation();	// これは事前に public var などで定義しておく
	navi.id = "navi";

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new AddChild( progression.container, navi ),
		function():void { setSiteMenu() }
	);
	slist.execute();

}

public function setSiteMenu():void {

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new LoadURL( new URLRequest( "contents/xml/data.xml" ) ),
		function():void {
			addSceneFromXML( new XML( this.latestData ) );
			// xml から取得して生成されたシーンの内容を確認
			trace( toXMLString() );

			var plist:ParallelList = new ParallelList();

			for(var i:int=0; i<numScenes; i++) {
				var xlist:XMLList = new XMLList( scenes[i].sceneInfo.data );
				var obj:Object = XMLUtil.xmlToObject( xlist );
				var btn:MenuButton = new MenuButton();
				btn.setMenuName = obj.caption;
				btn.setSceneId = scenes[i].sceneId;
				btn.displayMenu();

				btn.x = (i + 1) * 50;
				btn.y = 10;

				// navi の中に addChild する
				plist.addCommand(
					new AddChild( navi, btn )
				)
			}

			// ParallelList を実行する
			this.parent.insertCommand(
				plist
			)
		}
	)
	slist.execute();

};

addSceneFromXML( new XML( this.latestData ) ); ってので、 this.latestData って書くと、
直前のデータを勝手に読み込んでくれるみたいです。
ステキ過ぎます、天才です。
numScenes も xml からシーンを読み込んだ段階で、生成されてるみたい。
addSceneFromXML() の直後に trace() とかで確認すると、xml で記述されてる の数と、あらピッタリ!

ちなみに、読み込んでいる data.xml の中身はこんな感じ

<?xml version="1.0" encoding="UTF-8" ?>

<prml version="2.0.0" type="text/prml">

	<scene name="about">
		<caption>about</caption>
	</scene>

	<scene name="contact">
		<caption>contact</caption>
	</scene>

</prml>

そして、各ボタンのクラスが ↓

public class MenuButton extends CastSprite {
	//public var _id:SceneId;
	public var _name:String;

	public var txt:TextField;

	/*======================================================================*//**
	 * コンストラクタ
	 */
	public function MenuButton( initObject:Object = null ) {
		super( initObject );

		txt = new TextField();
	}

	public function set setSceneId(id:SceneId):void { sceneId = id; }

	public function set setMenuName(name:String):void { _name = name; };

	public function displayMenu():void {

		txt.mouseEnabled = false;
		txt.text = _name;
		txt.setTextFormat( new TextFormat( null, 10 ) );
		addChild( txt );

	};

};

各メニュー用のボタンにアクションを追加するときは ↑ の
_onCastAdded() 内に記述するわけですね。


追記 : 08.11.07 – 20:21 pm

アホな事してた。
MenuButton.as の public var _id:SceneId; は全然要らない。。。。
ちゃんとボタンのシーンに登録するには、 sceneId に登録しなくちゃ意味無しなので、
public function set setSceneId(id:SceneId):void { _id = id; }; を
public function set setSceneId(id:SceneId):void { sceneId = id; }; に変更
アフォー過ぎて、鼻血でるかと思った。


追記 : 08.11.07 – 20:26 pm

あれ、何で MenuButton.as の元が CastSprite なんでしょー??
これって、もしかして CastButton なんじゃないのかな〜〜〜〜〜〜〜。
ちょっと書き換えたほうが良さげ。

COMMENT

POSTED

jam





JUN NAKAJIMA
Tokyo, Japan.
member of Onawatobi.
contact@brooklyn.jp