Xna 斜移雪碧

Xna 斜移雪碧,xna,logic,sprite,draw,Xna,Logic,Sprite,Draw,我希望你能帮助我 我正在根据鼠标位置移动我的精灵,当用户用右键单击时,如下所示: protected override void Update(GameTime gameTime) { int nextX = SpritePosition.X; int nextY = SpritePosition.Y; int SpriteWidth = 135; int SpriteHeight = 135; int Speed = 3; MouseState

我希望你能帮助我

我正在根据鼠标位置移动我的精灵,当用户用右键单击时,如下所示:

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);
}

我的精灵没有移动,我做错了什么?

你有两个位置,都存储为矢量2

从目标位置减去当前位置,得到两点之间的矢量

规格化该向量以获得方向向量


将方向向量乘以移动速度,以所需速度沿方向向量移动。

您有两个位置,将两个位置存储为向量2

从目标位置减去当前位置,得到两点之间的矢量

规格化该向量以获得方向向量


将方向向量乘以移动速度,以所需速度沿方向向量移动。

您需要将位置更改为:

nextY = SpritePosition.Y + SpriteHeight + Speed;

但这会导致sprite在开始时跳转,因此我建议您首先计算完成位置,然后缓慢地将其移动到该位置。

您需要将位置更改为:

nextY = SpritePosition.Y + SpriteHeight + Speed;

但这会导致sprite在开始时跳转,因此我建议您首先计算完成位置,然后缓慢地将其移动到该位置。

我用下面的代码做了一个示例,如下所示:

我创建了一个简单的点,5x5像素,这是屏幕上的对象。 你可以随心所欲地改变

这是我在一个自上而下的射击游戏中使用的一种方法。我把它从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;
    }
}

我用下面的代码做了一个示例,如下所示:

我创建了一个简单的点,5x5像素,这是屏幕上的对象。 你可以随心所欲地改变

这是我在一个自上而下的射击游戏中使用的一种方法。我把它从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;
    }
}


你能给我一些代码吗?我刚刚开始与XNA合作。我如何减去2个向量并进行归一化?你能给我提供一些代码吗?我刚刚开始与XNA合作。我怎样才能减去2个向量并进行规格化呢?只是想澄清一下,如果玩家在屏幕(或地图)的中心,那么敌人使用这种方法只是朝着那个物体移动,并且旋转他们的精灵,使其看起来像是朝着你走去。伙计,这就像一个符咒,但说实话,我不明白这个函数是怎么工作的,我数学不好:/你可以查一下,它计算出一个轨迹。如果你以后有一个“角色精灵”,你想旋转它,使它指向你要走到的点,你可以使用“FaceObject”,正如我前面所说,也许你需要创建一个偏移,比如说如果你的角色指向上(在纹理2D图像中),你可能需要添加Math.ToRadians(FaceObject(位置,目标)+90f)在你的spriteBatch.Draw call中。只是为了澄清,如果玩家在屏幕(或地图)的中心,敌人使用这种方法来简单地向该对象移动,并旋转他们的精灵,使其看起来像是向你走来。Mate这就像一个符咒,但告诉你真相,我不明白这个函数是怎么工作的,我数学不好:/你可以查一下,它计算出一个轨迹。如果你以后有一个“角色精灵”,你想旋转它,使它指向你要走到的点,你可以使用“FaceObject”,正如我前面所说,也许你需要创建一个偏移,比如说如果你的角色指向上(在纹理2D图像中),你可能需要添加Math.ToRadians(FaceObject(位置,目标)+90f)在你的spriteBatch.Draw调用中。我认为我的示例可能太多了,似乎你只是忘记了计算精灵的大小。所以,如果你用鼠标点击一个位置,你会希望它以该点为中心。然后,X=MouseLocation.X-(SpriteWidth/2),Y=MouseLocation.Y-(SpriteHeight/2)。仔细看看你的例子,似乎这就是问题所在。更新你的浏览器,你会在代码下面看到我的工作示例,希望这对你有用。但是,我认为上面的评论也是一个可能的解决方案。问题不是我想把它放在中间,问题是它移动的方式,它不是直角对角的,如果y的大小小于x,移动到x时先移动到y,但是y先完成(低于x)。然后精灵继续向X方向移动。我希望它直接向对角线方向移动创建一个新的XNA游戏项目并复制我下面的示例代码,代码正在运行,也许你可以从中了解到你做错了什么。不管问题是什么。删除Program.cs文件,只需添加一个您想要的精灵作为“精灵”,并将其重命名为点即可尝试。我认为我的示例可能太多了,似乎您只是忘记了计算精灵的大小。所以,如果你用鼠标点击一个位置,你会希望它以该点为中心。然后,X=MouseLocation.X-(SpriteWidth/2),Y=MouseLocation.Y-(SpriteHeight/2)。仔细看看你的例子,似乎这就是问题所在。更新你的浏览器,你会在代码下面看到我的工作示例,希望这对你有用。但是,我认为上面的评论也是一个可能的解决方案。问题不是我想把它放在中间,问题是它移动的方式,它不是直角对角的,如果y的大小小于x,移动到x时先移动到y,但是y先完成(低于x)。然后精灵继续向X方向移动。我希望它直接向对角线方向移动创建一个新的XNA游戏项目,并复制我下面的示例代码,co