2014-03-06 128 views
0

我想讓我的物體跟隨我的鼠標所在,就像點擊遊戲一樣。問題是,雖然我可以讓我的物體移動到鼠標點擊的位置,但我無法順利完成。例如,我想從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; } 
} 

我能做些什麼,使運動更直接?

+0

根據距離和x與y之間的差值來計算運動。然後不要只移動1個像素,按「差異水平」移動。例如如果x和xtarget相距100px,並且y和ytarget每移動x 1px,y 2px每個刻度 – weberik

+0

您的意思是將較大的數字除以較小的數字,數字每一步?因爲我已經嘗試過了,並且我一直得到一個零錯誤除法,儘管我在if語句中加入了一個if語句,如果兩個變量都沒有0,那麼只會進行計算。 – user3303233

+0

是啊,像_xdistance = _xClick - x,y相同,然後_xstepSize = _xdistance/_ydistance;那麼x + = _ xStepSize而不是x ++,shoud可以工作,但不是很優雅,只有在_xClick高於x時纔有效 – weberik

回答

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

,當您更新對象的位置使用這個角度。