【问题标题】:Collision response 2d碰撞响应 2d
【发布时间】:2011-10-15 19:40:45
【问题描述】:

问题: Problem http://img684.imageshack.us/img684/5486/prob1b.png Problem http://img810.imageshack.us/img810/3157/prob3.png 绿色方块是玩家,灰色方块是静态砖

当玩家跳到一块瓷砖上时,当玩家站在碰撞瓷砖的边缘附近时,它会被推向左/右。这可能是因为向上的跳跃速度大于 x 运动(甚至可能为 0),因此玩家在 x 轴上被校正...

伪代码如下:

  • 1:在玩家周围获得碰撞瓷砖
  • 2:foreach 碰撞瓷砖:

{

  • 2a:获取交点深度
  • 2b:用最小校正轴校正玩家位置 (例如:如果 (Math.Abs​​(X) > Math.Abs​​(Y) 则更正 Y 值。否则 正确的 X 值)

// 下面是一些其他不应该成为问题的伪代码:

  • 2c:如果碰撞发生在玩家的顶部:取消任何跳跃
  • 2d:如果碰撞发生在播放器的底部: IsStandingOnGround = true;

}

一些代码:

  foreach (Stone stone in collidingStones)
            {
                #region Collision Response
                if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
                {
  //warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
                    Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
                    if (Math.Abs(correction.X) > Math.Abs(correction.Y))
                    {
                        Location += new Vector2(correction.X, 0);
                    }
                    else
                    {
                        Location += new Vector2(0, correction.Y);
                    }

【问题讨论】:

    标签: c# xna 2d response collision


    【解决方案1】:

    有趣的问题,几年前我在 Delphi 中开发一个游戏,我遇到了同样的问题。几点:

    • 您应该在碰撞时校正 X 和 Y。仅校正 X 或 Y 会在高速(超过 ~3px/更新)下看起来不自然。
    • 您正在执行的碰撞​​检测类型适用于矩形填充的瓷砖,但如果您有不规则的瓷砖(如斜坡部分的三角形),则无法计算碰撞校正值。

    最后我制作了一个引擎,其中每个图块都有位图(实际可见的图形)和我称之为freemap的东西,它是一个黑白位图,表示图块内的可用空间地图。然后我编写了碰撞函数,首先在瓦片空间中运行(以确定与玩家发生碰撞的瓦片),然后在瓦片的位图中运行。

    移动玩家时,您会根据玩家速度计算下一个点,然后沿着当前位置和计算出的下一个位置之间的连线测试每个点。如果在那条线上您遇到障碍物,那么您会在该点停止玩家。

    【讨论】:

    • 第一点:同时更新 X 和 Y 仍然不起作用,因为在第二个示例中根本不应该更正 X。第 2 点:听起来像多重采样。但是我认为不需要多重采样,因为这就是为什么要纠正位置的原因,这比对路径中每个可能的位置进行多重采样要快得多。除非这个问题根本无法通过修正来解决。我的游戏中只有矩形,没有斜坡,因为它太难实现了。
    • 如果玩家严格水平或垂直移动,那么是的,您只需要修正 X 或 Y,但在跳跃和跑步游戏中,演员会抛物线跳跃,仅在一个坐标上阻止他看起来不自然。而且我认为您低估了 CPU 的速度 :)
    • 如果玩家以速度下降:(10,10) 并且我更正了 y 值,那么它仍然会向右滑动 10 个像素是的。应该不是问题。多重采样可以工作,但我使用四叉树之类的东西,这意味着在这种情况下,我必须为每个玩家/敌人的每个样本更新“四叉树”。是的,我对 CPU 没有太多信心 :)
    • 此外,多重采样也会产生同样的问题,但会更小。运动不是浮点数,也不是整数,所以仍然必须更正位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多