找到一个正确的“(快速和准确)方式来查找用于检查2d游戏的碰撞的内容.c ++

时间:2012-08-21 21:33:17

标签: c++ maps collision-detection tiles 2d-games

我正在创造2d篮板比赛。对于地图,我使用32x32瓷砖。像玩家和怪物这样的物体有不同的精灵面具宽度和高度,它们不是在瓷砖中移动,而是由x和y移动。 所以我试图找到一个“正确”(快速和准确)的方法来查找碰撞,玩家和瓷砖,玩家和怪物,怪物和瓷砖,怪物和玩家之间的碰撞。

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

所以例如我有一张地图:1600x1600的宽度和高度。除以32,我有50x50瓷砖地图。

我制作了一个2d阵列的布尔:

bool tile_area[50][50];

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

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

所以我想到了一个想法,即划分对象区域的地图,所以现在我得到了一个obd_area [x] [y]结构的二维数组。这个结构包含一个对象结构的向量“vector obj_list;”,因为不只是一个对象可以在该区域。

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]&lt; - 重新分配给obj_area [8] [9] - 在这一点上我不知道重新分配是否是一个好主意,我需要删除它来自旧的矢量并将其添加到新的矢量中,并且在每个移动步骤中都需要它。

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

我会非常感谢您的任何想法和更好的想法:)

1 个答案:

答案 0 :(得分:2)

首先关于你的想法的一些评论:

  • 不要将您的对象(这些是您正在讨论的结构吗?)放入查找结构中;使用指针可以节省大量复制数据的时间
  • 如果您知道单个元素的数量将会很小,则仅使用vector s;删除项目需要迭代整个向量(具有线性时间复杂度)

现在提出一个建议:

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

  • 每当对象移动时,以对数时间(对于数千个对象来说很小)更新地图
  • 仅检查与其中一个轴上当前正在处理的对象相交的对象的碰撞(选择范围包含较少元素的对象,lower_boundupper_bound是您的朋友这里)