親シーンからの到着、親シーンへの移動で発生するイベント
fig03_01-02.jpg



子シーンからの到着、子シーンへの移動で発生するイベント
fig03_01-03.jpg



現在のシーンを通過する場合に発生するイベント
fig03_01-04.jpg



同じ親シーンをもつ子シーンの間で移動する場合に発生するイベント
親シーンではイベントが発生しない点に注意
fig03_01-05.jpg



「従兄弟→叔父→親→現在」と移動する場合に発生するイベント
祖父シーンではイベントが発生しない点に注意
fig03_01-06.jpg



「現在→親→叔父→従兄弟」と移動する場合に発生するイベント
祖父シーンではイベントが発生しない点に注意
fig03_01-07.jpg

通称wonderfl本に参加しました!

|

ご存じ面白法人カヤックのwonderflを利用してActionScript 3を始めようという新しい試みの本の執筆に参加しました。その名も「ブラウザで無料ではじめるActionScript 3.0 ―It's a wonderfl world―」。

ブラウザで無料ではじめるActionScript 3.0 ―It's a wonderfl world―
4862670776


執筆陣も内容も豪華です!
面白法人カヤックFlashチーム(大塚雅和、小林太郎、道家陽介、中野総子、原真人、日高一明、村井孝至)、野中文雄、大重美幸、高輪知明nutsu、イズカワタカノブkatamari、村山健undefined、梅原宗士水玉製作所、小林陽介ローハイド、池田泰延clockmaker、吉川佳一BOW、小林茂yapan.org(敬称略)

clockmakerこと池田 泰延さんがPapervision3Dの入門書を出しました!
これは迷わず買いでしょう!


Flash3Dコンテンツ制作のためのPapervision3D入門
Flash3Dコンテンツ制作のためのPapervision3D入門

公式のPapervison3D日本語フォーラムてのができましたよ。

TheFlashBlog iPhoneカテゴリ

|

Adobe TheFlashBlogにFlash CS5で作るiPhone Appについてのエントリーがぼちぼち出てきましたよ。ときどき、チェックしよう!

TheFlashBlog iPhoneカテゴリ

リキッドレイアウトに対応

|

リキッドレイアウトに対応したバージョンを作りました。なんか結果オーライのような感じですが、今日の所はこれでOKということで、改めてスマートな方法を考えたいと思います。そろそろ次のテーマに移ります。

swfを試す。

サンプルファイル一式→ LiquidLayout_1.zip

なお、このバージョンはProgression 4.0.1 Public Beta1.2で作ってあります。1.1ではNextSceneボタンとPreviousSceneボタンが正しく動作しません。

そうそう、シーンを進めると一瞬だけ上に現れるバーはプログレスバーなんですけどね。ちゃんと動いていいるのかな??って感じです。

niumさんから最適解をもらいました。こういうやり方がよいということです。
ステージリサイズには対応してませんが、これでステージ中央に表示されます。プログレスバーにも対応できますね。

[:script:] ThePageクラス
package pages{
  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 flash.display.Loader;
  import flash.net.URLRequest;
  
  /**
   * ...2009.10.27b
   * @author ...oshige
   */
  public class ThePage extends CastMovieClip {
    private var _url:String;
    
    public function ThePage(url:String, initObject:Object=null) {
      _url = url;
      // 親クラスを初期化します。
      super(initObject);
    }
    
    protected override function atCastAdded():void {
      addCommand(
         new Prop(this,{y:-stage.stageHeight}),
         //swf読み込み
        new LoadSWF(new URLRequest(_url), null, {
          onProgress:function():void {
            trace(this.bytesLoaded + " / " + this.bytesTotal + " (" + this.percent + "%)" );
          },
          onComplete:function():void{
            var ld:Loader = this.loader;
            self.addChild(ld);trace("self=",self);
            ld.x=(stage.stageWidth-ld.width)/2;
            ld.y=(stage.stageHeight-ld.height)/2;
          }
        }),
         new DoTweener( this, {y:0,time:1, transition:"easeinoutsin"} )
      );
    }
    
    protected override function atCastRemoved():void {
      addCommand(
          new DoTweener( this, { y:stage.stageHeight, time:1, transition:"easeinoutsin"} ),
          //読み込んだswfを消すために行う
          new RemoveAllChildren(this)
      );
    }
  }
}

この変更にともなって、ThePageクラスを呼び出すTheSceneクラスとIndexSceneクラスを少し変更。

swfを試す。

サンプルファイル一式→ LoadSWF_pages4.zip

さらにLoadSWF()が続く

