高效的碰撞检测AS3(Efficient collision detection in AS3)

2019-10-29 04:25发布

我有一个游戏,我做的一个问题。 我基本上是在一个地图对象,我要检查他们每个人,如果他们与墙壁碰撞(然后做一些事情)。 由于与AS2的工作,我想过做同样的方式:我画了一幅画,只有墙壁,所以只有矩形,一切都在透明之间其他(不存在,那么例如地板)。 在AS2我把图像在屏幕上,让我们称之为墙上,然后我做了则hitTest与每个对象墙。 也就是说,例如,对象实际上是在图像上,因为该透明的部分是它的一部分,但功能与墙壁上的可见部分仅用于测试,等等。 所以,它的工作。

现在在AS3中不存在HitTesthitTestObject ,这在我以前,我中这么做wall.hitTestObject(object) 。 问题是,这个功能是因为如果它好好尝试一下看到幻灯片和对象不触摸墙壁与他们相撞!

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

我需要的是像一个函数hitTestObject (我不需要很多的准确性!)是拍摄图像的透明部分的护理。

我能怎么做?

Answer 1:

正如在评论中提到的,物理/游戏库将具有内置的代码为您和应开箱的。

但是,如果你想建立它自己,甚至推出自己的优化,第一步(这是很便宜的)为边界碰撞检查使用完全内置的功能DisplayObject.getBoundsRectangle.intersects (虽然你必须这样做在一致的坐标空间,即阶段):

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

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

看来BitmapData.hitTest是你最好的选择-看迈克钱伯斯的博客文章 。

在此之前的方法,如果你有兴趣在纯技术的,有在格兰特斯金纳提出了一个方法, 他的博客 。 它使用内置的位图程序(又名相当快)相当聪明的算法,创建一个BitmapData只有一样大的重叠区域(甚至标定向下),以及两个对象绘制到BitmapData的特定渠道,然后使用BitmapData.getColorBoundsRect()以确定是否有任何像素的触摸。 我猜BitmapData.hitTest比较快,但是它会是有趣的比较。



Answer 2:

我遇到了同样的问题,说实话,我发现最简单的方式来摆脱这只是产生了冲突的“面具”层。 您可以随时将您的这个大背景下,因此不会显示,或更改幻灯片和任何责任。 为此在Flash和“覆盖”用矩形框(或其他)的碰撞后,只需选择所有这些,使该影片剪辑。

我猜,因为你在Flash制作的象征,它显然知道,即使符号由多个单独的图纸或什么的,它不只是一个形象。

对我来说,这个工作得很好。



文章来源: Efficient collision detection in AS3