我希望你能帮助我。
当用户点击右键时,我会根据鼠标位置移动我的精灵:
protected override void Update(GameTime gameTime)
{
int nextX = SpritePosition.X;
int nextY = SpritePosition.Y;
int SpriteWidth = 135;
int SpriteHeight = 135;
int Speed = 3;
MouseState ms = Mouse.GetState();
if (ms.RightButton == ButtonState.Pressed)
{
if (ms.X > SpritePosition.X + SpriteWidth) //check to move right
{
nextX = SpritePosition.X + Speed;
}
else if (ms.X < SpritePosition.X) //check to move left
{
nextX = SpritePosition.X - Speed;
}
if (ms.Y > SpritePosition.Y + SpriteHeight) //Check to move bottom
{
nextY = SpritePosition.Y + Speed;
}
else if (ms.Y < SpritePosition.Y) //Check to move top
{
nextY = SpritePosition.Y - Speed;
}
//Change the Sprite position to be updated in the DRAW.
SpritePosition = new Rectangle(nextX, nextY, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);
}
base.Update(gameTime);
}
它现在正在运作,但它的移动方式是这样的:
错误移动http://i.imgur.com/xGsFy38.png
我希望它的移动方式如下: 向右移动http://i.imgur.com/kkEnoYD.png
伙计们,现在我从下面的答案中尝试了以下内容:
Vector2 From = new Vector2(SpritePosition.X, SpritePosition.Y);
Vector2 To = new Vector2(ms.X, ms.Y);
From = Vector2.Subtract(From,To );
Vector2 Direction = Vector2.Normalize(From);
Direction = Direction * Speed;
SpritePosition = new Vector2(Direction.X, Direction.Y);
我的精灵没有动,我做错了什么?
答案 0 :(得分:2)
你有两个职位,都存储为Vector2。
从目标位置减去当前位置,以获得两点之间的Vector。
将该向量标准化以获得方向向量。
将方向矢量乘以移动速度,以所需速度沿方向矢量移动。
答案 1 :(得分:2)
我用下面的代码做了一个例子,这里是:
我创建了一个简单的点,5x5像素,是屏幕上的对象。 你可以改变你喜欢的任何东西。
这是我用于具有spriteanimation的自上而下射手的方法。我将它从C ++转换为C#,但它应该工作相同。在我的情况下,根据精灵的位置,我必须添加+90度的旋转才能获得正确的结果,但希望你能想出来。
public static class Helper_Direction
{
// Rotates one object to face another object (or position)
public static double FaceObject(Vector2 position, Vector2 target)
{
return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
}
// Creates a Vector2 to use when moving object from position to a target, with a given speed
public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
{
double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);
Vector2 move = new Vector2(0, 0);
move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;
return move;
}
}
答案 2 :(得分:0)
您需要将职位更改为:
nextY = SpritePosition.Y + SpriteHeight + Speed;
但这会导致精灵在开始时跳起来,所以我建议你先计算完成位置,然后慢慢将它移到那个位置。