Медленное движение разрешения круга столкновения - PullRequest
1 голос
/ 28 мая 2019

Я написал систему обнаружения и разрешения столкновений для игры, над которой я сейчас работаю. Разрешение столкновений работает не совсем так, как задумано. Иногда я создаю один круг внутри другого, когда это происходит, я хотел бы, чтобы внутренний круг медленно выходил за пределы диаметра другого, но в настоящее время код, который я работаю, делает это довольно быстро и резко. Он мгновенно телепортируется за пределы круга, а не медленный переход.

Я знаю, что код, который я сейчас использую, сообщает окружности, где он ДОЛЖЕН быть, поэтому мне просто нужно медленно переместить окружность в это положение. Но это оказывается трудным.

Я пробовал пару решений, одно из которых включено в приведенный ниже код. Я также попытался использовать линейную интерполяцию, чтобы переместить круг в его текущее положение, туда, где алгоритм столкновения говорит ему, что это должно быть. Это тоже не сработало.

//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;
}

1 Ответ

1 голос
/ 28 мая 2019

Чтобы отделить ячейку от ячейки2, вам не нужно добавлять координаты ячейки2

 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;
...