2010-04-13 23 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,它描述了如何做到这一点。

相关问题