我正在制作一款 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;
}
}
}
但这比我使用的还要多,即使在拐角处也是如此。这段代码有问题吗?我怎样才能让它发挥作用?
没有看到非常非常理解你的代码(缺少一些相关部分)我认为第一个
if
语句似乎是罪魁祸首
if (
selfYH > entityY &&
selfY < entityYH &&
selfX < entityXW &&
selfXW > entityX
)
因为在这里您要检查
>
/ <
而不是 >=
/ <=
,但在内部 if
语句中您要检查 >=
/ <=
。所以我认为,这可能是问题的根源,尤其是在角落区域。