我正在为PSM Studio中的2D游戏做一些简单的碰撞检测。
我当前的方法包括迭代每个游戏对象并找到另一个游戏对象之间的距离,然后查看两者是否在一定距离内(通常是每个对象组合宽度的1/2)。如果是,则认为它们发生了碰撞。
虽然这种方法在许多情况下都有效,但它有一个重大的后备。如果一个物体的移动速度使得每帧的移动大于潜在的碰撞物体的宽度(即一个快速移动的射弹朝向敌人),该物体将基本上传送到另一个物体上,即使它们他们不会碰撞,他们不会。
我正在考虑创建一种在两个线段上测试两个粒子的方法。线段将包含更新期间每个对象的起始端位置。
知道每个物体的极移动(角度和大小)以及它们各自的线段,我可以计算出这两个粒子是否在那个神奇的距离内,这意味着它们已经相撞了吗?
答案 0 :(得分:0)
我也遇到过这个问题,我的解决办法是在对象移动过程中检测碰撞。
如果在cicle期间移动的距离大于物体的大小,我会在几个较小的运动中分解运动,并解决每个分解的碰撞。
一个例子:
盒子的移动速度比它自己的大小要快,因此无法检测到红色的检测。因此,运动在较小的运动中分解,并在每一步中检查与红线的碰撞。
在第三步中,检测到碰撞。
我不知道这个解决方案是否适合您的cicle结构,但至少它可以为您带来一些新的想法。
编辑:
请注意,为确保检测到碰撞,您必须确保在机芯中不留任何间隙。为了使这个过程尽可能快,并确保检查整个区域,你必须以对象大小的分数来分解运动。
例如: 在上图中,让我们想象一下在移动之前物体的位置是0个单位,最后是100个单位。
如果对象的大小为30个单位,则必须检查以下位置:
0, 30, 60, 90, 100
在每个迭代中,您可以按对象的大小增加位置,直到到达目的地。
请记住,如果你正在运行,那就说...每秒40个cicles,在给定的例子中,对象将会移动:
40 cicles x 100 units = 4000 units per second
如果每个单位都是一个像素,而你的分辨率为800x600,那么该对象将以每秒超过四个屏幕的速度移动,这是一个巨大的速度。
有了这个,我只想指出“高速”是非常相对的,除非你正在使用非常小的对象,否则这个过程不会像最初预期的那样频繁发生。