当汽车撞到星星时,我想将星星(我的代码中的硬币)移动到屏幕的右上角。每次更新时,星和路都在以恒定的速度向下移动。由于道路向下移动,汽车没有移动但似乎在向上移动。虽然它可以根据用户的命令移动到左右车道。
所以我用下面的方法计算了星星和屏幕右上角的夹角
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
添加了第二张图片以显示星星被击中后的去向。
最佳答案
看来你不小心交换了 sin 和 cos,而且里面似乎有一个随机的负数。因此这一行
collidedCoinVelocity = new Vector2((float)Math.Sin(angleBetween),
-(float)Math.Cos(angleBetween));
应该是
collidedCoinVelocity = new Vector2((float)Math.Cos(angleBetween),
(float)Math.Sin(angleBetween));
虽然你甚至不需要计算那么多角度。要获得没有角度的单位向量,只需使用
double dx = b.X - a.X;
double dy = b.Y - a.Y;
double mag = Math.Sqrt(dx * dx + dy * dy);
collidedCoinVelocity = new Vector2(dx, dy) / mag;
关于c# - 获取 Vector2 之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798107/