如何动态移动2个xna精灵?

时间:2011-09-08 18:42:28

标签: xna physics sprite

我有两个项目,让我们称它们为Obj1和Obj2 ......它们都有当前位置pos1和pos2 ..而且它们有当前的速度矢量speed1和speed2 ......我怎样才能确保它们的距离越来越远更接近(检查电流和NEXT距离),它们会相互远离吗?

我有一个有角度的角度函数,它给出了2个向量之间的有符号角度。我如何利用它来检查我应该旋转速度1和速度2来相互移动那些精灵?

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

我检查NEXT和CURRENT距离:

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 个答案:

答案 0 :(得分:1)

如果我理解正确,这就是情况,你想获得两个绿色矢量。

situation

红色矢量很容易获得:redVect = pos1 - pos2。 redVect和greenVect2将指向相同的方向,所以你唯一的步骤就是缩放它,使它的长度与speed2的一个匹配:finalGreenVect2 = greenvect2.Normalize() * speed2.Length(尽管我对这个公式并不确定)。 greenVect1 = -redVect finalGreenVect1 = greenVect1.Normalize() * speed1.Length speed1 = finalGreenVect1。然后是speed2 = finalGreenVect2angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f; 。这种方法可以让你瞬间转弯,如果你喜欢平滑转弯,你想通过以下方式旋转速度矢量:

Transform()

o.5f是旋转速度,将其调整为您需要的任何值。我担心你必须使用这个矩阵创建一个旋转矩阵然后{{1}}速度向量 希望这会有所帮助;)

答案 1 :(得分:1)

如果物体A和B越来越近,其中一个物体成分(X或Y)就相反了。

在这种情况下,Bx与Ax相反,因此只需将Ax添加到对象B的速度向量,将Bx添加到对象A的速度向量

enter image description here