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つを独立させてマウス追従させるようにカスタマイズするのはちょっと無理かもしれないと思いましたので,
上のような 「ダウンロードの順序」 を 「上から下へ」 にするという方法を書かせていただきました。
長文ありがとうございます。
パブリッシュにそんな意味があったとは思いませんでした。
早速やってみたんですが、結果は効いてませんでした。
>> 2つのムービークリップとも,
>> onClipEvent (mouseMove) { ~ }
>> で行くならそれで統一させる。
がうまくできていないのだと思います。
あとは自分で悩んで見ます。
ありがとうございました。
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つともに書けば条件が合いますから,
ズレはなくなると思いますが。
状況がよくわからないので,全く的はずれな回答かもしれません。
ありがとうございます。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字(テキスト)の潰れ・にじ...
-
DataTableの件数を取得したい
-
photoshopで書いた四角の枠の中...
-
VBScriptでMsgBoxのYesNoボック...
-
AS3.0 Timerの使い方
-
テキストボックスの中身をリセ...
-
python ボタンを押すと複数の関...
-
【ActionScript】テキストボッ...
-
【Photoshop】レイヤー効果の境...
-
ESD保護区域等のシンボル入手先
-
VB.NET2005 DataGridViewでレコ...
-
Active Report と SQL
-
マウスが押されているのか(DOWN...
-
C# chart controlの透過について
-
シンボル化解除の方法
-
POIでのテキストボックス作成に...
-
バナーの枠を飛び出して動くア...
-
C言語でのマウスを移動とマウス...
-
今日の残り時間を表示する時計...
-
アナログ時計の針を透過させた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HSP あたり判定
-
MCをブラウン運動させたい。
-
動かした画像を元の位置に戻すには
-
【急ぎ】setIntervalを使って各...
-
C言語 ゲーム
-
物体の衝突判定について教えて...
-
文字(テキスト)の潰れ・にじ...
-
障害物に対する衝突判定
-
ローディング画面の作り方(欲...
-
_x,_y指定の移動の方法(Flash l...
-
ムービークリップの初期座標
-
photoshopで書いた四角の枠の中...
-
Pythonを使ってせん断応力図、...
-
python ボタンを押すと複数の関...
-
VBAで改行の入ったデータの正規...
-
【VB.NET】別Formのボタンが押...
-
別のアプリケーションのテキス...
-
VBScriptでMsgBoxのYesNoボック...
-
変数に256文字以上のテキストを...
-
テキストボックスの中身をリセ...
おすすめ情報