2016-03-20 97 views
2

我正在嘗試使用Phaser 2.4.6和隨附的p2.js版本將物體從點A移動到點B.身體準確地停在目的地點,而不是在點後或經過點後非常重要(非常低的容差是可以接受的)。我已嘗試兩種方法到目前爲止,並且都失敗:使用Phaser和p2.js物理的「精確移動」物體

  • 使用Phaser補間來更改我希望它移動的路線上的身體座標。這工作很好,除了身體可以跳過靜態身體。

Using a Phaser tween

示例代碼:

game.add.tween(sprite.body).to(
    { x: destinationX, y: destinationY }, 
    timeInterval, 
    Phaser.Easing.Quadratic.InOut, 
    true 
); 
  • 使用P2 force屬性來移動身體所需的路徑上。與其他身體的碰撞這次運作良好,但幾乎不可能讓身體停在我想要的座標上。我試圖減少身體接近目的地時施加的力量,這在90%的情況下效果很好。然而,在低性能場景中,動畫是「緊張的」(這是可以預料的),但也未能達到目標點並超越它,有時是很多。我甚至會接受強制停止身體的選擇,當它撞擊到目的地並且傷害場景的真實性時,但我無法做到這一點(試圖將力和速度都設置爲0,阻尼等於1等等 - 沒有任何工作)。

下面一些示例代碼(在移相器引擎sprite.body.data是指向p2.js物理學體):

// OUTSIDE OF THE GAME LOOP: 
var magnitude = game.physics.p2.pxmi(-speed); 
var angle = entity.body.data.angle + Math.PI/2; 
var forceX = (magnitude * Math.cos(angle))/10; 
var forceY = (magnitude * Math.sin(angle))/10; 

// IN THE GAME LOOP: 
sprite.body.data.force[0] = forceX; 
sprite.body.data.force[1] = forceY; 
// Decrease forceX and forceY as the body approaches the destination 

可有人請提供一些建議嗎?在這一點上我迷失了方向,所以我甚至可以使用熟悉其他物理引擎的人的有根據的猜測。

謝謝。

+0

你可以添加你嘗試過的代碼,所以我們有一個起點幫助? –

+0

@JamesSkemp我加了一些代碼。我真的想要得到第二種方法來工作。目前我正在減少X和Y軸上的力量,因爲精靈正在接近目的地,直到它們最終都爲零。這是有效的,但是如果CPU非常繁忙,精靈開始移動(這是預期的)並最終超出目標點。 – AdrianT

回答

1

我還沒有廣泛玩過物理學,但從我所見到的情況來看,移動一個支持物理的物體通常通過body.velocity完成。

看到一個簡單的例子我放在一起:http://phaser.io/sandbox/wUGlsnRx

+0

我剛剛嘗試過使用'velocity',但是我得到了與'force'屬性相同的結果,即在CPU非常繁忙的情況下,精靈會超出目標點。似乎不可能讓精靈在目標點準確而一致地停下來。我想也許開始考慮使用距離約束,但我希望找到一個更簡單的解決方案。 – AdrianT

0

@Kamen Minkov是正確的。如果你想使用物理,那麼你不能補間你的身體或手動改變位置。你提到它在高負載下有問題,但這可能是P2性能的問題嗎? Here's something similar for 3D games。您的2D遊戲是否是街機物理選項?

這種方法對性能極差,因爲你對撞機是由一大堆的頂點,它需要不斷更新每一幀,並且它更計算昂貴看看是否有與它相撞,因爲它的奇怪的形狀。使用人體角色的「膠囊」對撞機要快得多,它只是一個圓頂的圓柱體,大致與角色的大小相當。它在內存上更容易,並且在這樣簡單的形狀上計算碰撞要快得多。

難道你也need a special outlining for P2 physics?也許有一個問題。看看你的圖片Physics Editor

查看P2 example以確保正確設置它。