プロが教えるわが家の防犯対策術!

今晩は、質問させて下さい。
使用osはmac10.6.8/ソフトはFlashCS5.5/アクションスクリプト3.0です。

特定のインスタンス(maru)を別のインスタンス(shikaku)にドラッグ&ドロップした時、指定のフレーム(29フレーム目)に進むスクリプトを教えて頂きたいです。

どうぞご教授お願い申し上げます。

A 回答 (1件)

ご質問では



>ドラッグ&ドロップした時、指定のフレーム…

と書かれていらっしゃいますが
その『「ドロップ」とはどういう状態を指すのか?』が問題です。

その『「ドロップ」という状態』を作者が定義しなければ
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);
}
}
//------------------------------



まだまだ『「ドロップ」が指す状態』は考えられますが,
字数制限もあるためこの辺で。。。
「flash ドラッグ&ドロップでフレーム」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!