用鼠标平滑移动物体

时间:2014-03-06 01:16:31

标签: c# winforms mouseevent game-physics mousemove

我想让我的对象跟随鼠标的位置,就像点击游戏一样。问题是,虽然我可以让我的对象移动到鼠标点击的位置,但我无法顺利完成。例如,我想从point A to point B移动我的对象。我可以将它以45°的角度移动,直到它与我的鼠标点击有一个相同的轴,然后让它直接朝另一个轴like this移动。但我无法弄清楚如何让它顺利移动like this

我用这个移动我的对象:

private void Game_MouseMove(object sender, MouseEventArgs e)
{
    if (IsMouseDown == true)
    {
        _xClick = e.Location.X;
        _yClick = e.Location.Y;
        timerClickMovement.Enabled = true;
    }
}
private void Game_MouseDown(object sender, MouseEventArgs e)
{
    IsMouseDown = true;
}
private void Game_MouseUp(object sender, MouseEventArgs e)
{
    IsMouseDown = false;
}
private void timerClickMovement_Tick(object sender, EventArgs e)
{
    if (_x != _xClick || _y != _yClick)
    {
        //_x and _y is the location of the object I want to move.
        if (_x > _xClick)
        { _x--; }
        else if (_x < _xClick)
        { _x++; }
        if (_y > _yClick)
        { _y--; }
        else if (_y < _yClick)
        { _y++; }
        Invalidate();
    }
    else
    { timerClickMovement.Enabled = false; }
}

我可以做些什么来使动作更直接?

1 个答案:

答案 0 :(得分:0)

要将游戏中的对象移向特定方向,可以使用以下伪代码:

x_delta = cos(direction)*speed;
y_delta = sin(direction)*speed;

x_position+=x_delta;
y_position+=y_delta;

每个步骤移动的总距离由浮动speed确定。

要前往特定位置,您可以创建一个条件,阻止您的物体比最终距离移动得更快,如下所示:

if(mvtEnabled){
   float tempDst = object.dst(x_final, y_final);
   if(speed>tempDst){
      update(tempDst);
      mvtEnabled = false;
   }else{
      update(speed);
   }
}

update根据给定的速度更新位置。每次单击,mvtEnabled都设置为true,并重新计算最终坐标。

您可以通过以下方式获取起始位置和最终位置之间的角度:

float direction = atan2(y_final - y_start, x_final - x_start);

并在更新对象的位置时使用此角度。