生成されたアプリケーションがあります。このアプリケーションでは、ユーザーが1つ以上のアイテム(主にテキストですが、画像も可能です)をドラッグして、以下のようにボックスにドロップする必要があります。
http://eastblue.org/dragdropexample.png
ボックスはのカスタムサブクラスですBorderContainer
。ドラッグ可能な各アイテム(のサブクラス)は、 usingRichText
で取得されます。リリースされると、を使用してボックスにヒットしたかどうかをチェックし、ヒットしなかった場合は、アニメーション化されて開始位置に戻ります。ヒットした場合は、MouseEvent.MOUSE_DOWN
startDrag()
MOUSE_UP
this.hitTestObject(box)
stopDrag();
this.x = e.stageX; // e is the MouseEvent
this.y = e.stageY;
これはかなりうまく機能します。このアプローチの問題は、ドラッグ可能なアイテムが互いに衝突する可能性があり、それがあまりきれいに見えないことです。
ドラッグ可能なアイテム同士がぶつからないようにすると同時に、箱の中に入れておくようにしたいと思います。
私はこれを2つの方法で解決することを検討しました。
ボックス内にある種のグリッドを作成し、各グリッドスクエアが最大のドラッグ可能なアイテムを含むのに十分な大きさであることを確認し、アイテムが最も近い空きグリッドスクエアに表示されるようにします。
これに伴う問題は、ボックスと各ドラッグ可能なアイテムが任意のサイズであり、ドラッグ可能なアイテムがいくつでも存在する可能性があることです。したがって、ユーザーが必要に応じてボックス内のすべてのアイテムをドロップして保持できるようにするのは少し面倒です。大丈夫そうです。
ドロップされた各アイテムを、ドロップ内にすでにある他のすべてのアイテムと照合し、それらが衝突する場合は、衝突しなくなるまで、新しくドロップされたアイテムをいずれかの方向に少し移動します。
ここでの問題は、すべてをボックス内に保持し、不可能な方向に移動しようとしてループに巻き込まれないようにすることです。そして、それを動かす方法がない場合はどうなりますか?
私はいくつかの明白な方法、またはこれを行うためのより簡単な方法を逃していますか?そうでない場合は、どうすればこれをできるだけ簡単に実装できますか?
ユーザーがこれらの演習の1つにあまり時間を費やさないため、一部の衝突は問題ない可能性がありますが、現在の動作方法では、ほとんどお互いを探し出し、恐ろしくクラッシュしているように見えます。