8

我有一个 20 x 10 像素的角色,我有一个基于像素的碰撞图(想想蠕虫)。

给定每帧大于 1 像素的速度,跟踪角色碰撞的最佳方法是什么。有没有比沿速度向量遍历每个像素更好的解决方案?

我在 Lua (Love 2D) 中这样做,但一个通用的解决方案将是理想的。

4

2 回答 2

6

我会结合边界框碰撞和像素完美碰撞。

所以你游戏中的所有实体都会有边界框,只是框架等于你的精灵的宽度和高度。将此用作您的第一级碰撞测试。完成此操作后,您会发生碰撞,然后使用碰撞贴图获得更精细的细节。

这种优化将有助于提高速度,并为引擎增加灵活性,即并非所有碰撞都必须是像素完美的。

至于实际的像素完美碰撞算法,您所描述的将起作用。但是,如果您追求速度,您可能想试试这个:

为每个精灵提供一个位掩码(如像素图,但每个像素只有一位),例如:

00000000
00100000
01100000
01110000

当一个精灵与另一个精灵发生碰撞时,从较小的位掩码中创建一个新的位掩码,其大小与较大的位掩码相同,并通过精灵之间的位置差异“偏移”它。

完成此操作后,按位“和”这两个掩码中的所有字节。如果任何字节结果 > 0,则说明发生冲突。

于 2012-01-20T00:18:52.330 回答
3

您的解决方案是最简单的解决方案 - 遍历每个像素。

只要确保您只在每次迭代中检查“新”像素即可。

假设角色同时向右和向下移动:

*****   .....       .....        * = "Present"
*****   .*****      .****#       . = "Old and now empty"
*****   .*****  =>  .****#        # = "New"; check these on iteration 2
*****   .*****      .****#
         *****       #####

It. 1   It. 2      "New" pixels

在沿运动的每次迭代中,要检查的像素几乎没有差异;只有标记为“新”的那些需要检查影响。检查那些,如果没有碰撞,继续移动。您可以使用它来优化大量计算。

于 2012-01-18T18:41:36.420 回答