2

我正在 PSM Studio 中为 2D 游戏做一些简单的碰撞检测。

我目前的方法涉及遍历每个游戏对象并找到另一个游戏对象之间的距离,然后查看两者是否在一定距离内(通常是每个对象组合宽度的 1/2)。如果是,则认为它们已发生碰撞。

虽然这种方法在许多情况下都有效,但它有一个主要的后备方案。如果一个物体以这样的速度移动,使得每帧的移动大于潜在碰撞物体的宽度(即快速移动的射弹朝向敌人),则该物体将基本上传送到另一个物体上,即使它们会发生碰撞,他们没有。

我正在考虑创建一种在两条线段上测试两个粒子的方法。线段将由更新期间每个对象的开始结束位置组成。

知道每个物体的极地运动(角度和大小)以及它们各自的线段,我能否计算出这两个粒子是否在那个神奇的距离内,这意味着它们已经发生了碰撞?

4

1 回答 1

0

我也遇到过这个问题,我的解决方案是在物体运动过程中检测碰撞。

如果在循环期间移动的距离大于对象的大小,我会将运动分解为几个较小的运动,并为每个分解解决碰撞。

一个例子:

1

盒子的移动速度比它自己的大小要快,所以不会检测到红色的检测。因此,运动分解为较小的运动,并且在每一步中,您都检查与红线的碰撞。

第三步,检测碰撞。

我不知道这个解决方案是否适合你的 cicle 结构,但至少它可以给你带来一些新的想法。

编辑:

请注意,为确保检测到碰撞,您必须确保在移动中不留空隙。为了使此过程尽可能快,并确保检查整个区域,您必须将运动分解为对象大小的分数。

例如:在上图中,让我们想象物体在运动前的位置是 0 个单位,最后是 100 个单位。

如果对象的大小为 30 个单位,则必须检查以下位置:

0, 30, 60, 90, 100

在每个迭代中,您将位置增加对象的大小,直到到达目的地。

请记住,如果您正在运行,可以说...每秒 40 个 cicles,在刚刚给出的示例中,对象将以:

40 cicles x 100 units = 4000 units per second 

如果每个单位是一个像素,并且您运行的是 800x600 分辨率,那么对象将以每秒超过四个屏幕的速度移动,这是一个巨大的速度。

我只想指出,“高速”是相对而言的,除非您使用非常小的物体,否则此过程不会像最初预期的那样频繁发生。

于 2014-03-20T15:07:51.967 回答