• ベストアンサー

下のMCをドラッグ処理した場合、上にいるMCも一緒にドラッグさせる。

初心者です。 どなたか教えてください。 下にあるMCを拡大&ドラッグ処理させています。 その上にボタンを貼り付けて、下のムービーから位置を this._x = _root.mcc._x; this._y = _root.mcc._y; で共通にしたのはいいんですが、 ドラッグした際、ボタンの移動速度が遅くて、最初においていた 位置からどんどん離れてしまいます。 このドラッグに合わせて動くスピードを上げるにはどうすればいいでしょうか? すいません。 教えてください。

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 書き忘れていたのですが,#1で書いたのは最低条件です。 startDrag() を使用すると, 2つのムービークリップを同じ条件で動かすことができないので, startDrag() を使用している場合は, 少なくとも,それをやめなければならないということを書いたのです。 他の条件も合わせなければならないのは当然のことですし, 他の条件を合わせるということ自体も,まだ最低条件です。 この回答は長いですが, 結局,内容はずっと下↓の方にある 「★解決策案」 だけです。 ごちゃごちゃ書いたことは単にその理由などですから, 不要であると思われる場合は適当に読み飛ばしてください。 厳密で,普通の場合は考えなくて良い話を書きます。 少々ややこしいのですごくシンプルな例で書きます。 「A_mc」 と 「B_mc」 という2つのムービークリップがあったとします。 「A_mc」 が下レイヤーで 「B_mc」 が上レイヤーであるとします。  レイヤー ・・・|●| ← B_mc  レイヤー ・・・|●| ← A_mc 下レイヤーの 「A_mc」 には次のようなスクリプトを書いたとしておきます。 onClipEvent(mouseMove){ this._x = _parent._xmouse; this._y = _parent._ymouse; } そして,上レイヤーの 「B_mc」 には次のように書きます。 onClipEvent (mouseMove) { this._x = _parent.A_mc._x; this._y = _parent.A_mc._y; } これで, onClipEvent (mouseMove) { ~ } という条件も一致していますから, 「A_mc」 はマウスの動きにピッタリくっついて動き, 「B_mc」 は 「A_mc」 にピッタリくっついて動くように思えます。 ところがドッコイ,そうはなりません。 なぜかと言うと,上レイヤーの 「B_mc」 のスクリプトが先に実行されるからです。  マウスの座標が 5 に動く   → 「B_mc」 の座標が 「A_mc」 と同じ座標になる   → 「A_mc」 の座標が 5 になる  マウスの座標が 10 に動く   → 「B_mc」 の座標が 「A_mc」 と同じ 5 になる   → 「A_mc」 の座標が 10 になる  マウスの座標が 50 に動く   → 「B_mc」 の座標が 「A_mc」 と同じ 10 になる   → 「A_mc」 の座標が 50 になる  … … 続く … … 「B_mc」 の方がスクリプトの実行が早いため,過去の「A_mc」の座標を参照します。 したがって,ワンテンポ遅れて動くことになります。 上のままのスクリプトを使う場合(そのままを使う場合です), 上レイヤーの 「B_mc」 のスクリプト方が後で実行されなければなりません。 そうなればうまく行きます。  マウスの座標が 5 に動く   → 「A_mc」 の座標が 5 になる   → 「B_mc」 の座標が 「A_mc」 と同じ 5 になる  マウスの座標が 10 に動く   → 「A_mc」 の座標が 10 になる   → 「B_mc」 の座標が 「A_mc」 と同じ 10 になる  マウスの座標が 50 に動く   → 「A_mc」 の座標が 50 になる   → 「B_mc」 の座標が 「A_mc」 と同じ 50 になる こうなるようにするためにはどうすれば良いかと言うと,パブリッシュ設定を変えます。 「ファイル」→「パブリッシュ設定」 で 「パブリッシュ設定」パネルが開きます。 そのパネルで 「Flash」 タブ を選択して, 上から 2番目 辺りにある,ダウンロードの順序 を  ダウンロードの順序(L):[上から下へ  v] のように変更します。 デフォルトでは 下から上へ です。 これで, 描画オブジェクトは上レイヤーから順にロードされます。 しかし逆に, 下のレイヤーのムービークリップに書いた onClipEvent (mouseMove) { ~ } が先に実行されるようになります。 この順は例えば次のようにすれば確かめられます, メインのタイムライン(_root) を 2つのレイヤーにして, 各レイヤーに違うムービークリップを配置し, 各フレームやムービークリップ自体に次のように書きます。 === ---上のレイヤーのフレーム1--- trace("レイヤー上_フレーム1"); ---上のレイヤーのムービークリップ自体--- onClipEvent (initialize) { trace("レイヤー上.MC_onClipEvent (initialize)"); } onClipEvent (load) { trace("レイヤー上.MC_onClipEvent(load)"); } onClipEvent (enterFrame) { trace("レイヤー上.MC_onClipEvent(enterFrame)"); } onClipEvent (mouseMove) { trace("レイヤー上.MC_onClipEvent(mouseMove)"); } ---上のレイヤーのムービークリップ内フレーム1--- trace("レイヤー上.MC_フレーム1"); === ---下のレイヤーのフレーム1--- trace("レイヤー下_フレーム1"); ---下のレイヤーのムービークリップ自体--- onClipEvent (initialize) { trace("レイヤー下.MC_onClipEvent (initialize)"); } onClipEvent (load) { trace("レイヤー下.MC_onClipEvent(load)"); } onClipEvent (enterFrame) { trace("レイヤー下.MC_onClipEvent(enterFrame)"); } onClipEvent (mouseMove) { trace("レイヤー下.MC_onClipEvent(mouseMove)"); } ---下のレイヤーのムービークリップ内フレーム1--- trace("レイヤー下.MC_フレーム1"); === そして,ダウンロードの順序を変えて, 「制御」→「ムービープレビュー」します。 すると次のような出力結果が得られます。 ◎ ダウンロードの順序=下から上 の場合 レイヤー下.MC_onClipEvent (initialize) レイヤー上.MC_onClipEvent (initialize) レイヤー上_フレーム1 レイヤー下_フレーム1 レイヤー下.MC_onClipEvent(load) レイヤー下.MC_フレーム1 レイヤー上.MC_onClipEvent(load) レイヤー上.MC_フレーム1 レイヤー上.MC_onClipEvent(enterFrame) レイヤー下.MC_onClipEvent(enterFrame) レイヤー上.MC_onClipEvent(mouseMove) レイヤー下.MC_onClipEvent(mouseMove) ◎ ダウンロードの順序=上から下 の場合 レイヤー上.MC_onClipEvent (initialize) レイヤー下.MC_onClipEvent (initialize) レイヤー上_フレーム1 レイヤー下_フレーム1 レイヤー上.MC_onClipEvent(load) レイヤー上.MC_フレーム1 レイヤー下.MC_onClipEvent(load) レイヤー下.MC_フレーム1 レイヤー下.MC_onClipEvent(enterFrame) レイヤー上.MC_onClipEvent(enterFrame) レイヤー下.MC_onClipEvent(mouseMove) レイヤー上.MC_onClipEvent(mouseMove) ダウンロードの順序を変えると, ムービークリップに書いたスクリプトの個々のセット実行順が逆になる感じです。 以上, そうなる理由や現象や確認方法を長々と説明しましたが,結局, ★解決策案  2つのムービークリップとも,  onClipEvent (mouseMove) { ~ }  で行くならそれで統一させる。  そしてパブリッシュ設定で,  ダウンロードの順序(L):[上から下へ  v]  にする。 という2点だけです。  - - - - - - - - - - - - - - - - - - - - 本来,このようなことは考えなくて良いことです。 ヘルプにも載っていませんし,本などにも普通は載っていない事項だと思います。 2つのムービークリップを動かすために, 2つの onClipEvent (mouseMove) { ~ } を使う上, 厳密な座標追従を求めていらしゃるため, このようなことを考えなければならないのです。 つまり, 最初から1つの onClipEvent (mouseMove) { ~ } で動くように書く, もしくは, #1で書きましたように,2つのムービークリップは独立してマウス追従させれば良いだけです。 しかし, 補足(お礼)で書こうとされたその長く複雑なスクリプトを, 1つの onClipEvent (mouseMove) { ~ } にまとめたり, 2つを独立させてマウス追従させるようにカスタマイズするのはちょっと無理かもしれないと思いましたので, 上のような 「ダウンロードの順序」 を 「上から下へ」 にするという方法を書かせていただきました。

