Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何动态移动2个xna精灵?_Xna_Physics_Sprite - Fatal编程技术网

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

如何动态移动2个xna精灵?,xna,physics,sprite,Xna,Physics,Sprite,我有两个项目,让我们称它们为Obj1和Obj2。。。两者都有一个当前位置pos1和pos2。。此外,它们还有流速矢量speed1和speed2。。。我如何确保如果它们的距离越来越近(通过检查当前距离和下一个距离),它们将彼此移动得更远 我有一个有符号的角度函数,它给出了两个向量之间有符号的角度。。我如何利用它来检查我应该旋转多少speed1和speed2来移动这些精灵 public float signedAngle(Vector2 v1, Vector2 v2) {

我有两个项目,让我们称它们为Obj1和Obj2。。。两者都有一个当前位置pos1和pos2。。此外,它们还有流速矢量speed1和speed2。。。我如何确保如果它们的距离越来越近(通过检查当前距离和下一个距离),它们将彼此移动得更远

我有一个有符号的角度函数,它给出了两个向量之间有符号的角度。。我如何利用它来检查我应该旋转多少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

有什么想法吗?

如果我理解正确,这就是情况,您希望获得两个绿色向量

红色向量很容易得到:
redVect=pos1-pos2
。redVect和greenVect2将指向同一个方向,因此唯一需要做的就是缩放它,使其长度与speed2的长度匹配:
finalGreenVect2=greenVect2.Normalize()*speed2.length
(尽管我并不确定这个公式)
greenVect1=-redVect
so
finalGreenVect1=greenVect1.Normalize()*speed1.Length
。然后是
speed1=finalGreenVect1
speed2=finalGreenVect2
。此方法将为您提供即时转弯,如果您喜欢平滑转弯,您希望通过以下方式旋转速度矢量:

angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f;
o.5f是旋转速度,将其调整为所需的任何值。恐怕你必须先创建一个旋转矩阵,然后用这个矩阵来计算速度向量。

希望这有帮助;)

如果对象A和B越来越近,则其中一个对象组件(X或Y)相反

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


非常感谢您的评论。。我将对此进行阐述,并在这里回复我的结果。。谢谢你,黑胡子!非常感谢你的评论。。我将对此进行阐述,并在这里回复我的结果。。谢谢你!
angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f;