Home > progression | study > [progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた

[progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた

最近、仕事の案件でflash案件がきた(てかflashにした)ので、
初めてprogressionを使って制作してました。

まだprogressionでの制作方法やas3のことすら、熟知していないのでいろんなところで
つまづいきました。。

ちょっとしたとこでつまづいても解決法をみつけだすのに長時間悩んだりすることが結構あったので、
実制作でprogressionを使ってみて私が躓いたとこや疑問に思ったことと、ググったりして知った答えを
書きとめていたものを、 Q&A形式でまとめてみました!

Q.Castのコンストラクタからステージを参照できない

ステージリサイズで位置とかサイズとか可変させようと思ってコンストラクタで、
リサイズ時実行させる関数をstageにaddEventListenerさせようとしたらコンパイルエラー。

stageの参照は _onCastAddedの中なら可能です。
要は表示オブジェクトコンテナに追加されたタイミングではじめて参照出来るようになるってことですね。

よく考えたらわかることなのですが、なんでエラーが返ってくるのか理解できずに躓いてました。。。

Actionscript:
  1. protected override function _onCastAdded():void {
  2.             stage.addEventListener( Event.RESIZE, onResizeHandler);
  3.             onResizeHandler(null);
  4.             addCommand(
  5.                 // 任意のコマンドを記述してください。
  6.                 new Trace(stage.stageWidth);               
  7.             );
  8.         }

これでOK!

Q異なるシーン間で値の受け渡しがしたい!

progressionのget~系メソッドがいいらしい!
http://www.northprint.net/2009/03/progressionget.html

私は名前つけるのめんどくさかったのでgetSceneBySceneId使いました!
http://flabaka.com/blog/?p=577

たとえばIndexSceneの_testという値を参照する。

var a:IndexScene = IndexScene(getSceneBySceneId(new SceneId("/index")));
trace(a._test);

これは表示リストに追加されてからでないと無理なので、コンストラクタではなく、_onCastAddedの中でやること!
あとIndexSceneのインポートを忘れずに!

Q.progressionのrootはどうやって参照?

trick7さんの記事を参考に!
http://www.trick7.com/blog/2008/12/09-114334.php

Q.castButtonを追加したときも何か動かしたい!

castButton用castSpriteを作ってやる方法を参考にさせてもらいました!
http://narayama.heteml.jp/2008/09/castbuttoncastsprite.html

Q.あれ?onLoadとonInitの違いは何やったっけ?

これ、初歩的ですが、何度も何度もnorthprintさんのgihyoの記事に掲載されてたこの図で確認してます。。。

Q.tweeneerのコマンドはあるけど、tweensyのコマンドは用意されてないの?

コミッターの seyself さんが、 tweensy をコマンドとして使用できる DoTweensy コマンドを作成してくださっているそうです。
http://trac.progression.jp/browser/experiments/sayself/extensions/classes/com/seyself/extras/progression

Q.castButtonでsceneIdを指定してじゃなく次のシーンに飛ばすにはどうするの?

次のシーンのsceneIdを取得するには

progression.current.next.sceneId;

前のシーンのsceneIdを取得するには

progression.current.previous.sceneId;

ということで、やってみる。

IndexSceneで関数nextSceneId,prevSceneIdを用意しといて、
子シーンオブジェクトの_onInitとかで

var a:IndexScene = IndexScene(getSceneBySceneId(new SceneId("/index")));
a.nextSceneId=progression.current.next.sceneId;
a.prevSceneId=progression.current.previous.sceneId;

と書き換えておいて

その子シーンオブジェクトの中のCastBtn(_nextBtnと_prevBtn)のsceneIdを書き換えてやる。

var a:IndexScene = IndexScene(getSceneBySceneId(new SceneId("/index")));
_nextBtn.sceneId=a.nextSceneId;
_prevBtn.sceneId=a.prevSceneId;

これが一番良い方法かわからないですが、参考程度に。

Q.castButtonでhtmlページにリンクさせるにはどうするの?

castButtonのプロパティにhrefがあるから、以下のような記述をコンストラクタにする。

href="http://kanariia.com/blog/";

sceneId プロパティと href プロパティが両方とも設定されている場合には、href プロパティの設定が優先されるそうな。

あと、windowTargetプロパティも用意されてるので、以下のように使える。いやーさすが。

href="http://kanariia.com/blog/";
windowTarget="_blank";

Q.castImageLoaderで読み込んだ画像をスムージングしたい

ExImageLoaderのプロパティにsmoothingというのがあるので、
コンストラクタで

smoothing=true;

でOK。
castImageLoaderはExImageLoaderのサブクラスなので。

ちなみにリサイズの際、縦横比を維持したい場合は

ratio=true;

でOK。

Q.castButtonの_onCastRollOverと_onCastRollOutにDoTweenerを設定したが、超速でのせたりはずしたりするとエラーがかえってくる。

こんなエラーがよくでて困ったことありませんか。

[ERROR] <DoTweener : command_2031> コマンドで CommandTimeOutError エラーが発生。


原因はコマンドが実行中なのに同じインスタンスに他のコマンドが上書きされるからだと思われる。
実行中のコマンドを中断してやることが必要。

コマンドを中断するためにどうすればよいか、でみつけたのがinterrupt()メソッド。
これを使うためにはexecute()メソッドでコマンドを実行する必要があるらしい。

じゃあaddCommand使わないでやってみよーてことで、こんな感じ。


Actionscript:
  1. package myproject.btn {
  2.     import jp.progression.casts.*;
  3.     import jp.progression.commands.*;
  4.     import jp.progression.events.*;
  5.     import jp.progression.loader.*;
  6.     import jp.progression.*;
  7.     import jp.progression.scenes.*;
  8.    
  9.     /**
  10.      * ...
  11.      * @author kanariia
  12.      */
  13.     public class TestBtn extends CastButton {
  14.        
  15.         private var _rollOver:SerialList;
  16.         private var _rollOut:SerialList;
  17.        
  18.         /*======================================================================*//**
  19.          * コンストラクタ
  20.          */
  21.         public function TestBtn( initObject:Object = null ) {
  22.             super( initObject );
  23.         }   
  24.        
  25.         /*======================================================================*//**
  26.          * ユーザーが CastButton インスタンスにポインティングデバイスを合わせたときに送出されます。
  27.          * このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
  28.          */
  29.         protected override function _onCastRollOver():void {
  30.             if (_rollOut) {
  31.                 //_rollOutのコマンドをすべて解除する
  32.                 _rollOut.interrupt();
  33.             }
  34.            
  35.             _rollOver = new SerialList();
  36.             _rollOver.addCommand(
  37.             new DoTweener(this, { alpha:0.5, time:0.5, transition:"easeOutExpo" } )
  38.             );
  39.             //コマンド実行
  40.             _rollOver.execute();           
  41.            
  42.         }
  43.        
  44.         /*======================================================================*//**
  45.          * ユーザーが CastButton インスタンスからポインティングデバイスを離したときに送出されます。
  46.          * このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
  47.          */
  48.         protected override function _onCastRollOut():void {
  49.             if (_rollOver) {
  50.                 //_rollOverのコマンドをすべて解除する
  51.                 _rollOver.interrupt();
  52.             }
  53.            
  54.             _rollOut = new SerialList();
  55.             _rollOut.addCommand(
  56.             new DoTweener(this, { alpha:1, time:0.5, transition:"easeOutExpo" } )
  57.             );
  58.             //コマンド実行
  59.             _rollOut.execute();   
  60.         }
  61.     }
  62. }

スマートじゃないかもしれないけど、こうすればエラーはとまります!

Q.CastButtonの無効化はどうするの?

いつものようにenabled=false;にしても、無理だったので調べました。

ボタン有効・無効を設定する
buttonEnabledプロパティが用意されていたので、

buttonEnabled=false;

でいけるみたい!

Q.ページタイトルはどうやって変えるの?

http://blog.img8.com/archives/2008/11/004207.html

SceneObjectにはtitleというプロパティがあります。
prog.sync=true;じゃないと作動しないらしい。
あと、index.htmlのタイトルがIndexSceneにたどりつくまで
表示されるので、直しておくべし。

sceneObjectのコンストラクタとかに

title="テストサイト"

みたいな感じで書けばOK。

indexSceneでほかのシーンも作ってる場合は

aboutScene.title="about|テストサイト";

て感じでOK。

IndexSceneで子・孫シーンをonLoadで一気に追加しておけば、
こんな設定も超簡単にすむw

ひとこと

自分用のメモみたいな感じなんで、きれいにまとまってるわけじゃないけど、
同じことで躓いてる人がこのエントリで救われるといいなー

関連する投稿

Comments:0

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://kanariia.com/blog/archives/447/trackback
Listed below are links to weblogs that reference
[progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた from kanariia.com blog
pingback from kanariia.com blog - [progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた 09-08-11 (火) 21:41

[...] See the original post here: kanariia.com blog – [progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた [...]

Home > progression | study > [progression勉強]実制作でつまづいたとこをQ&A形式でまとめてみた

bookmark
nakanohito

あわせて読みたい
あわせて読みたいブログパーツ

Return to page top