2016-03-02 119 views
7

我試圖在Swift上製作一個移動平臺,爲了讓玩家與平臺一起移動,我需要將self.moveByX()更簡單得多,即physicsBody?.velocity(併爲平臺和播放器添加一些摩擦)。Swift:爲距離設置速度

所以,我做了這樣的功能:

self.runAction(
    SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock({ 
       print(self.position.x) 
       self.physicsBody?.velocity = CGVectorMake(20, 0.0) 
      }), 
      SKAction.waitForDuration(3), 
      SKAction.runBlock({ 
       print(self.position.x) 
       self.physicsBody?.velocity = CGVectorMake(-20, 0.0) 
      }), 
      SKAction.waitForDuration(3) 
     ]) 
    ) 
) 

的問題是,我所期望的位置之間的差異正好60(20分* 3秒),但我收到了平臺的日誌x位置是這樣的:

596.042907714844 
544.228393554688 
596.048950195312 
544.234008789062 
596.054565429688 
544.116333007812 
595.936584472656 
544.121887207031 
595.942199707031 
544.127685546875 
595.824584960938 
544.009704589844 

所以,位置之間的區別是什麼之間51〜52

如何使平臺移動的規範通過改變速度確定距離和準確距離?

編輯:我不知道這是否是相關的,但我已經設置了平臺的物理身體是這樣的:

self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size) 
self.physicsBody?.categoryBitMask = PhysicsCategory.Ground 
self.physicsBody?.contactTestBitMask = PhysicsCategory.Player 
self.physicsBody?.collisionBitMask = PhysicsCategory.Player 
self.physicsBody?.allowsRotation = false 
self.physicsBody?.affectedByGravity = false 
self.physicsBody?.dynamic = true 
self.physicsBody?.friction = 1.0 
self.physicsBody?.restitution = 0.0 
self.physicsBody?.mass = 99999999999 
+0

我還沒有使用sprite套件一段時間。但我猜你正在一遍又一遍地重複速度。在您的「SKAction.runBlock」中,嘗試在應用「self.physicsBody?.velocity」之前將您的速度重置爲零。再次,這只是一個猜測,我不再與spritekit一起工作。但是這兩種物體的摩擦/速度損失可能不盡相同。重置速度可能會修復它。祝你好運。 –

+0

是的,我也試過了,問題沒有改變 –

+0

純粹是爲了測試,你是否試圖讓兩個物體具有相同的尺寸/質量?當你這樣做時,問題是否消失? –

回答

2

我還沒有和雪碧套件合作過,但我覺得你的問題是SKPhysicsBody的linearDamping屬性默認設置爲0.1,通過快速計算(20 * 3-20 * 3 * 0.1 = 54),如果速度在每幀被阻尼時,這聽起來正確。

下面是該屬性的文檔:

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/index.html#//apple_ref/occ/instp/SKPhysicsBody/linearDamping

編輯:我想我應該檢查我的答案至少我是這樣寫了一個快速(粗糙)程序:

var dampingOccurancesPerSecond = 60.0 //Corresponds to frame rate 
var numberOfSeconds = 3.0 
var time = 0.0 

@IBAction func test(sender: UIButton) { 
    let result = checkDistanceForVelocity(20, damping: 0.1, distanceTraveled: 0.0) 
    print(result) 
} 

func checkDistanceForVelocity(velocity: Double, damping: Double, distanceTraveled: Double) -> Double { 

    if time < numberOfSeconds { 

     time += 1/dampingOccurancesPerSecond 

     let newVelocity = velocity - (velocity * damping/dampingOccurancesPerSecond) 

     let newDistance = (distanceTraveled + velocity/dampingOccurancesPerSecond) 

     return checkDistanceForVelocity(newVelocity, damping: damping, distanceTraveled: newDistance) 

    } 

    return distanceTraveled 

} 

的由於幀速率的微小變化,您旅行距離上的小變化也很可能。當dampingOccurancesPerSecond從60 - > 50變化時,總行程距離變化從52.1203109538336 - > 51.8808576268828

希望這有助於!

+0

我可以從平臺的物理機構中刪除線性阻尼嗎? –

+0

是的,只需將物理體的linearDamping屬性更改爲0.0即可: –

+0

self.physicsBody?.linearDamping = 0.0 –