トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     二つのMCのヒット判定とドラッグについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yuki_usagi
Åê¹ÆNo.6226
投稿日時: 2004-4-13 11:39
半人前
居住地: 三多摩
投稿: 31
使用環境:
windowsXP、または2000。
FlashMX
二つのMCのヒット判定とドラッグについて
二つのMC「target01」と「target02」をステージに配置し、両方ともオンマウスでドラッグできるようにスクリプトを書きました。
ヒットテストで二つのMCがぶつかったのを判定し、ぶつかったらドラッグをできなくするようにしたくて、以下のようなスクリプトをフレームに書きました。

//target01ドラッグ
target01.onPress = function() {
startDrag(target01, false);
};
target01.onReleaseOutside = function() {
stopDrag();
};
target01.onRelease = function() {
stopDrag();
};

//target02ドラッグ
target02.onPress = function() {
startDrag(target02, false);
};
target02.onReleaseOutside = function() {
stopDrag();
};
target02.onRelease = function() {
stopDrag();
};

//ヒットテスト
this.onEnterFrame = function() {
if (target01.hitTest(target02)) {
target01.stopDrag();
}

if (target02.hitTest(target01)) {
target02.stopDrag();
}
};

これだと、ふたつのMCが重なり合ってからしか止まってくれず、その後うまくドラッグできなくなってしまいます。
ふたつのMCが重なり合わないようにドラッグを止めて、その後もちゃんとドラッグできるようにするにはどうしたら良いのでしょうか?

よろしくお願いします。
森 巧尚
Åê¹ÆNo.6234
投稿日時: 2004-4-13 13:04
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: 二つのMCのヒット判定とドラッグについて
引用:

yuki_usagiさんは書きました:
ヒットテストで二つのMCがぶつかったのを判定し、ぶつかったらドラッグをできなくするようにしたくて、以下のようなスクリプトをフレームに書きました。

これだと、ふたつのMCが重なり合ってからしか止まってくれず、その後うまくドラッグできなくなってしまいます。

hitTestは「重なり合ったのを判定」しますから当然ですね。
方法としては、もし重なったら「重なり合う直前の位置に移動する」か「重なり合わないギリギリの位置を計算して移動させる」という方法が考えられます。
前者の方法だと
target01.onLoad = function() {
this.vx = 0;
this.vy = 0;
this.oldx = 0;
this.oldy = 0;
};
target01.onEnterFrame = function() {
this.vx = this._x - this.oldx;
this.vy = this._y - this.oldy;
this.oldx = this._x;
this.oldy = this._y;
};
target02.onLoad = function() {
this.vx = 0;
this.vy = 0;
this.oldx = 0;
this.oldy = 0;
};
target02.onEnterFrame = function() {
this.vx = this._x - this.oldx;
this.vy = this._y - this.oldy;
this.oldx = this._x;
this.oldy = this._y;
};
と毎回自分の移動量を計算するスクリプトを追加して、さらにヒットテストのスクリプトを
//ヒットテスト
this.onEnterFrame = function() {
if (target01.hitTest(target02)) {
target01.stopDrag();
target01._x -= target01.vx;
target01._y -= target01.vy;
}
if (target02.hitTest(target01)) {
target02.stopDrag();
target02._x -= target02.vx;
target02._y -= target02.vy;
}
};
と書き換えれば、「重なり合う直前の位置に移動する」ことができるはずです。

ただし「ぶつかったら」というのは「瞬間」のできごとですよね。ところが、flashは1秒間にフレームレートの回数(例えば1秒間に12回)しかチェックされません。ドラッグのスピードが早いと「重なり合う直前の位置」が遠くなるわけですから、ムービークリップ同士の間にすき間ができることになります。
こういうときはフレームレートを上げるか、getBoundsなどを使って「重なり合わないギリギリの位置を計算して移動させる」という方法を考えてみてはどうでしょう。


----------------
森 巧尚
http://www.ymori.com

野中文雄
Åê¹ÆNo.6235
投稿日時: 2004-4-13 14:06
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 二つのMCのヒット判定とドラッグについて
森さんと、基本的な考え方は同じです。別解ということで。

#ぴったりくっつけたかったら、その座標を計算するしかないですね。
引用:
yuki_usagiさんは書きました:
//target01ドラッグ
target01.onPress = function() {
	startDrag(target01, false);
};
target01.onReleaseOutside = function() {
	stopDrag();
};
target01.onRelease = function() {
	stopDrag();
};

//target02ドラッグ
target02.onPress = function() {
	startDrag(target02, false);
};
target02.onReleaseOutside = function() {
	stopDrag();
};
target02.onRelease = function() {
	stopDrag();
};

MovieClip.onMouseMoveイベントハンドラメソッドとupdateAfterEvent()関数を使うと、
MovieClip.onEnterFrameと異なり、フレームレートの制約を避けられます。ただし、updateAfterEvent()の多用はお勧めしません(理由は、リンクのノート参照)。
//ヒットテスト
this.onMouseMove = function() {
	if (target01.hitTest(target02)) {
		target01.stopDrag();
		target02.stopDrag();
		target01._x = x01;
		target01._y = y01;
		target02._x = x02;
		target02._y = y02;
	} else {
		x01 = target01._x;
		y01 = target01._y;
		x02 = target02._x;
		y02 = target02._y;
	}
	updateAfterEvent();
};


----------------
 

yuki_usagi
Åê¹ÆNo.6462
投稿日時: 2004-4-21 20:22
半人前
居住地: 三多摩
投稿: 31
使用環境:
windowsXP、または2000。
FlashMX
Re: 二つのMCのヒット判定とドラッグについて
こんばんは。
森さん、野中さん、ご返信ありがとうございます。
書き込みが遅くなってしまって申し訳ありません。

スクリプトがたくさん・・・で、目がちかちかして脳みそが思考停止してしまいそうです・・・(+_+)
ですが、本当に勉強になります。

引用:
もし重なったら「重なり合う直前の位置に移動する」


というのが今回やりたいことです。
フレームレートは12fpsで、変更することができないのですが、できるだけピッタリと二つのMCをくっつけたいのです。
なので、今回は野中さんのスクリプトを参考にさせていただきました。

順を追って設定していく森さんのスクリプトは本当に参考になりますし、勉強になります。
ちゃんと自分のアタマで考えてひとつづつ設定できないといけないのですが、考えすぎて、よく脳みそが考えるのを拒否してしまいます

どうもありがとうございました。
これからもよろしくお願いします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops