2016-12-07 59 views
1

我對swift相當陌生,並且一直致力於開發一款遊戲以獲得樂趣,並且我遇到了一些無法擺脫困境的東西。SpriteKit跳躍和移動問題

當按下運行按鈕,字符用下面的函數

func move(dt: CGFloat) { 
    position.x += moveRate * dt 
} 

,並按下跳躍鍵時,字符用下面的函數

func jump() { 
    physicsBody?.applyImpulse(CGVector(dx: 0, dy: jumpRate)) 
    run(jumpAnimation!) 
} 

都工作跳躍向前移動好,但考慮一下這個塞納里奧。玩家正在跑步,然後在仍然移動時跳躍。在空中時,玩家釋放移動按鈕,玩家的x位置停止。這顯然感覺非常不自然,我希望玩家的x位置能夠緩解。

現在我也玩過physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))這個效果,但他似乎只是獲得了越來越多的速度,而且你沒有得到恆定的速度或「最大速度」這麼說。

有人能跟我分享一些見解嗎?我很想學習一些關於spritekit和遊戲開發的知識。謝謝!

+2

從我所看到的,在使用力量的同時手動改變位置的方式從未奏效。嘗試只使用力量或通過影響其位置屬性來改變節點的位置。另外,在update:method,每一幀內都應該調用施加的力(與applyImpulse方法不同)。 – Whirlwind

+1

即使直接改變速度矢量,同時使用力量和衝動將會很好地發揮,所以也許你可以玩... – Whirlwind

+0

一直玩的物理bodyBody更多的所有對象。它似乎很挑剔,但我用'applyForce'和'applyImpluse'創造了一個更好的結果。 「直接改變速度矢量」是什麼意思? –

回答

3

您應該嘗試設置速度而不是設置X位置。設置位置時,您繞過所有物理行爲。
您還應該嘗試僅在實際按下按鈕時進行設置。

func move(dt: CGFloat) { 
    if Math.abs(moveRate) > 0.1 { // If player initiates movement. You can increase the value 0.1 if you want to filter move values 
     velocity = CGVector(dx: moveRate, dy: veloxity.dy) 
    } 
} 

你的角色無限期地在空間移動,linearDamping將會很有用。它用於模擬空氣摩擦,所以接近1的值意味着更多的摩擦,接近0的值意味着更少的摩擦。

linearDamping = 0.85 

而且,這樣一來,moveRate不是dt依賴,但它應該降低。


試試吧,我還沒有測試它尚未,但基本上我會怎麼做。

2

有關平臺遊戲「物理學」的兩種思想流派。

  1. 不要使用物理,所有的位置增量。
  2. 做物理學的一切,因爲位置的變化搞亂了物理

由於您使用的物理跳躍和物理跳躍的樂趣:

有三種方法來創建物理系統中的運動:

  1. 根據需要設置速度。這是Crazyrems是在暗示
  2. 根據需要增加或減少運動的速度
  3. 施加力隨着時間的推移增加或減少運動的速率

  4. 使用領域誘發運動(這個太複雜應用的衝動,和凌亂,但有趣)

你試圖,你的physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))是隨着時間的推移應用武力。上面列表中的數字3。你繼續使用這個力量的時間越長,角色移動得越快。

可以使這些技術中的每一種都可以工作,但它們都需要補償它們各種限制和仿真方法。

對於您的方法,您需要監視器速度並設置最大速度。達到最高速度後,如果玩家仍然按住按鈕,則只能提供足夠的力量來維持速度(假設您使用某種形式的恆定阻力來減緩角色速度)。

監控速度結合強制結束時間創造了有趣的加速特性可能性 - 就像非常強大的初始加速度,然後隨着玩家接近其最大速度逐漸減小加速度。

播放器釋放按鈕時放慢是下一個焦點。在所有這些方法中,你需要的東西會降低玩家的速度。這可以是物理引擎提供的反作用力的應用,也可以是摩擦或阻尼的使用。