2017-02-24 47 views
3

我已經很簡單的遊戲。這就像使用加速計的經典迷宮遊戲,但用戶也可以使用3D Touch來改變矩形的大小。改變SKPhysicsBody,同時改變SKSpriteNode的位置

玩家的節點是矩形,其移動得益於世界物理學從加速計(在這裏沒有什麼特別的)獲取數據:

motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in 
    if let motionData = data{ 
     self.physicsWorld.gravity = CGVector(dx: motionData.acceleration.x * 7, dy: motionData.acceleration.y * 7) 
    } 
} 

和touchesMoved:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if let touch = touches.first{ 
      let maxForce = touch.maximumPossibleForce 
      let force = touch.force 

      let forceValue = force/maxForce 

      player.size = CGSize(width: 26-forceValue*16, height: 26-forceValue*16) 
      player.physicsBody = SKPhysicsBody(rectangleOf: player.size) 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    resetSize() 
} 

func resetSize(){ 
    player.size = CGSize(width: 26, height: 26) 
} 

所以,當我正在改變玩家的大小工作得很好:節點正在屏幕上移動,基於設備的方向,同時越來越緊,越來越小。問題是physicsBody(我在GameViewController.swift中設置了view.showsPhysics = true)始終是相同的,所以我添加了player.physicsBody = SKPhysicsBody(rectangleOf: player.size),但現在當我按下屏幕時,播放器的節點調整大小,但它也停止移動。如何同時更改節點的大小和物理體積並保持運動?

回答

1

當您更改physicsBody你失去了invoved所有物理參數你以前physicsBody:您可以複製velocityangularVelocity或其他可用參數,但是這還不夠,你將永遠不會有連續性,因爲SpriteKit框架(實際版本)沒有這個選項:在遊戲中動態更改physicsBody

你也可以改變你的縮放節點修改physicsBody,但你永遠失去了物理變量,例如累積的速度由於重力:發生這種情況是因爲SpriteKit變化自動縮放創建其他機構在physicsBody沒有保留累積的屬性。

所以我的建議是要創造一種「凍結時間」,當你觸摸你的球,其中當球被攔你可以改變你physicsBody的。

+4

人誰downvote應該表現出一個解決方案(但真正的物理瓦爾時間真正的傳播,而不是僞造..),並試圖解釋我的陳述,以幫助他們的OP相反的想法。 –

+0

凍結時間是什麼意思?當我想要改變尺寸時,我應該停止運動嗎?尺寸沒問題後繼續運動球嗎? – codddeer123

+0

這只是一個想法,但你可以找到其他模式:你可以創造類似於它周圍的「矩陣」電影場景的效果(降低音樂速度和遊戲元素的所有動作只有在這種狀態..) –