当前位置: 首页 > 知识库问答 >
问题:

使用分离轴定理时的多次碰撞

班浩皛
2023-03-14

我正在制作一个小型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()函数将检测碰撞并返回移动玩家所需的平移(如果有)。我希望有人能帮助我解决这个问题。谢谢。

共有1个答案

夏华藏
2023-03-14

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

 类似资料:
  • 我已经在我的游戏中实现了tilemap碰撞,它起作用了,但是当我在一个轴上碰撞而试图在另一个轴上移动时,问题就来了。我不能沿着墙滑行。 在player.cpp中 在Collision.cpp中

  • 我在维护一个事件源的应用程序,恐怕它已经走得很远了。 将命令(cmd1)发送到另一个聚合根,该聚合根将发布一个事件,该事件将创建许多传奇,每次触发一些最终由许多聚合处理的命令 发送第二个命令(cmd2),该命令也将导致各种命令/事件/命令序列。 以示意图的形式: 所有事情都发生在同一个线程中,所有事情都发生在第一个命令处理开始的1个事务中。

  • 分组管理 分组管理,需要打开 项目设置 面板进行设置,位置为 菜单栏 -> 项目 -> 项目设置。 打开 项目设置 面板后,在 分组管理 一栏可以看到 分组列表 的配置项,如下图 点击 添加分组 按钮后即可添加一个新的分组,默认会有一个 Default 分组。 需要注意的是:分组添加后是不可以删除的,不过你可以任意修改分组的名字 碰撞分组配对 在 分组列表 下面可以进行 碰撞分组配对 表的管理,如

  • 问题内容: 我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。 但是,返回的数据是从不同的表中获取的。 每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。 现在,该手册说: 调用PDOStatement :: execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备

  • 我正在尝试使代码中的冲突检测正常工作。我正在使用矢量,我希望玩家精灵在与称为的精灵组碰撞时碰撞并停止。问题是玩家可以通过底墙。 在这个例子中,我关闭了重力。 x冲突是可以的,但它有点滑稽,只有y方向不能正常工作与相同的代码。 我已经尝试使用调试器调试代码,但没有成功。 我主要感兴趣的是弄清楚为什么垂直碰撞检测不起作用,但我也希望得到关于水平碰撞检测的建议。 友情链接: 吉特哈布 : 完整代码 当前

  • 所以我明白,我现在没有用最好的方式来编写这个代码;这是一种测试运行。我正在尝试使用矩形和intersects属性进行墙碰撞(抱歉,如果我没有使用正确的术语)。到目前为止,我有2个矩形在屏幕上。1玩家控制和游戏中与之冲突的其他玩家。当它们碰撞时,玩家停止移动。问题是,如果玩家试图移动到矩形,而他们已经碰撞,那么玩家不能在垂直于移动的任何方向移动,即如果玩家拿着右箭头键移动到矩形,那么他们不能向上或向