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
相关产品推荐
相关产品推荐

