• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:flash  ドラッグでの細かい移動制限)

flashドラッグでの細かい移動制限

このQ&Aのポイント
  • flashとactionscriptの初心者です。
  • オブジェクトをドラッグして迷路を進ませるようなイメージです。
  • 壁に当たったらその場で止まり、ドラッグし直して動かせる方法を探しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> 質問の仕方もわかりにくく申し訳ないのですが 大まかなことはわかるのですが 少し細かいこと(中まかなこと?)がわかりませんね。 その「中まかなこと?」によって考え方や可能/不可能が変わります。 問題は添付された図の「線(壁)」です。 この「線(壁)」の解釈のしかたによって変わります。 > (壁)をすり抜けないようにする とだけ書かれていらっしゃいますが その「線(壁)」の向こう(右側)には,行けるのか行けないのかがわかりません。 もし 『「線(壁)」の向こう(右側)には行けない』 とするなら比較的簡単な話で その「線(壁)」の x座標 でドラッグの x座標 を制限するか もしくは 「線(壁)」の向こう(右側)に「透明な塗り」でも描いておいて その「線(壁)」+「透明な塗り」 のエリアに侵入したドラッグ物を 何らかの方法で排除すれば良いというようなことになります。 私の勝手な推測ですが, そうではなくて 「線(壁)」の上や下を迂回すれば 『「線(壁)」の向こう(右側)には行ける』のですよね? ※ 参考図↓ その場合は, 次のようにするのが1つの方法です。 「線(壁)」をムービークリップに変換して 例えば「line_mc」というインスタンス名を付けます。 またドラッグするものもムービークリップに変換して 例えば「ball_mc」というインスタンス名を付けます。 その「line_mc」と「ball_mc」が存在するタイムラインのフレームに書くスクリプト例です↓。 --------------------------- //「ball_mc」を押したとき ball_mc.onPress = function():Void { //このMCをドラッグ開始 this.startDrag(); }; //「ball_mc」を放したときと外で放したとき ball_mc.onRelease = ball_mc.onReleaseOutside=function ():Void { //このMCのドラッグを終了 this.stopDrag(); }; //「ball_mc」の座標を保存しておく変数を用意 var tmp_x:Number = ball_mc._x; var tmp_y:Number = ball_mc._y; //マウスが動いたとき ball_mc.onMouseMove = function() { //もし「line_mc」がこのMCにヒットしていなければ if (!line_mc.hitTest(this)) { //このMCの座標を保存 tmp_x = this._x; tmp_y = this._y; } else { //「line_mc」がこのMCにヒットしたときは //このMCの座標を保存していた座標に戻す this._x = tmp_x; this._y = tmp_y; } }; --------------------------- ◎ ActionScript 2.0   要 Flash MX 2004 以上 ただこれ↑には 大きな問題点があります。 > 迷路のゲーム(イライラ棒みたいなもの)は > たくさん見つかるのですが それらのよく見るものは,たいてい壁が分厚くないでしょうか? Flash Player は,というか PC自体は, マウスの座標を連続的(アナログ的に)に検知しているのではなくて パルス的(デシタル的に)に検知しています。 つまり 数十分の1秒 間隔でマウスの座標を検知しています。 ですから「線(壁)」が薄い(細い)場合, 高速ドラッグされると「線(壁)」に当たった瞬間など無くなって 「線(壁)」をスッポ抜けてしまうのです。 ですから たいていの迷路のゲーム(イライラ棒みたいなもの)は壁を分厚くしています。 または ドラッグではなくキー操作などで物を動かす仕様にして速度制限をかけています。 (みなさんそういう工夫をして問題を乗りこえているのです。) もし 『「線(壁)」は厚さの無い線であってドラッグするものも点である』 みたいなものの場合, 本格的に壁のすり抜けを厳密に判定しようとすれば 独自で軌跡を線の方程式にして, その軌跡を線と壁の線との交点を求めるような数学的に複雑なスクリプトが必要になって来ます。 (条件などもさらに必要で私も頭が回らないのでココでは回答できません。) そこまでのことを求めないのでしたら, 高速ドラッグ時の壁のスッポ抜け問題を対処する工夫としては, 次のようにスクリプトを変更するのも1つの方法です。 --------------------------- //「ball_mc」を放したときと外で放したとき ball_mc.onRelease = ball_mc.onReleaseOutside=function ():Void { //このMCのドラッグを終了 this.stopDrag(); }; ---------------------------  ↓変更↓ --------------------------- //「ball_mc」を放したときとマウスが外れたとき ball_mc.onRelease = ball_mc.onDragOut=function ():Void { //このMCのドラッグを終了 this.stopDrag(); }; --------------------------- こうすると高速ドラッグできなくなるので, 壁のスッポ抜け問題がかなり生じにくくなります。 (ただしドラッグしにくくなります。) ものによっては さらに色々な問題点が出てくることもあると思います。 しかし何にしても 状況によって自分なりに工夫をすることが大切だと思います。

ej20eg
質問者

お礼

BlurFiltan様 分かりやすく詳細な説明、大変ありがとうございました。 まさに文章や図等で補足していただいた通りの悩みを持っていて、 自分の悩みを全て解決していただくことができました。感動しております。 まさかマウスの仕様の問題にまで関わる問題だったとは思いもしませんでした。 自分のflashでも命令を入れて動作確認ができました。 本当にありがとうございました!!

関連するQ&A