しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SpriteKitで場を作る事のできるクラス、SKFieldNodeを試す

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)
}

f:id:llcc:20150922212725g:plain

バネの減衰をなくす

先ほどのコードを動かすと動きが段々小さくなって止まってしまうかと思います。
これは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)

特定の要素にだけ場の影響を与える

下のようにSKFieldNodecategoryBitMaskSKPhysicsBodyfieldBitMaskを使えば特定の要素にだけ影響を与える事ができます。
この例では、SKPhysicsBodyfieldBitMaskに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では他にも磁場など様々な場が用意されているようです。
機会あれば試してみたいと思います。

参考URL

SKFieldNode Class Reference