0

我正在做的游戏有问题。我基本上有地图中的对象,如果它们与墙壁发生碰撞,我必须检查它们中的每一个(然后做一些事情)。因为在使用 AS2,所以我考虑过同样的方法:我画了一张只有墙壁的图片,所以只有矩形,中间的所有其他东西都是透明的(不存在,例如地板)。在 AS2 中,我将图像放到屏幕上,我们称之为墙,然后我对每个对象进行了 hitTest 墙。例如,对象实际上在图像上,因为透明部分是图像的一部分,但该功能仅在可见部分上进行测试,墙壁也是如此。所以它奏效了。

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

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

我需要的是一个hitTestObject处理图像透明部分的功能(我不需要很高的准确性!)。

我能怎么做?

4

2 回答 2

2

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

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

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

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

似乎BitmapData.hitTest是您最好的选择 - 请参阅Mike Chambers 的博客文章

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

于 2013-05-30T23:09:02.330 回答
1

我遇到了同样的问题,老实说,我发现摆脱它的简单方法就是为碰撞生成一个“遮罩”层。你总是可以把它放在你的背景下,这样它就不会显示,或者改变透明胶片等等。在 Flash 中执行此操作,并在用矩形(或其他)“覆盖”碰撞后,将它们全部选中并制作成影片剪辑。

我猜,既然你在 Flash 中制作了符号,它显然知道即使该符号由几张单独的图纸或其他内容组成,它也不仅仅是一个图像。

对我来说这很好用。

于 2013-12-01T18:47:40.103 回答