You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2D矩形碰撞检测与响应的角落碰撞穿模问题修复求助

2D矩形碰撞检测与响应的角落碰撞穿模问题修复求助

我正在做一款2D游戏,最近在2D碰撞检测这块卡了好久——目前的代码在处理边缘碰撞时没问题,但只要实体刚好撞到对方的角落,就会直接穿过去,完全没触发碰撞响应。

这个问题我已经啃了整整3周了:试过AI生成方案、查过各种文档、跟着教程写了现在在用的代码,但就是解决不了角落穿模的问题。

我目前在用的碰撞处理代码

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;
          }
        }
      }

这段代码是跟着教程实现的,处理普通的边缘碰撞时一切正常,但遇到角落碰撞就彻底失效,实体直接穿模而过。

我试过的AI生成改进方案(效果更差)

后来我让AI生成了一个基于重叠轴优先级的修复方案,但结果反而更糟——不仅角落穿模的问题没解决,甚至一些普通边缘碰撞也开始出现穿模了:

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;
    }
  }
}

想请教各位大佬:这两段代码里到底存在什么问题?有没有可行的修改思路,能让角落碰撞也能正确触发响应,彻底解决穿模问题?

备注:内容来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:29:31