メイン コーダーズルーム【スクリプト系】 二つの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のヒット判定とドラッグについて 引用:
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などを使って「重なり合わないギリギリの位置を計算して移動させる」という方法を考えてみてはどうでしょう。
|
野中文雄 | Åê¹ÆNo.6235 投稿日時: 2004-4-13 14:06 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 二つのMCのヒット判定とドラッグについて 森さんと、基本的な考え方は同じです。別解ということで。
#ぴったりくっつけたかったら、その座標を計算するしかないですね。 引用: yuki_usagiさんは書きました: MovieClip.onMouseMoveイベントハンドラメソッドとupdateAfterEvent()関数を使うと、 MovieClip.onEnterFrameと異なり、フレームレートの制約を避けられます。ただし、updateAfterEvent()の多用はお勧めしません(理由は、リンクのノート参照)。
|
yuki_usagi | Åê¹ÆNo.6462 投稿日時: 2004-4-21 20:22 |
半人前 居住地: 三多摩 投稿: 31
使用環境:
windowsXP、または2000。 FlashMX |
Re: 二つのMCのヒット判定とドラッグについて こんばんは。
森さん、野中さん、ご返信ありがとうございます。 書き込みが遅くなってしまって申し訳ありません。 スクリプトがたくさん・・・で、目がちかちかして脳みそが思考停止してしまいそうです・・・(+_+) ですが、本当に勉強になります。 引用: もし重なったら「重なり合う直前の位置に移動する」 というのが今回やりたいことです。 フレームレートは12fpsで、変更することができないのですが、できるだけピッタリと二つのMCをくっつけたいのです。 なので、今回は野中さんのスクリプトを参考にさせていただきました。 順を追って設定していく森さんのスクリプトは本当に参考になりますし、勉強になります。 ちゃんと自分のアタマで考えてひとつづつ設定できないといけないのですが、考えすぎて、よく脳みそが考えるのを拒否してしまいます どうもありがとうございました。 これからもよろしくお願いします。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |