2012-08-13 53 views
1

我有時間移動攝像機(屏幕可視部分)的Android遊戲,我必須不時從A點到B點平穩移動到B

顯然,我可以做到這樣的:

camera.setCenter(B.getX(), B.getY(); 

但它看起來不錯,它只是立即跳轉,而我想實現的是從A到B的平滑移動。我可以訪問onUpdate方法,這是更新某些遊戲對象的循環(所以我可以執行某些事情在一定的毫秒)

我真的無法弄清楚如何cre吃了這樣的算法,允許兩個點之間的平滑運動(判斷我不知道如何計算我要補充到

camera.setCenter(camera.getX() + xValue, camera.getY() + yValue) 

什麼值,因爲必須計算的值取決於什麼是這兩個點之間的距離。

回答

6

如果你的遊戲更新,以每秒60幀,並且要過渡到需要兩秒鐘,然後就應該採取120幀到那裏。

因此,應該在任何給定的更新移動量是total/120

您可以將這種抽象方法抽象爲排隊運動,計算FPS和移動每次更新量的方法,並在其當前位置加上更新量時調用.setCenter。這通常被稱爲interpolation。要確定你需要移動多遠,它的最大值不能超過current - destination的絕對值(哪一個在另一個的前面並不重要,所以我們只需要絕對值忽略該符號即可,技術上,distance is a scalar whereas position is a vector) 。

所以,總結一下半碼(我不知道這些功能的實際合同):

//given these variables already have value 
double fps, currentX, destinationX, currentY, destinationY, animationLength; //animation length in seconds 
... 
double xValue = Math.abs(currentX - destinationX); 
double yValue = Math.abs(currentY - destinationY); 
... 
//on each update: 
double amountToMoveX = xValue/(animationLength * fps); 
double amountToMoveY = yValue/(animationLength * fps); 
camera.setCenter(camera.getX() + amountToMoveX, camera.getY() + amountToMoveY) 

然後你只需要跟蹤的時候停止,你應該很好去。

不管你是否使用已經具備這種功能的引擎,我不知道。但就純算法而言,這似乎是一條路。

+0

謝謝你很好的解釋,現在我明白了。 – Matim 2012-08-13 19:11:28

0

查看來自this question

討論從答案:

長度= square_root((BX - 斧)^ 2 +(由 - AY)^ 2)

velocityX =( BX - 斧)/長度*速度

velocityY =(由 - AY)/長度*速度

其中x值是velocityX y與此類似