如何在动作脚本3中检测父母中每个孩子的碰撞?

时间:2013-02-24 11:06:00

标签: actionscript-3

我有一个影片剪辑,在那个影片剪辑中还有一些影片剪辑(矩形)...我如何检测与所有这些矩形的碰撞而不必为每一个都编写代码?

1 个答案:

答案 0 :(得分:1)

您可以迭代任何DisplayObjectContainer的子项,如下所示:

for( var i:int = 0; i < clip.numChildren; i++) 
    doStuffWith( clip.getChildAt(i) );

要测试与任何子对象的碰撞,您可以使用:

function hitTestChildren( target:DisplayObject, parent:DisplayObjectContainer ):Boolean {
    for( var i:int = 0; i< parent.numChildren; i++)
        if( target.hitTestObject( parent.getChildAt(i))) return true;
    return false;
}

修改

在查看源FLA之后,以下是如何为重力模拟包含碰撞:

function hitTestY( target:DisplayObject, container:DisplayObjectContainer ):Number {
    //iterate over all the child objects of the container (i.e. the "parent")
    for( var i:int = 0; i< container.numChildren; i++) {
        var mc:DisplayObject = container.getChildAt(i)
        // Test for collisions
        // There were some glitches with Shapes, so we only test Sprites and MovieClips 
        if( mc is Sprite && target.hitTestObject( mc )) 
            // return the global y-coordinate (relative to the stage) of the object that was hit
            return container.localToGlobal( new Point(mc.x, mc.y ) ).y;
    }
    // if nothing was hit, just return the target's original y-coordinate
    return target.y;
}

function onEnter(evt:Event):void {
    vy +=  ay;
    vx +=  ax;
    vx *=  friction;
    vy *=  friction;
    ball.x +=  vx;
    ball.y +=  vy;
    ball.y = hitTestY( ball, platform_mc);
}

你必须修改你的矩形对象,使它们各自的起源位于0,0而不是形状的中间。

结束编辑

但是,如果您不处理简单的矩形形状,但复杂的形状或透明度,您可能需要使用不同的方法:您可以将任何形状组合绘制到位图,然后使用BitmapData#hitTest查看它们是否相交(在这种情况下,您将使用包含所有子项的整个parenttarget剪辑本身,而不是与单个子项相关联。)

我不会发布任何代码(这很长),但有一个很好的例子,说明如何在Mike Chambers' blog上执行此操作。