- ベストアンサー
Tweenerの繰り返しについて
- Tweenerを使用して3つの写真をフェードイン・フェードアウトで切り替える方法を教えてください。
- TweenerのonCompleteを使って繰り返し処理を行う際にスタックオーバーフローが発生してしまいます。どうすれば解決できますか?
- 提供されたソースコードを確認しましたが、繰り返し(無限ループ)がうまく機能していないようです。解決策を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
添字の部分をfor文でインクリメントしていくのではなく、メンバ変数を使用して、その数が最大(3)に達したらまた1に戻す形にしてはどうでしょうか? import caurina.transitions.Tweener; import caurina.transitions.properties.FilterShortcuts; var main_mc:MovieClip = new MovieClip(); var m_i:Number = 1; //添字(for文の"i"の代わりに追加) addChild(main_mc); //モーション開始 startView(); /* for文の処理を関数化して添字に使用していた"i"をメンバ変数"m_i" に変えてみました。 */ function startView():void{ var mc_str:String = "photo0" + m_i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,m_i); //添字インクリメント(次の処理の添字を設定) m_i++; //範囲外(4)までいったら添字クリア if(m_i >= 4){ m_i = 1; } } function tween (MC:MovieClip, num:Number):void { var _num:Number = num - 1; if (num >= 1) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;}, time:0, delay:1+(_num*5) }); trace (_num+"枚目終わり"); Tweener.addTween (MC, { alpha:1, //fadeIn後に次の画像表示処理呼び出し onComplete:startView, transition:"linear", time:1, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } いかがでしょうか?
その他の回答 (3)
- amane123
- ベストアンサー率60% (6/10)
>その「パブリッシュに多少時間がかかる」を軽減できる手段はないのでしょうか? こちらの読み違いでしたら申し訳ないのですが、sho27_2009さんの 「パブリッシュ」という言葉に対する認識が「swfファイルの再生」であるように感じられました。 「パブリッシュ」とはflaファイルやasファイルから実行形式のファイル(swf)を作成することを言います。他の言語でいうところのコンパイルのようなものです。 もしこれを早くしたいというのであれば、それはお使いになっているPCの性能によると思いますので、最新のマシンに買い換えるくらいしか思いつきません。 ご質問の内容の意味が、「再生開始時に最初から画像が表示された状態にしたい」ということであれば、startViewで表示する画像とは別に、画像を最初に配置し、表示後数秒たってからstartViewを呼ぶことにすればよいと思います。 1.startViewを直接呼ばず、最初に表示した画像に設定したTweenerのonCompleteで実行するようにします。 2.1で配置した画像はstartViewで同じ画像が表示されるタイミングで削除します。 ※例として3番目に表示する画像を最初に表示してみました。 3 ⇒ 1 ⇒ 2 ⇒ 3 ⇒ 1 ・・・となります。 //最初から表示する画像 var myFirstMc:Class = Class(getDefinitionByName("photo03")); var mc:MovieClip = new myFirstMc(); //削除する時にわかりやすいように名前を付けておく mc.name = "first"; //配置 main_mc.addChild (mc); //最初の画像を一秒間表示後にstartViewを呼ぶ Tweener.addTween(mc, { alpha:1, onComplete:startView, time:1, delay:0 }); function startView():void{ for (var i:int=1; i<=3; i++) { var mc_str:String = "photo0" + i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,i); } } function tween (MC:MovieClip, num:Number):void { trace(num); var _num:Number = num - 1; if (num >= 1) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;}, time:0, delay:1+(_num*5) }); trace (_num+"枚目終わり"); if (num <= 2){ Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); }else{ //ここを追加 //最初に表示した画像を取得 var mcFirst:MovieClip = MovieClip(getChildByName("first")); //あれば削除 if (mcFirst != null){ main_mc.removeChild(mc); } //ここまで Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, onComplete:startView, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } } いかがでしょうか?
お礼
すいません。なんとか自己解決できました!! お時間を度々取らせてしまい申し訳ありませんでした。 次回もこのようなことがあれば是非ともよろしくお願いします。 ありがとうございました!
補足
お忙しいところ毎回、本当に申し訳ありません! 解答ありがとうございます! お陰様で、かなり理想に近づけました。 パブリッシュの件も少し勘違いしてました。とても参考になりました。 そして、あと一点だけあります… delay:1+(_num*5)で5ずつずらして遅延させてるはずですが、 3 ⇒ 1 ⇒ 2 ⇒ 3 ⇒ 1 ↑の変わるときだけ他の切り替え部分より早く切り替わってしまうのですが、これをどの切り替え地点でも一定の間隔で動かすことはできますでしょうか? 1になった時に_numをリセットすればいいのか? だとしてもどのようなスクリプトを書けばいいのかで悩みます。 Tweener自体のしくみも理解していないままの自分ですが、もう一度ご教授お願いします。本当に申し訳ないです。
- amane123
- ベストアンサー率60% (6/10)
>最初の一枚目が読み込まれるのが遅いというか 使用する画像サイズの問題かと思い、試しに2MBの画像を使用してみました。 ですが、パブリッシュに多少時間はかかるものの、処理速度自体には特に影響はみられませんでした。 ※ソースは二回目の回答で記述した方を使用しました。 今回作成する処理をどこでどのように実行するのかはわかりませんが、外部swfにして切り出すことができるのであればそれをpreloadしておけば問題ないような気がします。 的外れな回答でしたら申し訳ないのですが、いかがでしょうか?
お礼
遅れてしまい、申し訳ないです。 たぶん、「そのパブリッシュに多少時間がかかる」を言いたかったんです。 その「パブリッシュに多少時間がかかる」を軽減できる手段はないのでしょうか? それと書き忘れていましたが、角丸のcoverObjをmaskにしてその中で写真らを繰り返すというしくみになっています。 maskしてるから遅いのかと思い、maskを消して試みたのですが、出だしは遅いままでした。 質問多く申し訳ないです。 どうかご教授を;; 現状のコードを記載しておきます。 import caurina.transitions.Tweener; var coverObj:Shape = makeRect(600,280,30,0xffffff); addChild (coverObj); function makeRect (w:uint,h:uint,ew:uint,color:uint):Shape { var coverObj:Shape = new Shape(); coverObj.graphics.beginFill (color); coverObj.graphics.drawRoundRect (0,0,w,h,ew); coverObj.graphics.endFill (); return coverObj; } var main_mc:MovieClip = new MovieClip(); var m_i:Number = 1; main_mc.mask = coverObj; addChild (main_mc); //モーション開始 startView (); function startView():void{ for (var i:int=1; i<=3; i++) { var mc_str:String = "photo0" + i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,i); } } function tween (MC:MovieClip, num:Number):void { var _num:Number = num; if (_num >= 0) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;}, time:0, delay:1 }); trace (_num+"枚目終わり"); //追加部分 最終回でのみonCompleteで再起処理 if (_num <= 2){ Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); }else{ Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, onComplete:startView, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } }
- amane123
- ベストアンサー率60% (6/10)
>それと、もう1つ奥に入った疑問を解決したく聞きたいのですが、今回やり方を変えましたが、やっぱりfor文でインクリメントしていく方法では不可能なのでしょうか? 申し訳ありません。元のソースに少し手を加えるだけでOKでした。 loopの最終回の判定を入れて、最終回ならonCompleteで再起させます。 import caurina.transitions.Tweener; var main_mc:MovieClip = new MovieClip(); addChild(main_mc); startView(); function startView():void{ for (var i:int=1; i<=3; i++) { var mc_str:String = "photo0" + i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,i); } } function tween (MC:MovieClip, num:Number):void { trace(num); var _num:Number = num - 1; if (num >= 1) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;}, time:0, delay:1+(_num*5) }); trace (_num+"枚目終わり"); //追加部分 最終回でのみonCompleteで再起処理 if (num <= 2){ Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); }else{ Tweener.addTween (MC, { alpha:1, transition:"linear", time:1, onComplete:startView, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } } 混乱させてしまって申し訳ございませんでした。 よろしければご参考ください。
お礼
いえいえ、とんでもありません。 startView();の想像ができず、Tweener内で無限ループさせることしか頭になかったので、本当にありがとうございました。自分自身が無限ループにはま(ry そして、修正版も動作確認できました。 それと…あともう1つ…繰り返しの件ではなくなってしまうのですが… 無限ループさせることに成功したのですが、 出だし、最初の一枚目が読み込まれるのが遅いというか、真っ白な状態が続いてやっと出てきたか!?って感じになっているのが現状です。そのあとの繰り返しは問題なく一定の間隔で変わっていくのですが、最初の写真の間隔を早くする?というのはできるのでしょうか? 質問ばかりですいません><
お礼
解答ありがとうございます!>< お陰様で、写真を繰り返すことができましたー! ありがとうございます!本当に感謝です! それと、もう1つ奥に入った疑問を解決したく聞きたいのですが、今回やり方を変えましたが、やっぱりfor文でインクリメントしていく方法では不可能なのでしょうか? 暇な時にでも解答よろしくお願いします!><