2011-03-21 141 views
0

給定一個可以在給定的X,Y點向前,向後,向左和向右移動的對象。如何有效地使用給定的運動機制以最有效和最人性的方式將對象引導至X,Y點。C#將點(X,Y)移動到點(X,Y)的路徑算法

對象可以實時移動,您可以告訴他們「startMoving | Direction |()」和「stopMoving | Direction |()」。雖然作爲一個額外的扭曲和我遇到的困難的部分是,對象的面對是永遠不知道的,只有它的當前位置是已知的,所以算法必須「檢測」方向。對象的位置以500-1秒的間隔在單獨的線程中更新。用於更新算法內的位置的「請求」可以在任何時候進行,但是它不是立即可用的,算法必須考慮到這一點。做像requestAndWaitForCoordUpdate()這樣的事情是完全可以接受的,但可能不需要。

另外,沒有障礙物出現,可以認爲你是在一個大部分開放的平面上,遠離路徑之間的直線,你可能遇到障礙物。假設目標和源之間的距離的四分之一應在給定的直接路徑上寬度可用,這是安全的。

我還會提到我不確定A *在這種情況下適用,如果它確實如此,我不確定如何在給定約束的情況下實施它。這裏唯一真正的變量是對象的面對。

下面是一些示例代碼:

public int[] currentCoords; 
public void movement() { 
    currentCoords[0] = 1005; // starting y coord 
    currentCoords[1] = 1007; // starting x coord 
    moveTo(1050, 1025); 
} 

public void moveTo(int x, int y) { 
    ... how? 
} 

public void threadUpdatingCoords() { 
    ... periodically check for source coord updates 
    ... between 200ms and 1000ms apart. 
} 
+2

你可能有更好的運氣(或甚至答案):http://gamedev.stackexchange.com/ – 2011-03-21 21:16:55

+0

請更精確。你想如何移動? – SLaks 2011-03-21 21:19:19

+0

你如何移動?它是向前邁進了嗎?或者按照給定的方向邁進?方向如何處理?你只能面對NSEW嗎?或者對角線也是一個因素? – 2011-03-22 14:12:51

回答

0

要計算你應該使用A *算法的最佳路線。然而,要以最人性化的方式來做到這一點,你只需讓它走路並隨意指示。除非它是一個聰明的人,否則他只需將右手伸向牆壁並繼續行走而不會失去觸覺:最終你會到達目的地。

人是不高效的,它是隨機的。 A *不是隨機的,而是有效的。