我为当前正在开发的游戏编写了一个碰撞检测和解决系统。冲突解决方案无法按预期工作。有时,我会在另一个圆圈内生成一个圆圈,当发生这种情况时,我希望该圆圈逐渐移出另一个圆圈的直径,但是目前,我正在使用的代码会非常迅速且令人讨厌。它可以瞬间传送到圆圈之外,而不是缓慢的过渡。
我知道我当前使用的代码告诉圆应该在哪里,所以我只需要慢慢将圆移动到那个位置即可。但这被证明是困难的。
我已经尝试了几种解决方案,其中的一个包含在下面的代码中。我还尝试了使用线性插值将圆移动到其当前位置,即碰撞算法告诉圆应该的位置。那也不正确。
//r is the radius of the circle
var dx = cell.x - cell2.x;
var dy = cell.y - cell2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < cell.r + cells2.r && cell.r > cells2.r){
var unitX = dx/distance;
var unitY = dy/distance;
cell.x = cells2.x + (cell.r + cells2.r + 1) * unitX;
cell.y = cells2.y + (cell.r + cells2.r + 1) * unitY;
//Ive tried below, but the results were not correct.
//cell.x += (cells2.x + (cell.r + cells2.r + 1) * unitX)*0.5;
//cell.y += (cells2.y + (cell.r + cells2.r + 1) * unitY)*0.5;
}
答案 0 :(得分:0)
要将单元格与cell2分开,不需要添加cell2坐标
cell.x += (cell.r + cells2.r + 1) * unitX;
要缓慢移动,请减小速度
//calculate once:
v = 0.01 * (cell.r + cells2.r - distance);
// at every step:
cell.x += v * unitX;