水平物体碰撞

Level object collision

我在游戏中使用 SDL2。

我有一个 std::vector 的 SDL_Rects(即矩形对象),用于容纳游戏中关卡的实体平台(即玩家无法通过的平台)。

检查碰撞时,我当前的代码执行以下操作:

for (SDL_Rect rect : rects) {
    if (player.collides(rect)) {
        // handle collision
    }
}

考虑一下我的关卡有很多(例如 500 个)实心平台矩形,遍历所有矩形并检查碰撞是否效率低下?有更好的方法吗?

collides() 函数仅检查 AABB 碰撞(4 个简单条件)。

我认为这是合理的。你有简单的形状并且正在做简单的碰撞检查。想象一个图形更激烈的游戏。即便如此,他们可能有一个复杂的角色骨架网格物体,但只是针对一个易于计算的边界形状进行碰撞检查,他们可能同时处理超过 500 件事情。

在更复杂的游戏引擎中,不同的类型可能对某些类型阻塞而对其他类型不阻塞,因此它不仅要检查简单的重叠事件,还必须知道重叠对象是否应该交互或不是。或者不同的对象可能会有不同的交互。

对于游戏,一般来说你的瓶颈是渲染和相关的计算,所以除非你知道你有危险用游戏逻辑(复杂的路径查找或 AI 或类似的东西)做一些非常缓慢的事情,我会把我的优化工作集中在渲染上。