我正在编写一个从上到下的游戏,玩家是一个圆圈,圆形和多边形障碍物是玩家可以碰撞的障碍物。 我正在使用分离轴定理库来帮助我的碰撞,以下是基本方法(伪代码):
for(let obstacle of obstacles){
if(collides(obstacle, player)){
const overlap = getOverlap(player, obstacle);
player.x -= overlap.x;
player.y -= overlap.y;
}
}
当玩家与一个障碍物碰撞时,这个方法会很好地工作,但当玩家与两个或更多障碍物碰撞时,玩家会颤抖。 我认为这是因为在第一次服务器 tick 时,玩家并没有完全从障碍物上移除,直到玩家停止输入移动时,玩家才会在几 tick 后最终剪切出来。 我也尝试了在最后一次应用之前累加所有重叠,但这会导致更多的颤抖(伪代码):
const totalOverlap = { x: 0, y: 0 };
for(let obstacle of obstacles){
if(collides(obstacle, player)){
const overlap = getOverlap(player, obstacle);
totalOverlap.x += overlap.x;
totalOverlap.y += overlap.y;
}
}
player.x -= totalOverlap.x;
player.y -= totalOverlap.y;
告诉我应该如何做这件事!
评论 (0)