SKFieldNodeというクラスを使えばバネの効果を表現できるようなので試してみました。
バネの場を作ってみる
バネの効果を与えるにはSKFieldNode.springField
でSKFieldNodeを生成してaddChildするだけです。
そうすれば全てのSKPhysicsBody
に対して作用します。
バネの強さはstrength
プロパティーで調整します、バネの中心点はposition
プロパティーにセットします。
override func didMoveToView(view: SKView) { let field = SKFieldNode.springField() field.position = CGPoint(x:CGRectGetMidX(self.frame) + 100, y:CGRectGetMidY(self.frame)) field.strength = 10.0 addChild(field) let node = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 120,height: 120)) node.position = CGPoint(x:CGRectGetMidX(self.frame) + 100, y:CGRectGetMidY(self.frame) + 100) node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size) addChild(node) }
バネの減衰をなくす
先ほどのコードを動かすと動きが段々小さくなって止まってしまうかと思います。
これはSKSpriteNodeの空気抵抗が原因です。
下のようにlinearDamping
に0をセットすれば空気抵抗がなくなり永遠に動き続けます。
let node = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 120,height: 120)) node.position = CGPoint(x:CGRectGetMidX(self.frame) + 100, y:CGRectGetMidY(self.frame) + 100) node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size) node.physicsBody!.linearDamping = 0 addChild(node)
特定の要素にだけ場の影響を与える
下のようにSKFieldNode
のcategoryBitMask
とSKPhysicsBody
のfieldBitMask
を使えば特定の要素にだけ影響を与える事ができます。
この例では、SKPhysicsBody
のfieldBitMask
に2をセットすればバネの場の影響を受けなくなります。
let field = SKFieldNode.springField() field.position = CGPoint(x:CGRectGetMidX(self.frame) + 100, y:CGRectGetMidY(self.frame)) field.strength = 10.0 field.categoryBitMask = 1 addChild(field) let node = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 120,height: 120)) node.position = CGPoint(x:CGRectGetMidX(self.frame) + 100, y:CGRectGetMidY(self.frame) + 100) node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size) node.physicsBody!.linearDamping = 0 node.physicsBody!.fieldBitMask = 1 addChild(node)
さいごに
SKFieldNode
では他にも磁場など様々な場が用意されているようです。
機会あれば試してみたいと思います。