- 締切済み
flash ドラッグ&ドロップでフレーム移動
今晩は、質問させて下さい。 使用osはmac10.6.8/ソフトはFlashCS5.5/アクションスクリプト3.0です。 特定のインスタンス(maru)を別のインスタンス(shikaku)にドラッグ&ドロップした時、指定のフレーム(29フレーム目)に進むスクリプトを教えて頂きたいです。 どうぞご教授お願い申し上げます。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
ご質問では >ドラッグ&ドロップした時、指定のフレーム… と書かれていらっしゃいますが その『「ドロップ」とはどういう状態を指すのか?』が問題です。 その『「ドロップ」という状態』を作者が定義しなければ PC はその状態を判断できません。 (その前にスクリプトも書けません。) 先ず第一に 「maru の(基準点の)座標を shikaku の(基準点の)座標に ピッタリ一致させるように maru を「ドロップ」する。」 ということなど閲覧者(ユーザー)にはほぼ不可能ですよね? したがって少なくとも 『「ドロップ」と判定する範囲』を決める必要があります。 例えば, 『maru の座標が shikaku の座標の ±10px 以内に来る場所でマウスが放されることを「ドロップ」とする。』 とか, 『maru を放すときにマウスの座標が shikaku 内にある場合を「ドロップ」とする。』 とか, 『maru の矩形エリアと shikaku の矩形エリアが少しでも重なった状態でマウスが放されることを「ドロップ」とする。』 などなど… たくさんの場合(状態)が考えられます。 . 【以下に書く例の共通条件】 ・maru も shikaku もMC(ムービークリップ)インスタンスであり どちらの MC とも,基準点は中央付近にあるものとする。 ・スクリプトは maru や shikaku が存在するタイムラインの フレームに書くものとする。 また,回答文字数制限により, 例2以降は 例1の「★関数 dropMaru を定義★」以下の部分のみを 書き換えるかたちで回答します。 ◎ 例1 //------------------------------ //再生停止 stop(); //maru 押下時に関数 dragMaru を実行 maru.addEventListener(MouseEvent.MOUSE_DOWN,dragMaru); //関数 dragMaru を定義 function dragMaru(e:MouseEvent):void { //maru をドラッグ開始 maru.startDrag(); //マウスアップ時に dropMaru を実行 stage.addEventListener(MouseEvent.MOUSE_UP,dropMaru); } //★関数 dropMaru を定義★ function dropMaru(e:MouseEvent):void { //maru をドラッグ終了 maru.stopDrag(); //マウスアップ時に実行する dropMaru を解除 stage.removeEventListener(MouseEvent.MOUSE_UP,dropMaru); // //もし maru の(基準点の)座標が sikaku の座標の ±10 以内であれば if (maru.x <= sikaku.x + 10 && maru.x >= sikaku.x - 10) { if (maru.y <= sikaku.y + 10 && maru.y >= sikaku.y - 10) { //maru 押下時に実行する関数 dragMaru を解除 maru.removeEventListener(MouseEvent.MOUSE_DOWN,dragMaru); //フレーム29 で再生停止 gotoAndStop(29); } } } //------------------------------ ◎ 例2 //------------------------------ //~以上は 例1 と同じ~ //★関数 dropMaru を定義★ function dropMaru(e:MouseEvent):void { //maru をドラッグ終了 maru.stopDrag(); //マウスアップ時に実行する dropMaru を解除 stage.removeEventListener(MouseEvent.MOUSE_UP,dropMaru); // //もし maru をドロップしたときのマウスの直下に sikaku があれば if (maru.dropTarget != null && maru.dropTarget.parent == sikaku) { //maru 押下時に実行する関数 dragMaru を解除 maru.removeEventListener(MouseEvent.MOUSE_DOWN,dragMaru); //フレーム29 で再生停止 gotoAndStop(29); } } //------------------------------ ◎ 例3 //------------------------------ //~以上は 例1 と同じ~ //★関数 dropMaru を定義★ function dropMaru(e:MouseEvent):void { //maru をドラッグ終了 maru.stopDrag(); //マウスアップ時に実行する dropMaru を解除 stage.removeEventListener(MouseEvent.MOUSE_UP,dropMaru); // //もし maru の矩形エリアと sikaku の矩形エリアがヒットしていれば if (maru.hitTestObject(sikaku)) { //maru 押下時に実行する関数 dragMaru を解除 maru.removeEventListener(MouseEvent.MOUSE_DOWN,dragMaru); //フレーム29 で再生停止 gotoAndStop(29); } } //------------------------------ ◎ 例4 //------------------------------ //~以上は 例1 と同じ~ //★関数 dropMaru を定義★ function dropMaru(e:MouseEvent):void { //maru をドラッグ終了 maru.stopDrag(); //マウスアップ時に実行する dropMaru を解除 stage.removeEventListener(MouseEvent.MOUSE_UP,dropMaru); // //もし sikaku が maru の(基準点の)座標とヒットしていれば if (sikaku.hitTestPoint(maru.x,maru.y,true)) { //maru 押下時に実行する関数 dragMaru を解除 maru.removeEventListener(MouseEvent.MOUSE_DOWN,dragMaru); //フレーム29 で再生停止 gotoAndStop(29); } } //------------------------------ まだまだ『「ドロップ」が指す状態』は考えられますが, 字数制限もあるためこの辺で。。。