MonoGame - 在一个点周围有一个物体圈

时间:2014-07-24 13:34:00

标签: c# xna-4.0 monogame

我有一个Vector2 Position的对象和一个Vector2 Position的光标。

当我按住某个键时,我希望对象围绕对象旋转,但是我在计算正确的坐标时遇到了麻烦。

我已设法使用此代码使对象围绕光标圈(但它不是一个完美的圆形,而是更多的螺旋形):

Vector2 diff= Vector2.Normalize(cursor.Location - this.Location);

float angle = (float)Math.Atan2(diff.Y, diff.X) + (float)(90 * (Math.PI / 180));
this.Position += new Vector2((float)(speed * Math.Cos(angle)), (float)(speed* Math.Sin(angle)));

我计算光标和物体位置之间的角度,并将90°(弧度)加到该值上,按照我的逻辑,这应该使物体以完美的圆形运行。但是,光标和对象之间的距离会快速传播。

我在这里计算错误的是什么?

1 个答案:

答案 0 :(得分:1)

通常,当您希望某些内容围绕某个点旋转时,您可以定义到某个数量的距离,然后逐步更改Update方法中的角度。那么在你的绘制方法中,你可以通过计算光标的位置来绘制它。位置,光标的距离和所需的距离。

在大多数情况下,你希望你的轨道飞行器像光标一样具有相同的位置,所以在Draw方法中计算新位置效果最好,因为这些计算很便宜且超快(你通常不想吃你的Draw方法)。

我现在无法检查它,但你应该做的是这些内容:

假设您的物体应以角速度AngularVelocity(每秒)旋转距离光标D距离,那么当最初发生这种情况时,将可变角度设置为零。然后在您的更新中执行:

angle += (gameTime.ElapsedGameTime.TotalSeconds * AngularVelocity)

并在你的Draw方法中执行:

var displacedPosition = new Vector2(D * Math.Sin(angle), D * Math.Cos(angle));

如果当前正在轨道运行,则使用displaPosition而不是正常位置渲染您的轨道器。