ご存じ面白法人カヤックのwonderflを利用してActionScript 3を始めようという新しい試みの本の執筆に参加しました。その名も「ブラウザで無料ではじめるActionScript 3.0 ―It's a wonderfl world―」。
ブラウザで無料ではじめるActionScript 3.0 ―It's a wonderfl world―
執筆陣も内容も豪華です!
面白法人カヤックFlashチーム(大塚雅和、小林太郎、道家陽介、中野総子、原真人、日高一明、村井孝至)、野中文雄、大重美幸、高輪知明nutsu、イズカワタカノブkatamari、村山健undefined、梅原宗士水玉製作所、小林陽介ローハイド、池田泰延clockmaker、吉川佳一BOW、小林茂yapan.org(敬称略)
clockmakerこと池田 泰延さんがPapervision3Dの入門書を出しました!
これは迷わず買いでしょう!
公式のPapervison3D日本語フォーラムてのができましたよ。
Adobe TheFlashBlogにFlash CS5で作るiPhone Appについてのエントリーがぼちぼち出てきましたよ。ときどき、チェックしよう!
リキッドレイアウトに対応したバージョンを作りました。なんか結果オーライのような感じですが、今日の所はこれでOKということで、改めてスマートな方法を考えたいと思います。そろそろ次のテーマに移ります。
サンプルファイル一式→ LiquidLayout_1.zip
なお、このバージョンはProgression 4.0.1 Public Beta1.2で作ってあります。1.1ではNextSceneボタンとPreviousSceneボタンが正しく動作しません。
そうそう、シーンを進めると一瞬だけ上に現れるバーはプログレスバーなんですけどね。ちゃんと動いていいるのかな??って感じです。
ステージリサイズには対応してませんが、これでステージ中央に表示されます。プログレスバーにも対応できますね。
[: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
読み込んだ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)
);
}
}
}
[: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の公式フォーラムにやりとりがあります。
サンプルファイル一式→ LoadSWF_pages3.zip









