- ベストアンサー
attachMovieがうまくいかない!ミサイルの発射位置がずれる問題の解決方法を教えてください
- attachMovieを使用して作成したムービークリップのモーションが2フレーム目から始まってしまう問題が発生しています。
- 繰り返し再生される場合には2週目からはきちんと1フレーム目から再生されるが、1発目と2発目以降のミサイルの発射位置がずれてしまいます。
- どのようにすれば1発目も1フレーム目から再生できるようになり、ミサイルの発射位置が正しくなるのでしょうか?教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
原因は, _rootのマウスダウンしたフレーム(時間的フレーム)で, attachMovie が実行され, _root次のフレーム,つまり,ムービークリップで言う所の フレーム2 からムービークリップ内が再生されるため, フレーム1が見えないのだと考えられます。 対処法は, これでいかかでしょうか↓? ------------------------------- onClipEvent (mouseDown) { _root.attachMovie("MC", "MC", 1); updateAfterEvent(); } ------------------------------- updateAfterEvent 関数は, 「そのイベント終了と同時に,フレームの進行とは関係なく,即更新。」 という関数です。 「FPSについて」 http://hakuhin.hp.infoseek.co.jp/main/as/fps.html のページの, 4.setInterval関数で時間隔を設定 のあたりが参考になるでしょうか。
その他の回答 (1)
#1です。 #1ではごく一部書き間違いがあるのでそれの訂正と, それ以外の部分の補足です。 = = = まず訂正 = = = > つまり,ムービークリップで言う所の > フレーム2 からムービークリップ内が再生されるため, ↓訂正↓ ^^^^^^^^ > フレーム2 からムービークリップ内が表示されるため, ^^^^^^^^ = = = 次に補足 = = = #1 でも書いたように, Flash の 表示更新は,基本的に1フレーム進む時間ごとに行われます。 クリックの瞬間とフレームの切り替わりは普通同期しない(同期するわけがない)ので, 実際は,_root に ムービークリップが attachMovie されていても ムービークリップ内の フレーム1 が表示されないわけです。 時間を図にすると次のようになるでしょうか。 _root の時間的フレームが フレームn のとき, マウスダウン されたとします。 _rootのフレーム数 フレーム n フレーム n+1 フレーム n+2 … MC内のフレーム数 フレーム 1 フレーム 2 フレーム3 … |-----------|-----------|------------|--- ↑↑↑↑↑ ○△□☆◎ フレーム n のうち, ○△□☆◎ のどこでマウスダウンされるかはわかりません。 ○△□☆◎ のどこでマウスダウンされても, その時点で attachMovie された MC内 のフレームは 1 になります。 しかし,実際 Flash の 表示の更新は基本的に1フレーム進む時間ごとに行われるため, Flash は フレームn+1 で,律儀に表示を更新し, その結果,MCは フレーム2 から表示されます。 わかりますでしょうか。 一瞬のできごとなのでわかりにくいかもしれませんね。 そこで考えたのが,#1の方法です。 updateAfterEvent(); を使うと, ○△□☆◎ のうちどこでクリックされても, その時点で表示が更新されます。 しかし実際, MC内の フレーム1 の表示時間は短くなります。 ○△□☆◎ のうち ○ で マウスダウン されたらほぼフレーム1つ分フレーム1が表示されますが, ◎ で マウスダウン されたらほんの一瞬しか表示されません。 この, updateAfterEvent(); を使用する方法でよければそのままでかまいません。 というか,そのままの方が良いです。 しかし, ちゃんと,MC内のフレーム1を1フレームの長さ分表示させようと思えば, フレームの切り替わりと同時に attachMovie を実行しなければなりません。 人間の マウスダウン にそれを求めるのは不可能なので, 実行するタイミングを1つ後のフレームにズラします。 それが次のスクリプトになります。 ------------------------------------ onClipEvent (mouseDown) { // フラグである変数 flg1 の値を 1 にする flg1 = 1; } // 1フレーム進む時間ごとに毎回実行 onClipEvent (enterFrame) { // flg1 の 値が 1 の時だけ if (flg1 == 1) { // MC を attachMovie _root.attachMovie("MC", "MC", 1); // flg1 を 0 に戻す(2など別の数にすると実行は1回のみ) flg1 = 0; } } ------------------------------------ 上記スクリプトであれば, Flash 5(Flash Player 5)以上で使用できます。 もし Flash MX(Flash Player 6)以上でも良ければ, 次のようにした方が,PC の CPU の無駄遣いを減らせます。 (形は少々変ですが…) ------------------------------------ onClipEvent (mouseDown) { // 1フレーム進む時間ことに毎回実行 this.onEnterFrame = function() { // // MC を attachMovie _root.attachMovie("MC", "MC", 1); // この onEnterFrame を削除 delete (this.onEnterFrame); }; } ------------------------------------ attachMovie したムービークリップのフレーム1が表示されないのは, Flash のバグとか,質問者さまの作り方が悪いとかいうわけではなく, Flash が表示更新を律儀に規則通りこなしているためです。 #1や,この#2で書いた"原因" と "対処法" は, 私が探した限り,ココ以外のどこにも書いていないことです。 しかし,色々実験してみると, 予測通りの現象が起こるので, やはり "原因" は上記で間違いないと思います。 "対処法" の方は,好みや場合によるので, 「絶対コレ!」というものではありませんが, 大筋はこのような感じで行けると思います。 お薦めは, #1の回答, updateAfterEvent(); を使う方法です。 それでどうしても許せない場合は,上のスクリプトにしてみてください。
お礼
2回にわたって丁寧に回答してくださって感謝します。 おかげでうまくいきました!ありがとうございます。 No.2での○△□☆◎の解説がとてもわかりやすくて初心者の自分でもすぐ理解できました。 勧めてくださったupdateAfterEvent()の方法を使わせていただきたいと思います。 回答ありがとうございます。