簡體   English   中英

用鼠標平穩地移動對象

[英]Moving object with mouse smoothly

我希望我的物體跟隨鼠標所在的位置,例如點擊游戲。 問題是,雖然我可以使對象移動到鼠標單擊的位置,但不能使其平滑進行。 例如,我要將對象從A點移動到B點 我可以以45°角移動它,直到它具有與單擊鼠標相同的軸之一,然后像這樣使它筆直移向另一個軸。 但是我不知道如何使它像這樣平穩地移動。

我這樣移動我的對象:

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

並在更新對象的位置時使用此角度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM