2009.10.21
category
comments

Progression4(ベータ版)でPRMLLoaderを使うには

※Progression4(正式版)でPRMLLoaderの仕様が一部変更されました。下記の方法よりも、よりスマートに実装出来るようになってるのでこちらを参考にして下さい。

Progression4では仕様変更により今までのお作法が通用しない部分が結構あって、PRMLLoaderもその一つ。最近はPRMLからシーン構成を生成するので解決法をずっと探ってたんだけど、ようやく動作したのでメモ。同じとこで詰まってる人がいたら参考にしてみて下さい。

ポイントは以下の3つ。
1、PRML内で設定するシーンクラスをあらかじめ宣言しておく(25~26行目)
 → 宣言してないとエラーが出る。

2、親クラスを呼び出すときに第1、第2引数をnullにしておく(34行目)
 → 通常はsuper(“index”, IndexScene, new WebConfig());となるが、PRMLをつかってシーンを生成すると全部自動で設定してくれるため、ここで宣言したidとPRMLで自動宣言されるidが重複してしまいエラーが出る。

3、PRMLLoaderクラス内のmanagerを使う(45~56行目)
 → ここが一番の鬼門。PRMLLoaderを使ってシーン構造を生成した場合はPRMLLoader.managerに展開される。なので「外部同期機能」や「最初のシーンに移動」とかを下記のようにしてしまうと別管理のmanagerとして動作してエラーが出る。

manager.sync = true;
manager.goto(manager.syncedSceneId);

この3つのポイントをまとめると、ドキュメントクラスは以下のようになる。

Index.as

package {
	import jp.progression.casts.*;
	import jp.progression.commands.display.*;
	import jp.progression.commands.lists.*;
	import jp.progression.commands.net.*;
	import jp.progression.commands.tweens.*;
	import jp.progression.commands.*;
	import jp.progression.config.*;
	import jp.progression.data.*;
	import jp.progression.debug.*;
	import jp.progression.events.*;
	import jp.progression.scenes.*;

	import flash.events.Event;
	import flash.net.URLRequest;
	import jp.progression.loader.PRMLLoader;

	/**
	 * ...
	 * @author ...
	 */
	public class Index extends CastDocument {

		//PRMLで使うシーンクラスを宣言
		IndexScene;
		MyScene;

		/**
		 * 新しい Index インスタンスを作成します。
		 */
		public function Index() {
			// 自動的に作成される Progression インスタンスの初期設定を行います。
			// 生成されたインスタンスにアクセスする場合には manager プロパティを参照してください。
			super( null, null, new WebConfig() );
		}

		/**
		 * SWF ファイルの読み込みが完了し、stage 及び loaderInfo にアクセス可能になった場合に送出されます。
		 */
		protected override function atReady():void {

			var pl:PRMLLoader = new PRMLLoader(stage, new URLRequest("xml/prml.xml"));
			pl.addEventListener(Event.COMPLETE, function(e:Event):void
			{
				pl.removeEventListener(Event.COMPLETE, arguments.callee);

				// 開発者用に Progression の動作状況を出力します。
				Debugger.addTarget(pl.manager);

				// 外部同期機能を有効化します。
				pl.manager.sync = true;

				// 最初のシーンに移動します。
				pl.manager.goto(pl.manager.syncedSceneId);

				// prml.xmlの内容
				trace("prml="+pl.manager.root.toXMLString());
			});
		}
	}
}

prml.xml




    
    
    

5 Comments

  1. いや、もうほんっっっとに助かりました!
    ありがとうございます!

    短納期の案件でProgression + PRMLで進めていて
    完成間近にふとブラウザと同期できていないことに
    気づいて、完全にパニクっていました。
    まさに鬼門でつまづいていました。

    いろんなサイト見たのですが、ここだけが
    ピンポイントの解決策がでていました。
    みんなつまづかないんですかね?

    本とーーーーーーーーーーーーーーーーーーに
    ありがとうございました。

  2. simo Says

    ハラペコさん、はじめまして!

    お役に立てたようで良かったです。自分もここで躓いて、なかなかProg4に移行できなかったクチです。確かに皆さんあまりこのポイントで迷ってないようなので、自分の作り方がおかしいのかなと思ってました。w

    同じように悩んでいる方がいらっしゃったのでホッとしております。(謎

  3. amane123 Says

    掲載の方法で試してみました。
    FlashDevelopで開発しているのですが、最初のポイントである
    シーンクラスの宣言のところがうまくいきませんでした。
    アクセス修飾子をpublicにしてもPAMLLoader内で参照できず、
    アクセス修飾子を記述しなければコンパイルが通りません。
    こういった場合どうすればいいのでしょうか?
    ちなみに開発環境は何を使用してますか?

  4. simo Says

    はじめまして。

    自分の開発環境ですが、FlashDevelopとFlashCS3です。Index.asとIndexScene.asは同階層にありますか?

    どういったエラーが出ていますか?またPRMLLoader内での参照はどうやっていますか?

Post a comment




Comment

Trackbacks

この記事のコメント・トラックバックRSS