我有一个影片剪辑,在那个影片剪辑中还有一些影片剪辑(矩形)...我如何检测与所有这些矩形的碰撞而不必为每一个都编写代码?
答案 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
查看它们是否相交(在这种情况下,您将使用包含所有子项的整个parent
和target
剪辑本身,而不是与单个子项相关联。)
我不会发布任何代码(这很长),但有一个很好的例子,说明如何在Mike Chambers' blog上执行此操作。