如何将像素完美碰撞应用于旋转的精灵?

时间:2015-07-23 17:41:12

标签: c# xna collision-detection

我很难知道如何处理或如何解决这个问题。我已经看了一些教程,但它们适用于已经知道他们正在做什么的程序员。我关注了如何执行适用于常规边界框的像素碰撞形式的视频,其中如果边界框碰撞,则检查两个交叉框中的任何非透明像素是否重叠。如果他们这样做,那么布尔值将返回一个真值。在哪里以及如何开始在旋转对象中实现边界框轴的更改以补充纹理的适应性?我不喜欢被指向外部教程,因为我读过的大多数假设程序员都知道作者正在谈论的所有内容。

我还看了一些完美展示我正在寻找的源代码,但似乎我需要一个非常深入的解释来使用任何阅读代码。

1 个答案:

答案 0 :(得分:3)

首先,我不建议这样做,因为它将是计算或资源密集型(或两者兼而有之)。

那就是说,一个想法是仍然按照上面提到的AABB像素上的直接像素方法。这要求您在内存中维护您自己的像素数据,仅用于碰撞,而不是严格依赖纹理数据。

更具体地说,使用这种方法,你必须生成本质上是“图像”的东西,或某种类型的二维矩阵,它代表/跟随旋转图像的像素。但是,您不会像使用普通图像那样在其中存储颜色信息。相反,结构中的每个“像素”或条目应为冲突数据:“阻塞”或“不阻塞”。您可以轻松地使用bitmask来表示这一点,1表示“块”,0表示“不阻塞”,每个像素需要一位。 (注意:通常你不需要更多布尔“on”&“off”为此,但你可能需要每个像素不同类型的碰撞;如果是这样,bitmasks将无法工作,而是编码任何你需要每个像素,无论整体想法保持不变)

为您的精灵生成位掩码(或其他此类结构)将使您能够使用AABB方法;所有你需要做的就是直接使用生成的位掩码而不是纹理数据,其他一切都和以前一样。但是我们如何产生这个呢?这是这种方法的真正难点,因为你生成自己的图像基本上是在你告诉它进行旋转时复制你的图形卡的工作。

你基本上可以自己“画出”旋转的图像。这可以通过逐个像素地逐步遍历基础纹理图像数据,并对每个像素应用旋转transformation matrix以使其到达位掩码/缓冲区中的正确目标来完成。一旦你有了正确的目的地,你就可以测试图像数据的“阻止”或“不阻止”(如你所提到的那样使用透明度),然后在那里写一个或0。

当你正在生成时,你还应该跟踪当地的最小值和最大值;也就是说,你的旋转图像向左,向右,向上和向下移动了多远,只是为了给它一个真实的真正的AABB住进去进行快速检查(即“我是否需要检查每个像素的碰撞?”)

为了完全准确,您可能需要知道您正在使用哪种插值/舍入算法(双线性,最近邻等),这可能会变得很难看。图形系统通常会做很复杂的事情,因此将所有这些考虑在内只是因为碰撞是非常极端的。在一天结束时,即使应用这种方法,它可能并非真正“像素完美”,只要“与渲染图像输出完美同步”,除非你真的在复制完全什么XNA / DirectX正在做。

最后,何时会发生这一代?每次旋转时,答案都是!否则你将检查陈旧数据。显然你可以为每个sprite保留一个缓冲区,并且不断更改它,以免占用太多内存。但如果你一直在旋转,这确实意味着可能每帧一次。这意味着如果多个精灵全部旋转很多,则每帧多次。可能不是计算上最友好的。