我正在编写一个从上到下的游戏,玩家是一个圆圈,圆形和多边形障碍物是玩家可以碰撞的障碍物。 我正在使用分离轴定理库来帮助我的碰撞,以下是基本方法(伪代码):

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;

告诉我应该如何做这件事!