编程语言
首页 > 编程语言> > c# – 获取Vector2之间的角度

c# – 获取Vector2之间的角度

作者:互联网

当汽车撞到星星时,我想将星星(我的代码中的硬币)移动到屏幕的正确右上角.在每次更新期间,恒星和道路都以恒定速度向下移动.由于道路向下移动,汽车不会移动但似乎向上移动.虽然它可以根据用户的命令移动到左右车道.

所以我使用以下方法计算了屏幕的星形和右上角之间的角度

public double AngleBetween(Vector2 a, Vector2 b)
{
    return Math.Atan2(b.Y - a.Y, b.X - a.X);
}

在我的Update方法中,以下计算要移动的速度并将其发送到屏幕的右上角

double angleBetween = coin.AngleBetween(coin.Position, new
   Vector2(currentGame.GraphicsDevice.Viewport.Bounds.Right, 0));              
collidedCoinVelocity = new Vector2((float)Math.Sin(angleBetween), 
   -(float)Math.Cos(angleBetween));

在我的Draw方法中,我更新了coin.Position使用

coin.Position += collidedCoinVelocity * 10 ;

问题是星(硬币)没有像我想要的那样发送到右上角,但是它位于右侧屏幕中间的某个位置.

当星球在右侧车道上被击中时,它与右上角之间的角度始终是

1.2196048576751 radians = 69.878211 degree

当恒星在左侧车道上时,角度为

0.952588487628243 radians = 54.5793 degree

我正确地计算了角度,我错过了什么?也许我忘了考虑明星的向下运动?

编辑

我已更新图像以显示我正在尝试计算的角度并编辑我的问题以使其更清晰.

编辑2

添加了第二张图片,以显示被击中后星星的去向.

解决方法:

呃…仅供参考;从笛卡尔坐标转换为使用角度,然后回到笛卡尔坐标在这里没有任何意义.

只需得出你的最终速度:

Vector2 direction = new Vector2(currentGame.GraphicsDevice.Viewport.Bounds.Right, 0) - coin.Position;
direction.Normalize();

Velocity = direction * 10;
Position += Velocity;

也;永远不要更新Draw中的位置.绘图用于绘图,而不是更新.更新保持更新!

也是2;您应该概括您的代码.所有移动对象都应该继承相同的基础,包括Velocity,Position和Acceleration以及处理这些内容的代码.这样,你只需改变你的逻辑来操纵速度和/或加速度来移动东西.

MovingObject.Update:

Velocity += Acceleration * deltaTime;
Positioin += Velocity * deltaTime;

(deltaTime =自上一帧以来的秒数,或者(float)gameTime.ElapsedGameTime.TotalSeconds)

然后你只需在子类更新结束时使用base.Update(),只要你设置了正确的值,位置和速度就会起作用.

标签:c,xna,windows-phone-8,monogame
来源: https://codeday.me/bug/20190517/1121483.html