我在玩游戏时遇到问题。我基本上有地图中的对象,如果它们与墙壁碰撞(然后做某事),我必须检查它们中的每一个。由于与AS2合作,我想到了同样的方式:我画了一张只有墙壁的图片,所以只有矩形,其间的其他一切都是透明的(不存在,然后是地板)。在AS2中,我将图像放到屏幕上,让我们称它为墙,然后我用每个对象做了一个hitTest到墙。也就是说,例如,物体实际上是在图像上,因为透明部分是它的一部分,但是功能仅在可见部分上进行测试,因此对墙壁进行测试。所以它奏效了。
现在在AS3中,没有使用HitTest
但hitTestObject
,我使用的是wall.hitTestObject(object)
。问题是,这个功能就好像它看不到透明胶片一样,没有碰到墙壁的物体与它们发生碰撞!
我发现PixelPerfectCollisionDetection
实际上解决了这个问题,但是它非常庞大而且很重,所以在我的情况下,每个帧都要测试很多物体(至少60个),游戏速度会慢下来!
我需要的是像hitTestObject
这样的函数(我不需要很多精确度!)来处理图像的透明部分。
我该怎么办?
答案 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中创建了符号,它显然知道即使符号由几个单独的图形或其他图形组成,它也不仅仅是一个图像。
对我来说这很好。