【问题标题】:Moving object with mouse smoothly用鼠标平滑移动物体
【发布时间】:2014-03-06 01:16:31
【问题描述】:

我希望我的对象跟随鼠标所在的位置,就像点击游戏一样。问题是,虽然我可以让我的对象移动到鼠标点击的地方,但我不能让它顺利进行。例如,我想从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; }
}

怎样做才能让动作更直接?

【问题讨论】:

  • 根据距离和 x 和 y 的差值计算运动。然后不要只移动 1 个像素,而是移动你的“差异级别”。例如如果 x 和 xtarget 相距 100px,并且 y 和 ytarget,则每滴答移动 x 1px,每滴答移动 y 2px
  • 您的意思是将较大的数字除以较小的数字,以计算出每一步移动较大的数字需要多少空间?因为我已经尝试过了,而且我一直得到除以零的错误,尽管我输入了一个 if 语句,它只会在两个变量都没有 0 的情况下进行计算。
  • 是的,像 _xdistance = _xClick - x,y 也一样,然后 _xstepSize = _xdistance / _ydistance;然后 x+=_xStepSize 而不是 x++,应该可以工作,但不是很优雅,只有在 _xClick 高于 x 时才有效

标签: c# winforms mouseevent game-physics mousemove


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多