Как динамически убрать 2 спрайта от друг друга? - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть два предмета, давайте назовем их Obj1 и Obj2 ... Оба имеют текущую позицию pos1 и pos2 ... Более того, у них есть текущие векторы скорости speed1 и speed2 ... Как я могу убедиться, что, если их расстояния достигают ближе (с проверкой тока и расстояния NEXT) они будут удаляться друг от друга?

У меня есть функция угла со знаком, которая дает мне угол между двумя векторами со знаком. Как я могу использовать его, чтобы проверить, насколько я должен вращать speed1 и speed2 для перемещения этих спрайтов друг от друга?

    public float signedAngle(Vector2 v1, Vector2 v2)
    {
        float perpDot = v1.X * v2.Y - v1.Y * v2.X;

        return (float)Math.Atan2(perpDot, Vector2.Dot(v1, v2));
    }

Я проверяю СЛЕДУЮЩИЕ и ТЕКУЩИЕ расстояния следующим образом:

float currentDistance = Vector2.Distance(s1.position, s2.position);

Vector2 obj2_nextpos = s2.position + s2.speed + s2.drag;
Vector2 obj1_nextpos = s1.position + s1.speed + s1.drag;

Vector2 s2us = s2.speed;
s2us.Normalize();
Vector2 s1us = s1.speed;
s1us.Normalize();

float nextDistance = Vector2.Distance(obj1_nextpos , obj2_nextpos );

Затем, в зависимости от того, становятся они больше или меньше, я хочу убрать их (либо увеличивая их текущую скорость в том же направлении, либо делая их дальше, чем я провалил) ...

if (nextDistance < currentDistance )
{       
float angle = MathHelper.ToRadians(180)- signedAngle(s1us, s2us);
s1.speed += Vector2.Transform(s1us, Matrix.CreateRotationZ(angle)) * esc;
s2.speed += Vector2.Transform(s2us, Matrix.CreateRotationZ(angle)) * esc;
}

Есть идеи?

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

если объекты A и B сближаются, один из компонентов объекта (X или Y) противоположен.

в этом случае Bx противоположен Ax, поэтому нужно только добавить Ax к вектору скоростиобъекта B и Bx к вектору скорости объекта A

enter image description here

1 голос
/ 09 сентября 2011

Если я правильно понял, это ситуация, и вы хотите получить два зеленых вектора.

situation

Красный вектор легко получить: redVect = pos1 - pos2.redVect и greenVect2 будут указывать в одном и том же направлении, поэтому единственный шаг, который у вас есть, это масштабировать его так, чтобы его длина соответствовала скорости speed2: finalGreenVect2 = greenvect2.Normalize() * speed2.Length (хотя я не совсем уверен насчет этой формулы).greenVect1 = -redVect так finalGreenVect1 = greenVect1.Normalize() * speed1.Length.Тогда speed1 = finalGreenVect1 и speed2 = finalGreenVect2.Этот подход даст вам мгновенный поворот, если вы предпочитаете плавный поворот, вы хотите повернуть вектор скорости на:

angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f;

o.5f - это скорость вращения, настройте ее на любое нужное вам значение.Боюсь, что вам нужно создать матрицу вращения, а затем Transform() вектор скорости с этой матрицей.
Надеюсь, это поможет;)

...