我想旋转一个精灵来面对鼠标通过使用旋转半径增加和减少旋转。它的工作正常,直到鼠标左上角并移动到右上角。我拥有它,所以如果角度差异大于当前的旋转值,精灵的旋转会增加,否则它会减少。所以当它从6.5弧度变为0时,它逆时针旋转350度 - 某些度数,而不是顺时针旋转15度 - 某些度数。我和其他人一整天都在为此工作,并不知道如何解决这个问题。我的代码如下:雪碧旋转XNA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System.IO;
namespace Physics
{
public class Ship
{
public Texture2D Texture { get; set; }
public Vector2 Position { get; set; }
public double Rotation { get; set; }
MouseState prevState, currState;
Vector2 A, B;
public const double NINETY_DEGREES = 1.57079633;
double turningRadius = 2 * (Math.PI/180);
double targetRotation, rotationDifferential;
public Ship(Texture2D texture, Vector2 position)
{
Texture = texture;
Position = position;
A = new Vector2(Position.X, Position.Y);
B = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
Rotation = 0;
}
public void Update()
{
currState = Mouse.GetState();
A.X = Position.X;
A.Y = Position.Y;
B.X = currState.X;
B.Y = currState.Y;
if (B.Y > A.Y)
if (B.X > A.X) //Bottom-right
targetRotation = Math.Atan((B.Y - A.Y)/(B.X - A.X)) + NINETY_DEGREES;
else //Bottom-left
targetRotation = (Math.Atan((A.X - B.X)/(B.Y - A.Y))) + (NINETY_DEGREES * 2);
else
if (B.X > A.X) //Top-right
targetRotation = Math.Atan((B.X - A.X)/(A.Y - B.Y));
else //Top-Left
targetRotation = Math.Atan((A.Y - B.Y)/(A.X - B.X)) + (NINETY_DEGREES * 3);
if (Rotation > targetRotation)
Rotation -= turningRadius;
else
Rotation += turningRadius;
prevState = currState;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(Texture, Position, null, Color.White, (float)Rotation, new Vector2(Texture.Width/2, Texture.Height/2), 0.5f,
SpriteEffects.None, 0.0f);
}
}
}
任何想法如果我只有两个弧度的浮动角度如何做到这一点? – Jack 2015-07-20 08:20:03
@杰克:这已经在答案?为了将角度转换为方向矢量,它只是'(Cos(旋转),Sin(旋转))' – 2015-07-20 18:03:00
我想我想知道是否有这样做的方法,而不将浮点数转换为Vector3。似乎有点...无关经历该转换并再次回到浮动状态? – Jack 2015-07-20 18:24:25