• ベストアンサー

【FLASH】swapDepthsでMCが増殖する??

FLASH8(Win-XP)使用者です。 MCを最前面にもってくるために myDepth = _root.getNextHighestDepth() _root.myMC.swapDepths(myDepth); を使っていますが、不審な動作が多いため検証実験をしています。 不審点はフレーム逆行時のみMCが複製されているという点です。 以下が私の実験です。 ■実験■ 2フレームを用意し、タイムラインに以下を書き込みます。 <1フレーム目> this.stop(); myDepth = _root.getNextHighestDepth() _root.box.swapDepths(myDepth); _root.button.onRelease = function(){ _root.nextFrame(); } <2フレーム目> this.stop(); myDepth = _root.getNextHighestDepth() _root.box.swapDepths(myDepth); _root.button.onRelease = function(){ _root.prevFrame(); } ※ _root.box は解りやすくするため半透明なMCにします。 ここで2フレーム→1フレームに戻るときのみ box の色が濃くなっていくのがわかると思います。 どんどん複製されているためだと思います。 なぜ複製されてしまうのでしょうか? また回避策はあるのでしょうか? お詳しい方、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

インスタンスの深度を変更すると、元のインスタンスに代わって、 別物のような状態でその存在が認識されてしまいます そして、深度が0以上になることで完全に複製状態のようになってしまうのです (getNextHighestDepth()は最低でも 0 の値を返します) nextFrame()の際は、"元から代わって複製状態になったよ"という情報が 受け継がれるのでさらに増えると言うことはありませんが、 prevFrame()で戻った際はその情報は伝達されず元のインスタンスが再度読み込まれてしまい、 それに伴い元の深度の変更がないインスタンスが再描画されてしまうのです 解決策としては、_root.prevFrame();の際に _root.box.removeMovieClip(); と記述し、その複製状態のMCを削除することで回避することができます

ikataro
質問者

お礼

うまくいきました!! しかし深度って思う以上に複雑ですね・・ >>prevFrame()で戻った際はその情報は伝達されず ↑これははたしてバグなんでしょうか? ありがとうございました。

その他の回答 (2)

noname#35109
noname#35109
回答No.3

私も以前に同様の(同じ事が原因の)質問に回答したことがあります。 「質問:シーン移動後に移動前のmcが残って表示される」 http://oshiete1.goo.ne.jp/qa2033432.html   ↑教えて!goo  ↓OKWave (同じです) http://okwave.jp/qa2033432.html > >> prevFrame()で戻った際はその情報は伝達されず > ↑これははたしてバグなんでしょうか? #2の方も書かれている通りバグではありません。 ムービークリップの深度を変更すると, ムービークリップはレイヤーというものに依存しなくなるので, そういう現象が起こります。 上記URLの説明は長くてわかりにくいですが, 上記URLのように現象をループ再生でとらえるとわかりやすいと思います。  □ レイヤー  筆・・|○          []|  □ レイヤー  筆・・|●////////////[]| ←MCがある  □ レイヤー  筆・・|○          []| スクリプトを何も書かなければ,ムービーはループ再生され, 真ん中のレイヤーにあるMC(ムービークリップ)は, フレーム1 に戻る度にまた同じ位置に出没します。 途中で swapDepths をしたとします。 本当のレイヤー構造を Flash で見ることはできませんが, イメージ的には次のようになります。        swapDepths で登場→●////  □ レイヤー  筆・・|○          []|  □ レイヤー  筆・・|●///////|    []| ←MCがある  □ レイヤー  筆・・|○          []| これを再生させれば,上に書いたことと同じく ムービーはループ再生され, 真ん中のレイヤーにあるMC(ムービークリップ)は, フレーム1 に戻る度にまた同じ位置に出没します。 したがって, ループしたとたんに,ムービークリップは2つになります。 ループ再生で考えるとわかりやすいですね。 prevFrame()で戻ったときも同じです。 本来,ムービークリップは,上で書いた図のように,  □ レイヤー  筆・・|○          []|  □ レイヤー  筆・・|●////////////[]| ←MCがある  □ レイヤー  筆・・|○          []| とそのレイヤーにずっと存在しているものですから, その存在しているはずのムービークリップが元のレイヤーに復活するのです。

ikataro
質問者

お礼

なるほどなるほど! 図解だと良くわかりますね。 どうもありがとうございました。

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.2

> >> prevFrame()で戻った際はその情報は伝達されず > ↑これははたしてバグなんでしょうか? ちょっと説明の仕方がうまく思いつかずこのような記述になりましたが、 バグではなく、深度まわりの関係上における仕様と考えたほうが良いかなと思いますよ

ikataro
質問者

お礼

そうですか。 勉強になりました。 ありがとうございました。

関連するQ&A