- ベストアンサー
MCを2つ以上ドラッグする方法
環境は、Flash8,WinXPにて、FlashPlayer8、AS2での書き出しでオーサリングしております。 質問なのですが、 オリジナルマウスポインタを表示させているのですが、 それだと、それで他のMCをドラック&ドロップする事が困難になります。 微妙に動く程度で動きません。 startDrag(true);が競合してしまっている様です。 深度の上層部から下層部へいくつでもドラック&ドロップできたらいいなと思っています。 何か良い改善策はないでしょうか? どうぞ宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>> 質問:MCを2つ以上ドラッグする方法 2つ以上ということは3,4,5,…個もあり,ということですよね。 >> 深度の上層部から下層部へいくつでもドラック&ドロップできたらいいな これはちょっと難解ですね… 勝手に 「深度の上層部も下層部もひっくるめていくつでもドラック&ドロップできたらいいな」 と解釈します。 #1 の方のおっしゃるように 「startDrag();」 複数のシンボルがある場合使えません。 したがって,いくつでも同時にドラック&ドロップする場合, ドラッグされるオブジェクト側も「startDrag();」は使えません。 また, 「on (press) { }」 や 「on (release) { }」 など、onイベントハンドラも複数のシンボルがある場合使えません。 深度が上の方が勝ちます。 したがって、ドラッグするムービークリップ側のスクリプトも次のような感じにするしかないと思います。 ボタンシンボルでは無理で,ムービークリップシンボルをドラッグというパターンです。 以下は,ドラッグする各ムービークリップに書くスクリプトです。 ・・・コピペ可・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ onClipEvent (load) { down_flag = 0; } onClipEvent (mouseDown) { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { down_flag = 1; dif_x = this._x-_root._xmouse; //※↓ dif_y = this._y-_root._ymouse; //※↓ } } onClipEvent (mouseUp) { down_flag = 0; } onClipEvent (mouseMove) { if (down_flag == 1) { this._x = _root._xmouse+dif_x; //※↓ this._y = _root._ymouse+dif_y; //※↓ } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 「マウスダウンやアップしたときの条件によって、 変数 down_flag の値を 0 か 1 に切り換え、 down_flag の値が 1 のときだけムービークリップを動かす。」 というような仕組みです。 down_flag の値が 1 になる条件は、 マウスがダウンし,なおかつドラッグするムービークリップのエリアにマウスがヒットしたときです。 ムービークリップとマウスのヒット判定には,「hitTest」を使います。(下記参考URL) //※↓ についてですが, 変数 dif_x や dif_y を用意したのは,クリックしたポイントのままドラッグできるようにです。 マウスの位置にムービークリップの中心を持って来たい場合は, dif_x = this._x-_root._xmouse; //※↓ dif_y = this._y-_root._ymouse; //※↓ の2行を削除し, this._x = _root._xmouse+dif_x; //※↓ this._y = _root._ymouse+dif_y; //※↓ を this._x = _root._xmouse; this._y = _root._ymouse; のように変えてください。 しかし,実際にやってみたのですが, 同じ大きさの物をつかんだとき, 変数 dif_x や dif_y をはずして行くと,すごく扱いにくくなりました。 つまり上下のムービークリップどうしが剥がれなくなってしまいます。 === PS ======= 先日の御質問の件ですが, やはりあれいじょう回答出来ません。 この場を借りてお詫びいたします。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
同時にドラッグできるムービークリップは1つだけです。 あるムービークリップをドラッグ中( startDrag を実行中)に別のオブジェクトで startDrag を呼び出すと、前の startDrag は削除されて動かせなくなります。 気になるのはカスタムカーソルの移動方法ですが。 カスタムカーソルは startDrag を使わなくても作れます。 要するに、デフォルトのマウスカーソルを非表示にし、ムービークリップで作ったカスタムカーソルをマウスカーソルの位置に表示すればいいわけです。 仮に、ステージにカスタムカーソルのムービークリップ” cursor ”があるとします。 カスタムカーソルを表示するスクリプトは、大体、次のようなスクリプトになります。 このスクリプトはムービークリップ” cursor ”に設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) onClipEvent(load) { //デフォルトのカーソルを消す Mouse.hide(); //カーソルの位置に移動 this._x = _root._xmouse; this._y = _root._ymouse; } onClipEvent(mouseMove) { //カーソルの位置に移動 this._x = _root._xmouse; this._y = _root._ymouse; //表示を更新 updateAfterEvent(); } これならカスタムカーソルの移動に startDrag を使わないので、他のムービークリップで startDrag を呼び出してドラッグすることができます。
補足
お返事有難う御座います。 しかしながら、このスクリプトは昔から使い勝手の悪いスクリプトとして有名なのです。 テキスト入力が出来なかったり、Windowから外れると マウスポインタがそのつどずれ、ユーザーにストレスを 与えてしまいます。 ですが、お返事頂いた事、感謝致します。 有難う御座いました。
お礼
大変滑らかに動作しました。 いつもありがとう御座います。 専門書やネットでも調べましたが、前例が出ていなかったため大変勉強になりました。 先日の件ですが、あちらにも書きましたがアドヴァイス頂いた内容からいろいろ推測することができ、 本当に感謝しております。 こちらこそ、説明不足と質問の仕方が悪いのとで 大変ご迷惑をおかけしました。 申し訳御座いません。 また何か御座いましたら、懲りずに宜しくお願い致します。