我有一个角色,比如20 x 10像素大,我有一个基于像素的碰撞图(想想蠕虫)。
在每帧速度大于1像素的情况下,跟踪角色碰撞的最佳方法是什么。有没有比沿速度矢量迭代每个像素更好的解决方案?
我在Lua(Love 2D)中这样做,但通用的解决方案是理想的。
答案 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
在沿着运动的每次迭代中,要检查的像素几乎没有差别;只有标记为“新”的那些需要检查影响。检查那些,如果没有碰撞,继续移动。您可以使用它来优化大量计算。