2010-04-13 45 views
0

爲了說明我現在有類似使用Java如何繪製一條直線上的精靈路徑?

int startX,endX,currX; 
int startY,endY,currY; 

public void updatePos(){ 

if(currX<=endX){ 
    currX+=1; 
} 
//Same for y 

我可以看到,我不想要移動x和y各自時間是相同的,但不知道如何工作了我應該做的多少來確定每個人都應該進行調整。

任何想法

也許這將有助於澄清

想象我開始在這些COORDS (0,0) ,我想,如果我去 (18,10)

增加我的x和y,直到他們到達所需的目標爲止,精靈向上向上移動,然後在屏幕上向右移動,然後靜止在正確的位置。

我想要的行爲是它駛向目的地點單一方向(沿三角形的splope如果你願意)

進出口尋找如何找到我的下一個點的集合建議

+0

您可以在下面使用我的答案,並根據比率(endX - startX):(endY - startY)...即18:10或1.8:1來設置精靈速度。例如,您可以將dx設置爲1.8像素/ ms,dy設置爲1像素/ ms。您應該考慮將位置和速度存儲爲雙精度而不是整數。由於你的精靈以不連續的步驟「跳躍」,所以你需要檢查它是否超出了(18,10)的結束位置,但是你會保證它會穿越這個點(除去任何舍入誤差)。 – Adamski 2010-04-13 10:48:20

回答

0

通常,你將有一個你的精靈所需的速度,並會根據它的速度和自上次更新以來經過的時間更新其位置,例如

public class MySprite { 
    int x, y; // Location 
    int dx, int dy; // Velocity in pixels/millisecond 

    public void updatePosition(long deltaMillis) { 
    // Update x and y position based on current velocity. 
    x += dx * deltaMillis; 
    y += dy * deltaMillis; 
    } 
} 

根據機器的速度,動畫循環將運行得更快或更慢。但是,由於您的更新基於預先指定的速度,因此這不會影響精靈在屏幕上移動的速度。

public void animationLoop() { 
    long prev = System.currentTimeMillis();; 
    long now; 
    long deltaMillis; 

    while (animationRunning) { 
    // Record ellapsed time. 
    now = System.currentTimeMillis(); 
    deltaMillis = now - prev; 
    prev = now; 

    if (deltaMillis > 0L) { // Some time has passed so move sprite. 
     sprite.updatePosition(deltaMillis); 
    } 

    // TODO: Repaint sprite. 
    } 
} 
+0

是否會告訴我它將落在一條路上的什麼地方:我所得到的是想象在三角形的斜坡上行駛我怎樣才能得到斜坡上的點 – allen 2010-04-13 10:19:17

+0

當你說斜坡上的點是你指的每一點組成線?上面的代碼不會這樣做,因爲精靈正以不連續的時間步長移動,導致它一次「跳躍」幾個像素。精靈的每個位置*將*位於斜坡上,但不會訪問每個單點。你能否擴展你的問題來描述你想要達到的目標? ...這是動畫問題還是與幾何相關? – Adamski 2010-04-13 10:23:34

2

如果T是從X0移動,Y0至X1,Y1,位置在任何給定時間t所需的時間(0 < =噸< = T)是:

X = X0 + t*(X1-X0)/T 
Y = Y0 + t*(Y1-Y0)/T 
1

根據您的擴​​展問題,您似乎有興趣訪問開始和結束位置之間的每個像素。在這種情況下,你可能想看看Bresenham's Line Algorithm,它描述瞭如何做到這一點。

相關問題