【问题标题】:Multiple Collisions while using Separating Axis Theorem使用分离轴定理时的多次碰撞
【发布时间】:2013-03-30 18:51:01
【问题描述】:

我正在制作一个小型 2D 引擎,并决定使用分离轴定理进行练习。我对玩家对象进行了碰撞检测和平移,但是当游戏与多个对象发生碰撞时,它会停止玩家的移动。这是我的问题的一个例子:

玩家正在沿着墙壁移动,将自己向下和向右推。一旦玩家到达两个瓷砖之间的交叉点,他就不能再向下移动,因为他下方的瓷砖会检测到碰撞,并且会在直接在他右侧的瓷砖将他推向左侧之前将玩家向上推。我认为问题在于播放器下方的图块在另一个图块之前进行了碰撞测试,但我不知道如何解决这个问题。

这是我认为需要更改的代码部分:

protected override void Update(GameTime gameTime)
    {
        gameCamera.Update(new Vector2(player._boundingBox.X, player._boundingBox.Y));

        foreach (Layer l in currentLevel.Layers)
        {
            foreach (GameObject gameObject in l.layerMapObjects)
            {
                gameObject.Update(gameTime);
            }
        }

        player.Update(gameTime);

        foreach (Layer l in currentLevel.Layers)
        {
            foreach (GameObject gameObject in l.layerMapObjects)
            {
                if (gameObject._isCollidable)
                {
                    Vector2 vectorTranslation = Collision(player._boundingBox, gameObject._boundingBox);
                    player._boundingBox.X += (int)vectorTranslation.X;
                    player._boundingBox.Y += (int)vectorTranslation.Y;
                }
            }
        }

        base.Update(gameTime);
    }

我现在所有的碰撞都在矩形之间,Collision() 函数将检测碰撞并返回移动玩家所需的平移(如果有的话)。我希望有人可以帮助我解决这个问题。谢谢。

【问题讨论】:

    标签: collision-detection collision


    【解决方案1】:

    如果问题是您的播放器在检测到所有冲突之前正在更新,请尝试批处理该过程。那是;而不是立即应用 vectorTranslations 来创建它们的列表,然后在检测到所有碰撞后将翻译列表应用到播放器。

    【讨论】:

    • 我明白你在说什么,但问题是你最终仍然会将两种翻译都应用于播放器。根据列表的想法,我列出了所有与玩家碰撞的对象,然后我解决了与玩家距离最短的对象碰撞。然后我遍历所有剩余的对象,看看是否有任何碰撞。如果任何剩余的物体仍在碰撞,那么我将重复该过程,直到所有碰撞都得到解决。这似乎可行,但如果有更简单的方法,请告诉我。
    • 啊,我没有考虑过您的滴答时间足够大以使碰撞无效的情况。您处理最接近,更新,然后处理其他人的想法似乎是明智的。如果您的物体以不同的速度移动,可能会有困难。您可以通过按时间构建一个有序队列来优化它,而不仅仅是一个无序列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多