2016-03-02 17 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の* 3S)であることが予想ということですが、私は、プラットフォームのログを受けていますこのような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

しばらくの間、スプライトキットで作業していません。しかし、私はあなたが速度を何度も繰り返していると推測しています。あなたの "SKAction.runBlock"では、 "self.physicsBody?.velocity"を適用する前に速度をゼロにリセットしてみてください。繰り返しますが、これは単なる推測であり、私はspritekitでもう動作しません。しかし、摩擦/速度損失は両方の物体で同じではないかもしれない。ベロシティをリセットすると、それが修正される可能幸運の仲間。 –

+0

うん、それも試してみましたが、問題は変わりません –

+0

純粋にテストのために、両方のオブジェクトを同じサイズ/質量にしようとしましたか?そうすると、問題は消えますか? –

答えて

2

私は前のSprite Kitに働いていないが、私はあなたの問題があると思います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 –

関連する問題