适用于角点的矩形二维碰撞检测和响应

问题描述 投票:0回答:1

我正在制作一款 2d 游戏,我在 2d 碰撞方面遇到了很多困难。我的代码似乎工作正常,除了角落之外。当一个实体与一个角精确碰撞时,它最终会直线前进。

我已经尝试修复了整整三个星期。我尝试过人工智能,我尝试过文档,教程(这是我现在拥有的代码的地方),但似乎对角落也不起作用。

这是我当前的代码:

for (let i = 0; i < entityHitboxLength; i += 8) {
        let entityX = entityHitboxes[i];
        let entityY = entityHitboxes[i + 1];
        let entityXW = entityHitboxes[i + 2];
        let entityYH = entityHitboxes[i + 3];
        let prevEntityX = entityHitboxes[i + 4];
        let prevEntityY = entityHitboxes[i + 5]; 
        let prevEntityXW = entityHitboxes[i + 6];
        let prevEntityYH = entityHitboxes[i + 7];

        if (
          selfYH > entityY &&
          selfY < entityYH &&
          selfX < entityXW &&
          selfXW > entityX
        ) {
          if (selfYH >= entityY && prevSelfYH < prevEntityY) {
            selfYH = entityY - 1;
            selfY = entityY - 1 - height;
          } else if (selfY <= entityYH && prevSelfY > prevEntityYH) {
            selfY = entityYH + 1;
            selfYH = entityYH + 1 + height;
          }
          else if (selfXW >= entityX && prevSelfXW < prevEntityX) {
            selfXW = entityX - 1;
            selfX = entityX - 1 - width;
          } else if (selfX <= entityXW && prevSelfX > prevEntityXW) {
            selfX = entityXW + 1;
            selfXW = entityXW + 1 + width;
          }
        }
      }

这里是我为此使用的代码文档。

非常简单,而且对于边缘效果很好。 我还尝试过人工智能生成的方法,例如

if (
  selfYH > entityY &&
  selfY < entityYH &&
  selfX < entityXW &&
  selfXW > entityX
) {
  // Calculate overlaps on both axes
  const overlapY = Math.min(selfYH - entityY, entityYH - selfY);
  const overlapX = Math.min(selfXW - entityX, entityXW - selfX);

  // Resolve the smaller overlap first
  if (overlapX < overlapY) {
    // Resolve X-axis collision
    if (selfXW >= entityX && prevSelfXW < prevEntityX) {
      selfXW = entityX - 1;
      selfX = entityX - 1 - width;
    } else if (selfX <= entityXW && prevSelfX > prevEntityXW) {
      selfX = entityXW + 1;
      selfXW = entityXW + 1 + width;
    }
  } else {
    // Resolve Y-axis collision
    if (selfYH >= entityY && prevSelfYH < prevEntityY) {
      selfYH = entityY - 1;
      selfY = entityY - 1 - height;
    } else if (selfY <= entityYH && prevSelfY > prevEntityYH) {
      selfY = entityYH + 1;
      selfYH = entityYH + 1 + height;
    }
  }
}

但这比我使用的还要多,即使在拐角处也是如此。这段代码有问题吗?我怎样才能让它发挥作用?

javascript game-development game-physics game-engine physics
1个回答
0
投票

没有看到非常非常理解你的代码(缺少一些相关部分)我认为第一个

if
语句似乎是罪魁祸首

    if (
      selfYH > entityY &&
      selfY < entityYH &&
      selfX < entityXW &&
      selfXW > entityX
    ) 

因为在这里您要检查

>
/
<
而不是
>=
/
<=
,但在内部
if
语句中您要检查
>=
/
<=
。所以我认为,这可能是问题的根源,尤其是在角落区域。

© www.soinside.com 2019 - 2024. All rights reserved.