0

我正在创建 2d rpg 游戏。对于地图,我使用 32x32 瓦片。像玩家和怪物这样的对象有不同的精灵掩码宽度和高度,它们移动的不是瓷砖,而是 x 和 y。所以我试图找到一种“正确”(快速而准确)的方法来查找检查碰撞的内容,在玩家和瓷砖之间、玩家和怪物之间、怪物和瓷砖之间、怪物和玩家之间。

对于碰撞检测,我使用:矩形到矩形、圆形到圆形(距离)、矩形到圆形和圆形到矩形碰撞检查。

例如,我有一张地图:1600x1600 的宽度和高度。将它除以 32,我有 50x50 的平铺地图。

我制作了一个二维布尔数组:

bool tile_area[50][50];

因此,对于每个非无碰撞瓷砖,它将保持 1,对于无碰撞瓷砖,它将保持 0。例如,如果玩家在 tile_area[1][1] 上并且想要向右移动,它会检查tile_area[2][1] 中的碰撞,如果 tile 没有碰撞,则它会移动。怪物也一样,这里的一切都很完美。

但是这种类型的碰撞检测在玩家和怪物、怪物和怪物等移动物体之间是不同的。如果在 1 张地图中我有 200-300 个移动对象,则检查主要移动对象与其他所有对象的每个移动像素的碰撞并不是一个好主意。

所以我想到了一个想法,也为对象划分区域图,所以现在我得到了一个 obj_area[x][y] 结构的二维数组。该结构包含对象结构的向量“vector obj_list;”,因为该区域中不仅可以有 1 个对象。

struct obj_area{
vector<obj> obj_list;
};

obj_area o_Area[50][50];

我相信我可以制作一个二维结构向量数组:D 不确定;D

因此,当玩家或怪物移动时,例如移动到 x 210 和 y 300,它将被添加到 obj_area[210/32=7][300/32=9] 并且如果它想向右移动,它会先检查tile_area[8][9] 如果空闲,则使用向量 obj_area[8][9] 中的所有对象。因此,如果它也是免费的,它会从 obj_area[7][9] 重新分配到 obj_area[8][9] <- 在这一点上,我不知道重新分配是否是个好主意,我需要删除它从旧向量中提取并将其添加到新向量中,这在移动的每一步中都需要。

我有另一个想法,但我不知道它是否会更好或可能,如果我有一个结构映射,并且 x,y 对作为它的键值,所以理论上每次对象移动时,都需要重新分配,我只需要更改该映射对的键值。

我将非常感谢您的任何想法,也许还有更好的想法:)

4

1 回答 1

2

首先对您的想法发表一些评论:

  • 不要将您的对象(这些是您正在谈论的结构吗?)放入您的查找结构中;使用指针将为您节省大量复制数据的时间
  • vector仅当您知道单个元素中的元素数量会很少时才使用s;删除一个项目需要遍历整个向量(具有线性时间复杂度)

现在有一个建议:

如果您的大多数对象都很小,您可以附加到每个对象的当前边界框。然后,如果您保留两张地图(一张用于 x 轴,一张用于 y 轴),将边界框角的坐标映射到它们各自的对象,您可以:

  • 每当物体移动时,以对数时间更新地图(即使对于数千个物体也很小)
  • 仅检查与您当前在其中一个轴上处理的对象相交的对象的碰撞(选择范围中元素较少的对象,lower_bound并且upper_bound是您的朋友)
于 2012-08-21T22:16:00.560 回答