我有一个生成的应用程序,其中一部分是用户必须拖动一个或多个项目(主要是文本,但也可能是图像)并将其放入一个框的练习,如下所示。
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;
效果很好。这种方法的问题是可拖动的项目可能会相互碰撞,这看起来不太漂亮。
我想防止可拖动的项目相互碰撞,同时确保它们保持在盒子内。
我考虑通过两种方式解决这个问题:
在框内创建某种网格,确保每个网格方块足够大以包含最大的可拖动项目,并让项目出现在最近的空闲网格方块中。
这样做的问题是盒子和每个可拖动项目可以是任意大小,并且可以有任意数量的可拖动项目,因此确保用户可以将每个项目放入盒子中并仍然保留它有点麻烦它看起来不错。
将每个掉落的物品与已经在掉落中的所有其他物品进行检查,如果它们发生碰撞,请将新掉落的物品向其中一个方向移动一点,直到它们不再碰撞。
这里的问题是把所有东西都放在盒子里,而不是陷入一个试图朝着不可能的方向移动的循环中。如果没有办法移动它怎么办?
我错过了一些明显的方法,还是更简单的方法?如果没有,我怎样才能尽可能简单地实现这个?
一些碰撞可能没问题,因为用户不会在其中一个练习上花费太多时间,但现在它的工作方式几乎似乎在寻找彼此并可怕地崩溃。