像素碰撞跟踪

时间:2011-09-07 15:51:13

标签: lua pixel collision love2d

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

在每帧速度大于1像素的情况下,跟踪角色碰撞的最佳方法是什么。有没有比沿速度矢量迭代每个像素更好的解决方案?

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

2 个答案:

答案 0 :(得分:6)

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

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

此优化将有助于提高速度,并为引擎增加灵活性,并非所有碰撞都必须完美。

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

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

00000000
00100000
01100000
01110000

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

完成此操作后,逐位'和'这两个掩码中的所有字节。如果任何字节结果> 0,你发生了碰撞。

答案 1 :(得分:3)

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

确保只检查每次迭代的“新”像素。

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

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

It. 1   It. 2      "New" pixels

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