玩家以特定速度移动到最终点击,C#

时间:2015-03-30 12:47:21

标签: c#

我希望让播放器以较慢的速度移动到光标的最后点击位置。我试过这个并且只将它作为常量实现(玩家不断跟随光标)。我不希望发生这种情况,我只希望它在窗口内点击时能够正常工作。

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

2 个答案:

答案 0 :(得分:1)

替换

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

答案 1 :(得分:1)

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

  • 您处理MouseDown事件
  • 在私人Queue<T>点击鼠标并启动计时器
  • 时保存鼠标位置
  • 在计时器处理程序中,获取在“队列”中输入的第一个点并将其保存在某个字段(curPointToProcess ??)中。

  • 将对象移动到每个刻度线上的点。速度受到控制,或者按照刻度的频率或每个刻度移动的对象数量,或两者。

  • 一旦物体到达该点,检查Queue<T>

    内是否有另一个点
    • 是:明白这一点,然后再继续前两步
    • 否:停止计时器并等待另一个MouseDown

当您将对象移向该点时,您必须有某种Queue<T>原因,用户可能会疯狂地点击其他点,您需要保存它们并按顺序依次处理,除非您的设计期待别的东西。