像素碰撞追踪

8

我有一个大小为20x10像素的角色,并且我有一个基于像素的碰撞地图(类似贪吃蛇)。

如果给定大于每帧1像素的速度,追踪角色的碰撞最好的方法是什么?有比沿着速度向量迭代每个像素更好的解决方法吗?

我正在Lua(Love 2D)中实现这一点,但通用解决方案将是理想的。

2个回答

6
我会将包围框碰撞和像素完美碰撞结合起来。因此,您游戏中的所有实体都将具有包围框,即与精灵宽度和高度相等的框架。这将作为您的第一级别碰撞测试。完成此操作并且发生了碰撞后,请使用碰撞地图获取更细节的信息。
这种优化将有助于提高速度,并为引擎添加了灵活性,不必所有碰撞都是像素完美的。
至于实际的像素完美碰撞算法,您所描述的方法是可行的。但是,如果您想要速度快,可以尝试以下方法:
为每个精灵设计一个位掩码(类似于像素地图,但每个像素只有一个比特),例如:
00000000
00100000
01100000
01110000

当一个精灵与另一个精灵碰撞时,创建一个新的掩码,大小与较大掩码相同,以较小掩码为基础,并将其“偏移”到精灵之间的位置差。

完成此操作后,对这两个掩码中所有字节进行位“与”运算。如果任何字节结果 > 0,则表示发生了碰撞。


谢谢您的回答,我已经让碰撞(大部分)正常工作了,不过我会实现您的位掩码想法,它似乎非常明显且是一个非常优雅的解决方案。 - Fascia
哇!使用位掩码真是太聪明了! - JustGage

3

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

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

假设字符同时向右下移动:

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

It. 1   It. 2      "New" pixels

在每次移动的迭代中,要检查的像素之间几乎没有差异;只有标记为“new”的像素需要检查是否会发生碰撞。检查这些像素,如果没有发生碰撞,就继续移动。您可以使用这种方法来优化掉大量的计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接