待望のProgression本「ProgressionによるFlashコンテンツ開発ガイドブック」が届いた。クラススタイルを中心に、一気に読んだのだが、これまでいろんなBlogに分散していた情報が集約されていて効率良く学習できるし、すでに使いこなしている人でも今まで知らなかった機能や細かい機能を知ることができていいと思う。Progressionを学ぶための定石の本としてお勧め。
「Progression」タグアーカイブ
CastButtonからDoTweenerだとエラー
Progression3で、CastButtonの_onCastMouseUp内で、新たにaddChildするCastSpriteに対して、DoTweenerを実行すると、中身がnullだよとエラーが発生する。CastSpriteの_onCastAddedでDoTweenerを実行しても同様のエラー。なぜか、Propは使える。
対応策は不明。
CastButton内でprogressionを取得する方法
CastButton内で、progressionプロパティを取得しても、nullになる。progressionを取得するには、
var prog:Progression = Progression(getProgressionById(“index”));
として、自ら取得すると良い。
ProgressionでFlexのコンポーネントを使う
前のエントリーでメモを書いたのだが、忘れないうちにTips化。
Progressionのtaka:niumさんに、twitterで教えてもらったのだが、CastObjectを委譲することで、Flexのコンポーネント(つまり、UIComponentのサブクラス)も、Castクラスとして扱えるそうだ。具体的な方法は、実はここにありました。
これを参考に、実験を。上のサンプルで肝となるのは、この部分。
var com:Panel = new Panel();
com.width = 200;
com.height = 200;
com.alpha = 0;
var cast:CastObject = new CastObject( com );
CastObjectのインスタンスを生成するときに、Cast化したいコンポーネントのインスタンスを渡してあげる。
Cast化したインスタンスのプロパティを変えたいときは、CastObject型のインスタンスのプロパティを変えず、元のインスタンスのプロパティを変えるところも重要。
ここで気になるのが、addChildを実行されるインスタンスは、どこに配置されているか、ということになるのだが、Application.applicationと、いわゆるroot(SystemManger直下)に配置されることになるようだ。では、各シーンにおいては、どのように配置するかと言うとこ、こんな感じ。
protected override function _onLoad():void {
var button:Button = new Button();
_button = new CastObject( button );
button.label = “OK”;
button.setActualSize( 100, 32 );
var app:Application = Application( Application.application );
addCommand(
new AddChild( app, _button ),
);
}
と、まで書いたが、Application.application以下のコンポーネントにaddChildする場合も考えられるので、それもまた検証すべきかも。
MXMLベースWebを制作する際に、Progressionを使えるのは便利。
Progression で UIComponentを使う
寝不足で文章が旨く書けそうにないので、メモですが、ProgressionでFlexのコンポーネントをCastとして使う実験に成功。開発者のtaka:niumさんに、アドバイスをもらって解決へ。
イベント取得待ちのコマンド
任意のクラスのイベントを受け取ってから動作するコマンドの書き方。
addCommand(
new Func(_model.load, null, _model, Event.COMPLETE ), // イベント取得の設定
new Func( trace, [“complete”] ), //完了したよ
new Func( model_completeHandler ) //完了後の処理へ
);
例えば、_modelというインスタンスがある処理(例えば、データロードなど)を終えた後に、model_completeHandlerというメソッドを実行する場合は、以上の様な書き方になる。こう書かないと、データ受信が終わっていないときに、シーンが遷移してしまう危険性があるので、待ち行列をつくった方が良い。もしくは、Threads(そうめん)でスレッドを立てても良いかもしれない。
ブラウザ経由のSceneIdを取得する方法
Progressionで、ブラウザ経由のSceneIdを取得する場合、SceneObjectのサブクラス内でprogression.destinedSceneId
を参照すると、取得できる。
例えば、”/index”から、自動的に”/index/a”に遷移させるときなどの判定に使える。ちなみに、判定はこんな感じで。
if( this.sceneId.equals( progression.destinedSceneId ) )
_onCastAddedで並列処理をさせる
Progressionではまったので、メモ。
CastSpriteクラスなどの_onCastAdded内で、並列処理をさせる方法。例えば、複数個生成したSprite, Shapeを同時にTweenerで変化させる場合など。
ポイントは、ParallelList自体を実行するのではなく、ParallelListのインスタンスをaddCommandする必要がある。addCommandしないと、期待した動作が起きない。とくに、_onCastRemovedのときに。
protected override function _onCastAdded():void {
var list:ParallelList = new ParallelList();
for each( var s:Shape in _boxies ){
list.addCommand( new DoTweener( s, {alpha:1.0, time:3.0, transition:”easeInOutSine”} ) );
}
addCommand( list );
}
Progressionは、確かに必需品になる様な気がする。
Progression3.0のdeploy/index.htmlがおかしい
Launching “Progression3″ in Apple Store, Ginzaに行ってきた。
早速、Progressionの素晴らしさに惹かれ、いじっていたのだが、パブリッシュされたindex.htmlがうまく動かない。最新のFlash Playerが入っていても、「最新」を入れろという画面に。
いろいろ探ってみて、こういう風に書き換えたらswfが表示されるようになった。
<script type="text/javascript"> // <![CDATA[ var prog = new Progression( "9.0.45.0" ); prog.onLoad = function() { var so = new SWFObject( "preloader.swf", "external_flashcontent", "640", "480","9.0.45.0" );//判定するバージョン情報を追記 so.addParam( "wmode", "window" ); so.addParam( "allowFullScreen", "false" ); so.addParam( "allowScriptAccess", "samedomain" ); so.write( "flashcontent" ); }; prog.init(); // ]]> </script>
この現象は、自分だけだろうなのか。