2013-05-30 61 views
0

我遇到了一个我正在做的游戏的问题。我基本上有地图中的对象,如果他们碰撞墙壁(然后做一些事情),我必须检查它们中的每一个。自从与AS2一起工作以来,我就以同样的方式考虑过:我只绘制了一幅只有墙壁的图片,因此只有矩形,其间的所有内容都是透明的(例如不存在,然后是地板)。在AS2中,我把图像放在屏幕上,我们称之为墙壁,然后对每个物体进行hitTest测试。例如,对象实际上是在图像上,因为透明部分是其中的一部分,但该功能仅在可见部分进行测试,对墙壁进行测试。所以它工作。AS3中的高效碰撞检测

现在在AS3中没有HitTest,但是我使用了hitTestObject,而我的例子是wall.hitTestObject(object)。问题是这个功能就好像它没有看到透明胶片一样,而不接触墙壁的物体与它们碰撞!

我发现PixelPerfectCollisionDetection实际上解决了这个问题,但它是巨大而沉重的,所以在我的情况下,有太多的对象要在每一帧测试(至少60),游戏变慢了很多!

我需要的是像hitTestObject这样的功能(我不需要很多的准确性!)来照顾图像的透明部分。

我该怎么办?

+0

在AS3中有高性能物理库,您可以像Box2D一样使用。 – Marty

+0

您可以尝试优化碰撞检测 - 例如:在使用(慢速)hitTestObject之前,检查2个对象是否在彼此的适当距离内。 – 2013-05-30 22:45:45

回答

2

正如在评论中提到的,物理/游戏库将为您提供内置的代码,并且应该可以开箱即用。

但是,如果你想自己构建它,甚至引入你自己的优化,第一步(这是非常便宜的)是使用DisplayObject.getBoundsRectangle.intersects的完全内置功能来检查边界冲突(尽管你必须这样做在一致的坐标空间中,即舞台):

if (obj1.getBounds(stage).intersects(obj2.getBounds(stage)) { 
    // Cheap bounds intersection is true, now do pixel-perfect detection... 
} 

然后,如果边界检查为真,则执行像素完美的碰撞检测。

看来BitmapData.hitTest是您最好的选择 - 请参阅blog post by Mike Chambers

在此方法之前,如果您对整齐的技术感兴趣,可以使用Grant Skinner在his blog中概述的方法。这是一个非常聪明的算法,它使用内置的位图例程(又快又快),创建一个只与重叠区域一样大的BitmapData(或者甚至缩小它),并将两个对象绘制到位图数据的特定通道中,然后使用BitmapData.getColorBoundsRect()来确定是否有任何像素触摸。我猜BitmapData.hitTest比较快,但比较起来很有趣。

+0

它的工作!它比pixelperfect更快! – Maloooo

1

我遇到了同样的问题,说实话,我发现简单的方法来摆脱这只是为冲突生成一个“掩模”层。您始终可以将其置于您的背景下,使其不显示,或更改透明胶片和任何其他内容。在Flash中执行此操作,在用矩形(或任何其他)碰撞时“覆盖”后,只需全选它们并制作一个影片剪辑。

我猜你已经在Flash中创建了这个符号,它显然知道即使这个符号包含几个单独的图形或其他东西,它也不只是一个图像。

对我来说这工作得很好。