|
しつこく、まだやってます (^ ^;;
読み込んだloaderの座標をtweenせずに、ページ全体をtweenさせるのならば、loaderのページ内での座標さえフィックスできればいいというわけで、スクリプトが少し簡単になりました。

package pages{
	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 flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.net.URLRequest;
	/**
	 * ...2009.10.27
	 * @author ...oshige
	 */
	public class ThePage extends CastMovieClip {
		private var _url:String;
		private var page:CastMovieClip;
		public function ThePage(initObject:Object=null) {
			// 親クラスを初期化します。
			super(initObject);
			_url = initObject.url;
			page = this;
		}
		
		protected override function atCastAdded():void {
			var list:SerialList = new SerialList();
			list.addCommand(
				new Prop(page,{y:-stage.stageHeight}),
				new LoadSWF(new URLRequest(_url)),
				function():void {
					var loader:Loader = Loader( this.latestData );
					list.insertCommand(
						new Prop(loader, {x:(stage.stageWidth-loader.width)/2,y:(stage.stageHeight-loader.height)/2}),
						new AddChild(page, loader)
					)
				},
				new DoTweener( page, { y:0,time:1, transition:"easeinoutsin"} )
			)
			list.execute();
		}
		
		protected override function atCastRemoved():void {
			addCommand(
		 	 	new DoTweener( page, { y:stage.stageHeight, time:1, transition:"easeinoutsin"} ),
		  		//読み込んだswfを消すために行う
		  		 new RemoveAllChildren(this)
			);
		}
	}
}

で、残った問題は読み込み中のプログレスバーの表示とかいろいろです。
スクリプトがだいぶ変わってしまいますが、次のようにしてみました。いまココです。

package pages{
	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 flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.net.URLRequest;
	/**
	 * ...2009.10.27
	 * @author ...oshige
	 */
	public class ThePage extends CastMovieClip {
		private var _url:String;
		private var page:CastMovieClip;
		public function ThePage(initObject:Object=null) {
			// 親クラスを初期化します。
			super(initObject);
			_url = initObject.url;
			page = this;
		}
		
		private function loadSWF():void {
			//pageコンテンツをURLから読み込む(swf、画像)
			var ldswf:LoadSWF = new LoadSWF(new URLRequest(_url));
			ldswf.onProgress = function():void {
			 	trace(ldswf.bytesLoaded + " / " + ldswf.bytesTotal + " (" + ldswf.percent + "%)" );
			};
			ldswf.onComplete = function():void{
				var ld:Loader = this.loader;
				 page.addChild(ld);
				ld.x=(stage.stageWidth-ld.width)/2;
				ld.y=(stage.stageHeight-ld.height)/2;
			};
			ldswf.execute();
		}

		protected override function atCastAdded():void {
			addCommand(
			   new Prop(page,{y:-stage.stageHeight}),
			   //swf読み込み
			   new Func(loadSWF),
			   new DoTweener( page, {y:0,time:1, transition:"easeinoutsin"} )
			);
		}
		
		protected override function atCastRemoved():void {
			addCommand(
		 	 	new DoTweener( page, { y:stage.stageHeight, time:1, transition:"easeinoutsin"} ),
		  		//読み込んだswfを消すために行う
		  		 new RemoveAllChildren(this)
			);
		}
	}
}

addCommandとinsertCommand

|
LoadSWFがらみでSerialListのinsertCommand()をnorthorintさんに教えてもらいました。northorintさんのblogに記事がありますが(1年前にこれやってるんですね)、これを参考にaddCommandとinsertCommandの実行順をテストしてみました。なるほど!

[:script:]addCommandとinsertCommandの実行順をテストする
var list:SerialList = new SerialList();
list.addCommand(  
 new Trace("コマンドスタート"),  
 function ():void{  
    list.addCommand(new Trace("addCommand1のタイミング"));
    list.insertCommand(new Trace("insertCommandのタイミング"));  
    list.addCommand(new Trace("addCommand2のタイミング")); 
 },  
    new Trace("コマンド終わり!")  
) 
trace("executeの前----------");
list.execute();
trace("executeの後----------");

出力結果は次のようになります。
executeの前----------
コマンドスタート
insertCommandのタイミング
コマンド終わり!
addCommand1のタイミング
addCommand2のタイミング
executeの後----------

ディープリンクしたときに、UIパネルなどが正しく表示されるようになったバージョンのファイル一式をアップします。
アップを見合わせていた「内部的に??な部分」は、NextButton(initObject)のinitObjectでプロパティを設定したときに正しく機能しないという問題だったのですが、これはProgression側のバグだと確認がとれました。このサンプルで行っているように問題回避方法はあるので、とりあえず一件落着です。この件については、Progressionの公式フォーラムにやりとりがあります。

swfを試す。
sceneCを直接開く。

サンプルファイル一式→ LoadSWF_pages3.zip