AS3中的高效碰撞检测

时间:2013-05-30 21:52:21

标签: actionscript-3 flash game-physics collision

我在玩游戏时遇到问题。我基本上有地图中的对象,如果它们与墙壁碰撞(然后做某事),我必须检查它们中的每一个。由于与AS2合作,我想到了同样的方式:我画了一张只有墙壁的图片,所以只有矩形,其间的其他一切都是透明的(不存在,然后是地板)。在AS2中,我将图像放到屏幕上,让我们称它为墙,然后我用每个对象做了一个hitTest到墙。也就是说,例如,物体实际上是在图像上,因为透明部分是它的一部分,但是功能仅在可见部分上进行测试,因此对墙壁进行测试。所以它奏效了。

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

我发现PixelPerfectCollisionDetection实际上解决了这个问题,但是它非常庞大而且很重,所以在我的情况下,每个帧都要测试很多物体(至少60个),游戏速度会慢下来!

我需要的是像hitTestObject这样的函数(我不需要很多精确度!)来处理图像的透明部分。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

但是如果你想自己构建它,或者甚至引入你自己的优化,第一步(非常便宜)是使用DisplayObject.getBounds和{{1}的完全内置功能检查边界冲突(虽然你必须在一致的坐标空间,即舞台)这样做:

Rectangle.intersects

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

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

在此方法之前,如果您对整洁技术感兴趣,那么Grant Skinner在his blog中概述了一种方法。这是一个非常聪明的算法,使用内置的位图例程(也就是说,相当快),创建一个与重叠区域一样大的BitmapData(甚至缩小它),并将两个对象绘制到bitmapdata的特定通道中,然后使用if (obj1.getBounds(stage).intersects(obj2.getBounds(stage)) { // Cheap bounds intersection is true, now do pixel-perfect detection... } 确定是否有任何像素触摸。我猜BitmapData.hitTest更快,但比较它很有趣。

答案 1 :(得分:1)

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

我猜是因为你在Flash中创建了符号,它显然知道即使符号由几个单独的图形或其他图形组成,它也不仅仅是一个图像。

对我来说这很好。