egtomo
質問者

お礼

長文ありがとうございます。 パブリッシュにそんな意味があったとは思いませんでした。 早速やってみたんですが、結果は効いてませんでした。 >> 2つのムービークリップとも, >> onClipEvent (mouseMove) { ~ } >> で行くならそれで統一させる。 がうまくできていないのだと思います。 あとは自分で悩んで見ます。 ありがとうございました。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

1つのムービークリップは, startDrag() で動かしていらっしゃって, 2つのムービークリップを同時にドラッグしようとした場合, startDrag() ではない方のムービークリップが遅れるということでしょうか? もしそうだとしると,まず startDrag() の使用をやめる必要があります。 startDrag() だけ,異常に反応が早いです。 startDrag() で動かしたムービークリップに他のムービークリップの座標を合わせようとして, onEnterFrame [または onClipEvent(enterFrame)] や onMouseMove [または onClipEvent(mouseMove)] などなどで this._x = _root.mcc._x; this._y = _root.mcc._y; を実行させても追いつきません。 かと言って startDrag() を同じ階層の2つのムービークリップに使用するのも不可能です。 1つは startDrag() ,もう1つは onMouseMove のように, 別のタイミングで実行させるようにするのではなくて, 2つとも条件を合わせてはいかがでしょうか。 ムービークリップ自体に書くスクリプト例です。 onClipEvent (mouseDown) { // もしこのMCがマウスとヒットしていれば if (this.hitTest(_root._xmouse, _root._ymouse, true)) { // このMC上のマウス座標を取得 tx0 = this._xmouse; ty0 = this._ymouse; // マウスが動いたときに実行する関数の定義 this.onMouseMove = function() { // マウスと同じ位置に移動 this._x = _root._xmouse-tx0; this._y = _root._ymouse-ty0; // マウスが動いたとき即更新 updateAfterEvent(); }; } } onClipEvent (mouseUp) { // この onMouseMove を削除 delete this.onMouseMove; } これを2つともに書けば条件が合いますから, ズレはなくなると思いますが。 状況がよくわからないので,全く的はずれな回答かもしれません。

egtomo
質問者

お礼

ありがとうございます。 startDrag() ではなく、下記のスクリプトで動いていると思います。 拾ってきたスクリプトなのですが、メチャメチャ長いので、 省いていますが、これが主になっていると思います。 onClipEvent (mouseMove) { if (Drag && Press && n) { this._x = _parent._xmouse+ox; this._y = _parent._ymouse+oy; if (this._x >= xMax+xSpan) { this._x = xMax+xSpan; } BlurFiltanさんが仰ったように、反応が早すぎて追えない状態です。 フレームワークをあげれば直るっていう情報をゲットしたのですが、 fla =30でも速度は変わりませんでした。 必要であれば、スクリプトを全部載せます。

関連するQ&A

専門家に質問してみよう