如何应用像素完美碰撞旋转精灵

本文关键字:完美 碰撞 旋转 精灵 像素 何应用 应用 | 更新日期: 2023-09-27 18:04:13

我很难知道如何接近或解决这个问题。我看过一些教程,但它们是为已经知道自己在做什么的程序员准备的。我跟随了一个关于如何执行一种适用于常规边界框的像素碰撞形式的视频,如果边界框碰撞,它会检查两个相交框中的任何非透明像素是否重叠。如果是,那么布尔值将返回一个真值。我在哪里以及如何开始在旋转对象中实现边界框轴的改变,以补充纹理的外观?我不喜欢被指向外部教程,因为我读过的大多数教程都假设程序员知道作者所说的一切。

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

如何应用像素完美碰撞旋转精灵

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

也就是说,一个想法是仍然使用前面提到的像素对像素的AABB方法。这需要你在内存中维护你自己的像素数据,只用于碰撞,而不是严格依赖纹理数据。

更具体地说,使用这种方法,你将不得不生成本质上是一个"图像",或某种二维矩阵,一个代表/跟随你旋转图像的像素。但你不会像普通图像那样在其中存储颜色信息。相反,结构中的每个"像素"或条目应该是碰撞数据:"块"或"不块"。您可以轻松地使用位掩码来表示这一点,1表示"块",0表示"非块",并且每个像素需要一个比特。(注意:通常你只需要一个布尔值"on"&"关闭",但你可能想要每个像素不同类型的碰撞;如果是这样,位掩码将不起作用,而是对每像素所需的任何内容进行编码,而不管总体思想保持不变)

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

你实际上是自己"画"出旋转后的图像。这可以通过逐像素步进基本纹理图像数据,并对每个像素应用旋转变换矩阵来实现,以使其到达位掩码/缓冲区中的正确目的地。一旦你有了正确的目的地,你就会测试图像数据的"块"或"非块"(使用你提到的透明度),并相应地在那里写一个1或0。

当你生成时,你还应该跟踪局部最小值和最大值;也就是说,你旋转的图像向左、向右、向上和向下移动多远,只是为了给它一个真正的AABB,以便快速检查。"我甚至需要检查逐像素碰撞吗?")

为了完全准确,你可能需要知道你正在使用哪种插值/舍入算法(双线性,最近邻等),这可能会变得很难看。图像系统通常会做非常复杂的事情,所以只考虑碰撞是非常极端的。在一天结束的时候,即使应用这种方法,它也可能不是真正的"像素完美",直到"与渲染图像输出完美同步",除非你真的在复制上走得很远,确切地 XNA/DirectX正在做什么。

最后,何时生成?答案是每次任何东西旋转!否则,您将检查过时的数据。显然,你可以为每个精灵保留一个缓冲区,并不断改变它,以避免占用太多内存。但这确实意味着如果你一直在旋转的话,可能每帧一次。这意味着如果多个精灵都在大量旋转,则每帧需要多次。