2016-12-25 71 views
0

我有一個乒乓槳比賽中下面的代碼GameViewControllerSKAction的不同持續時間 - 動作完成後跳過?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 

     main.run(SKAction.moveTo(x: location.x,duration: 4), completion: { 
      print("COMPLETED TOUCH BEGAN") 
     }) 
    } 
} 
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 

     main.run(SKAction.moveTo(x: location.x,duration: 1), completion: { 
      print("COMPLETED TOUCH MOVED") 
     }) 
    } 
} 

出於某種原因,當touchesBegan持續時間比的touchesMoved的持續時間時,我的球員將先完成touchesMoved行動(甚至儘管touchesBegan必須先來),然後跳轉到不同的x位置,然後移動持續時間4以完成touchesBegan。這幾乎就像玩家到達指定touchesMoved(這應該是在touchesBegan幾乎完全相同的位置)的位置,可以追溯到有點武斷量,然後移動到touchesBegan位置。是否有一個原因,它跳回來,然後像這樣移動?

我的假設是,由於某些原因,touchesMoved行爲是同時運行的,當它們完成後,位置跳回到它在touchesBegan中緩慢移動的位置,並完成該移動以完成 - 幾乎就像移動了兩個物體以更快的速度完成之後以較慢的速度出現。這完全正確嗎?如果是這樣,爲什麼這樣?

編輯

我看到,當我使槳移動到屏幕的一側,然後點擊屏幕的相對端和滑過,它會移動到最終位置,我釋放,然後跳轉到我第一次按下的位置。這幾乎就像第一個動作是在後臺播放。奇怪的是,如果我保持我的手指放下(保持touchesMoved方法調用),直到touchesBegan中的移動完成(所以這裏是4秒),它不會跳到屏幕的另一側!

綜上所述,筆者有不同的持續時間運行多個SKActions,從我的觀察,當務之急是在附加到行動陣列的最新動作。但不是在對方播放多個動作,而是跳轉到屏幕上的不同位置以完成最終動作。

+0

你到底想達到什麼目的?你在很短的時間內製造了許多相互衝突的行爲。 – nathan

+0

@nathan我實際上是跟着[本教程](https://youtu.be/LdL99CH23E8?t=15m8s),並認爲他在做什麼是正常的。我對SpriteKit完全陌生。無論哪種方式,我現在很好奇到底發生了什麼。 – rb612

回答

0

如果你設置了第二SKAction移動同一個節點,第二個不抵消第一。相反,基於所有SKAction正在運行,每個幀之後計算節點的位置。如果SKAction具有相同的持續時間並且同時運行,則運行的最後一個SKAction將始終勝出。例如:

// Same duration, node finishes at 100 
main.run(SKAction.moveTo(x: -100, duration: 2)) //first to run 
main.run(SKAction.moveTo(x: 100, duration: 2)) //second to run 

如果第一SKAction具有更長的持續時間但是,第二SKAction結束後的位置將僅基於第一SKAction計算,例如:

//First SKAction's duration is longer, node finishes at -100 
main.run(SKAction.moveTo(x: -100, duration: 3)) 
main.run(SKAction.moveTo(x: 100, duration: 2)) 

這就是你看到'跳躍'的原因。

SKAction documentation

節點可以同時運行多個動作,即使這些動作 在不同的時間被執行。場景會跟蹤每個動作完成的距離,並計算動作 對節點的影響。例如,如果您運行兩個移動同一節點的操作,則這兩個操作都會將更改應用於每個框架。如果動作 動作方向相同且方向相反,則該節點將保持固定爲 。

在您的代碼touchesMoved可以被調用很多次,每次它將另一個SKAction添加到節點。我建議你運行的另一個SKAction之前取出主節點上的所有操作:那麼到底

main.removeAllActions() 

這將是:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     main.removeAllActions() 
     main.run(SKAction.moveTo(x: location.x,duration: 4), completion: { 
      print("COMPLETED TOUCH BEGAN") 
     }) 
    } 
} 
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     main.removeAllActions() 
     main.run(SKAction.moveTo(x: location.x,duration: 1), completion: { 
      print("COMPLETED TOUCH MOVED") 
     }) 
    } 
} 
+0

謝謝你克雷格!當我有權訪問Xcode時,我會再次重讀這篇文章,但我對您的行爲沒有取消的意思有點困惑,儘管蘋果的文檔說明了我認爲是相反的事情。如果這些舉措是平等的但相反,文件稱行動將取消。但是你在說最後的一場比賽會勝出。你能否澄清這一點?再次感謝您的詳細解答。 – rb612

+0

對不起,這有點令人困惑 - 看起來好像moveTo和moveBy工作方式不同,文檔似乎指的是moveBy。假設一個moveBy指定一個100的「x」移動,另一個指定一個-100的「x」移動 - 因爲100減去100等於0,這兩個調用就會相互取消。 (假設他們的緩解是相同的) –

+0

謝謝澄清!所以隨着我的跳躍,touchesBegan首先在後臺運行一個「幻影」,而touchesMoved動作以較短的持續時間運行?然後,一旦touchesMoved動作結束,它跳轉到幻影對象的位置?我有點困惑,爲什麼它以這種方式運作,以及爲什麼moveTo命令以這種方式工作。 – rb612

相關問題