- ベストアンサー
gotoAndPlayでATTACK3へ移動しないエラー
- Flashのプログラムで、ATTACK1とATTACK2のフレームを交互に表示するが、ATTACK3へ移動しないエラーが発生しています。
- ATTACK1フレームのActionscriptに問題がある可能性があります。時間カウントやフレーム遷移の処理が正しく行われているか確認してください。
- また、ATTACK2フレームのActionscriptにも問題があるかもしれません。時間カウントとフレーム遷移の処理が正確に行われているか確認してください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
フレーム "ATTACK1" のスクリプトですが。 まず,次の部分に問題があります↓。 if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } これだと 仮に count の値が 10 以上であったとしても 仮に count の値が 10 未満であったとしても どちらにしても gotoAndPlay("ATTACK2"); が実行されます。 ですから この部分をまずは次のように変更する必要があります。 (インデントを全角空白文字で入れていますからコピペはできません) if (time<=0) { timeCount = false; if (count>=10) { gotoAndPlay("ATTACK3"); trace(_currentframe); count = 0; delete this.onEnterFrame(); } else { gotoAndPlay("ATTACK2"); count = count+1; delete this.onEnterFrame(); } } これで 仮に count の値が 10 以上であれば gotoAndPlay("ATTACK3"); が実行されて 仮に count の値が 10 未満であれば gotoAndPlay("ATTACK2"); が実行されるようになります。 しかし! ですね。 これで無事に動作するようになるのは Flash Player 6 用の SWF をパブリッシュする場合だけです。 Flash Player 7 以上用 SWF では 初期値のない変数の値は undefined になるため 初期値のない変数には何の数も足せません。 ・Flash Player 6 までの場合 count = count + 1; →countの初期値は空白文字列または0と認識されるので 加算後のcountの値は 1 になる ・Flash Player 7 以上の場合 count = count + 1; →countの初期値はundefinedなので undefined + 1 で NaN(非数)になる したがって Flash Player 7 以上用の SWF をパブリッシュする場合 count には初期値 0 が必要になります。 ただし ご質問のスクリプトの場合は 何度も何度も フレーム "ATTACK1" に戻って来るので 単純にフレーム "ATTACK1" の最初の行辺りに count = 0; だけを書くわけには行きません。 (フレーム "ATTACK1" に戻って来る度に count が 0 になってしまう。) したがって フレーム "ATTACK1" の最初の行辺りに //もし変数countがundefinedのときに限って if(count == undefined){ //変数countの値を0にする count = 0; } というようなスクリプトを付け加える必要が出てきます。 上の2件を合わせると フレーム "ATTACK1" のスクリプトは 次のような感じになります。 (インデントは付けていないのでコピペ可能です。) //------------------------------------------- var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); //もし変数countがundefinedのときに限って if(count == undefined){ //変数countの値を0にする count = 0; } onEnterFrame = function () { if (timeCount) { time = Math.ceil((endTime-getTimer())/1000); if (time<=0) { timeCount = false; if (count>=10) { gotoAndPlay("ATTACK3"); trace(_currentframe); count = 0; delete this.onEnterFrame(); } else { gotoAndPlay("ATTACK2"); count = count+1; delete this.onEnterFrame(); } } } }; //-------------------------------------------
お礼
ありがとうございます。 分かりました。 丁寧な説明ありがとうございました。