首页 > 解决方案 > 使某物同时在 X 轴和 Y 轴上移动

问题描述

对于我为学习目的而制作的简单游戏,我试图让角色从 A 点移动到 B 点。

我已经尝试了一些东西,但我发现的唯一方法是先转到 B 点的 X 值,然后转到 Y 值

public void Walk(Vector2D target)
{
    var distance = Character.Position.Distance(target);

    bool positiveX = target.X > Character.Position.X;
    bool positiveY = target.Y > Character.Position.Y;

    for (var i = 0; i < distance.X; i++)
    {
        var position = Character.Position.Clone();

        position.X = (positiveX ? 1 : -1) + position.X;

        if (Map.IsWalkable(position))
        {
            Character.Move(position);
        }
    }

    for (var i = 0; i < distance.Y; i++)
    {
        var position = Character.Position.Clone();

        position.Y = (positiveY ? 1 : -1) + position.Y;

        if (Map.IsWalkable(position))
        {
            Character.Move(position);
        }
    }
}

我想让角色在需要时以对角线“行走”就像在这张图片中一样在此处输入图像描述

标签: c#

解决方案


首先,您需要一个循环,而不是两个循环。其次,您不能在 x 方向上的每一步都在 y 方向上移动一步。相反,您需要以相同的步数将它们平均分配:

public void Walk(Vector2D target)
{
    var distance = Position.Distance(target);
    var steps = 5;
    var stepX = distance.X / steps;
    var stepY = distance.Y / steps;

    bool positiveX = target.X > Position.X;
    bool positiveY = target.Y > Position.Y;

    for (var i = 0; i < steps; i++)
    {
        var position = Position.Clone();

        position.X = (positiveX ? 1 : -1) * stepX + position.X;
        position.Y = (positiveY ? 1 : -1) * stepY + position.Y;

        if (Map.IsWalkable(position))
        {
            Character.Move(position);
        }
    }
}

这里我选择了5个步骤。或者,您可以选择固定距离以在每一步上移动。然后,您可以使用一些三角函数或比例来计算在 x 和 y 方向上移动多远以沿直线移动所选距离。


推荐阅读