我想创建一个函数,我可以在其中拖动一个MovieClip,它将撞到舞台上的其他MovieClip而不会重叠它们。 (即不能将对象拖过或通过其他MovieClip)。
function dragHolder01(event:Event):void{
if (mouseDownHolder01 == true) {
for(var m:int = 0;m<blockHolder.numChildren; m++){
var hitBlock:DisplayObject = blockHolder.getChildAt(m);
if(movaHolder01.hitTestObject(hitBlock)){
movaHolder01.x = movaHolder01x;
movaHolder01.y = movaHolder01y;
break;
}
}
movaHolder01.startDrag();
movaHolder01x = movaHolder01.x;
movaHolder01y = movaHolder01.y;
}
}
我想我可能有一个概念性的解决方案,但我需要你的帮助。 我想也许我可以限制“startDrag”以允许根据帧进展拖动,即玩家将无法为每个帧拖动对象超过一个像素(因此无法将对象拖入另一个不止一个像素)。
关于如何做到这一点的任何想法?
答案 0 :(得分:2)
将此问题拆分为多个部分。我认为,部分是:
如果您更喜欢Box2D,还有其他步骤:
更新:如何存储以前的位置
var positions:Dictionary = new Dictionary();
var clip:MovieClip = ...; //load your clip somehow
//store position
position[clip] = new Point(clip.x, clip.y);
//read position
var pos:Point = position[clip];
//update position - reuses Point objects to make things somewhat faster
var pos:Point = position[clip];
pos.x = clip.x;
pos.y = clip.y;
//that's all, reference to Point is already in the Dictionary.
还有其他方法。 MovieClip不是最终类,因此可以使用以前的位置继承和扩展。它也是动态的,这意味着您只需在其上插入数据:
clip.prevX = clip.x; //prevX will be created if not exist
clip.prevY = clip.y;
//move clip
答案 1 :(得分:1)
如果你想要物理行为(也就是遇到弹跳的东西),不要自己实现它并使用物理引擎,比如Box2D。他们有几个MouseDragged对象的例子(参见Test类http://box2dflash.svn.sourceforge.net/viewvc/box2dflash/Examples/TestBed/Test.as?revision=158&content-type=text%2Fplain的MouseDrag)。
如果您只想要非重叠对象(取决于您想要的碰撞检测程度),您可以使用MovieClip.hitTest()作为碰撞检测并验证被拖动的对象(在鼠标位置)是否没有打任何东西,如果确实如此,你将它恢复到以前的位置。但请注意,鼠标可以在一个时间范围内以任何速度移动,因此如果鼠标移动得太快,拖动的对象可以通过另一个对象(您可以执行固定大小的连续插值以避免这种情况)。
物理行为和碰撞检测是严重的数学和计算机问题,不应掉以轻心。如果你想要体面的碰撞和物理行为,那么熟悉物理引擎(已经多次使用和测试和优化)比编写自己的代码来执行该行为要少得多。
如果您仍然不想使用物理引擎,请向我展示您的代码,我可能会根据您的喜好进行更多操作(可能需要一些计算时间)。
答案 2 :(得分:0)
您可能希望查看一个物理引擎,例如Box2D:http://box2dflash.sourceforge.net/