玩家以一定速度移动到最后一次点击,C#

玩家以一定速度移动到最后一次点击,C#,c#,C#,我希望让播放器以较慢的速度移动到光标最后单击的位置。我尝试过这一点,但只是作为一个常量实现了它(玩家一直在跟踪光标)。我不希望发生这种情况,我只希望它在窗口内单击时工作 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void MouseDown(object sender, MouseEventArgs e)

我希望让播放器以较慢的速度移动到光标最后单击的位置。我尝试过这一点,但只是作为一个常量实现了它(玩家一直在跟踪光标)。我不希望发生这种情况,我只希望它在窗口内单击时工作

public partial class Form1 : Form
{
    public Form1()
     {
        InitializeComponent();
     }
    private void MouseDown(object sender, MouseEventArgs e)
     {
            tmrMoving.Enabled = true;
            Invalidate();
     }

    private void tmrMoving_Tick(object sender, EventArgs e)
    {
           player.Location = (Cursor.Position);
           Invalidate();
    }
}
有什么建议/方法吗

编辑 我已经编辑了你的代码Henrik,但是现在我有一个double=>int问题,有什么解决办法吗

private void tmrMoving_Tick(object sender, EventArgs e)
    {
            var xdiff = Cursor.Position.X - player.Location.X;
            var ydiff = Cursor.Position.Y - player.Location.Y; 
            var diff = Math.Sqrt(xdiff + ydiff);

           // xdiff = player.Location.X;
           // ydiff = player.Location.Y;
    }
替换

player.Location = (Cursor.Position);
像这样的事

var diff = Cursor.Position - new System.Windows.Point(player.Location.X,player.Location.Y);
var speed = Math.Sqrt( diff.X * diff.X + diff.Y * diff.Y);
if (speed > 10)
{
    diff.X /= speed / 10;
    diff.Y /= speed / 10;
}
player.Location += new System.Drawing.Point( (int)diff.X, (int)diff.Y);

我在这里看不到的是计时器何时停止处理。 在我看来,基本步骤可能如下所示:

  • 你处理这个事件

  • 保存鼠标在专用
    队列中单击时的位置,并启动计时器

  • 在计时器处理程序中,获取在“队列”中输入的第一个点,并将其保存在某个字段中(
    curPointToProcess
    ??)

  • 将对象移向每个刻度上的点。速度由滴答声的频率或每滴答声移动的对象数量控制,或由两者控制

  • 一旦对象到达该点,检查
    队列中是否还有另一个点

    • 是:抓住要点,再次执行最后两个步骤
    • 否:停止计时器并等待下一次
      MouseDown

您必须有某种
队列
原因当您将对象移动到该点时,用户可能会疯狂地点击其他点,您需要保存它们并按顺序依次处理,除非你的设计需要其他东西。

你需要检测何时而不是鼠标按钮是否按下。我发现你的问题有点神秘,player??player=picturebox我确实尝试过单击,但“player”仍然跳到位置,而不是移向该位置;我不确定如何增加移动量。不能这样做,因为你不能在光标的位置上使用数学操作数。@AshleyFayers你试过了吗?是的,
var diff=Cursor.Position-player.Location
将不能用作
光标。Position
无法接受该操作数。@AshleyFayers是的,我现在看到你的问题了<代码>光标.位置
系统.窗口.点
,但
图片框.位置
系统.绘图.点
。非常混乱。请参阅我的编辑。我希望有帮助。我没有编译它,但至少你应该明白了。太接近了!!错误1命名空间“System.Windows”中不存在类型或命名空间名称“Point”(是否缺少程序集引用?)这是唯一的错误。不过,谢谢,我现在对此有了更多的了解。类似,但我不想保存上一个位置,下一个位置会覆盖上一个位置。我不知道移动算法是如何工作的,但如果您只需要一个目的地,您可以避免收集点。如果物体的行为变化取决于方向,算法也可能如此,那么你可能仍然需要知道点发生了变化。基本上,这是一个快速移动的迷宫游戏,玩家每次点击都会移动到一个安全区域,当站在这个安全区域时,不会受到(环境)的伤害。玩家会点击移动并不断移动,直到他们到达目的地或点击移动到另一个位置。因此,正如你所说,你可能只有一个点,在计时器内的每一个“步骤”上,获得“当前点”,并沿着指向它的向量移动。好的,我知道如何做大部分工作,表示值之类的变量,但如何执行步骤和移动?我可以移动物体,但不能以步/慢的方式移动?