2017年8月19日土曜日

SpriteKit で物理エンジンを使ってみる

概要

前回 SKAction を使って SKNode を動かしてみました
SpriteKit には協力な物理エンジンが備わっておりデフォルトで簡単に使用することができます
今回は物理エンジン (SKPhysicsBody) を使って SKNode に重力を与えてみました

環境

  • macOS X 10.12.6
  • Xcode 8.3.3 (8E3004b)

SKNode を配置する

GameScene.sks を編集しましょう
前回から以下のような感じで SKNode を配置しましょう
physicsbody1.png

block1 が転がって最終的に地面に着地します

GameScene.swift の編集

didMove を以下のように編集します

override func didMove(to view: SKView) {
    // 物理エンジンのグローバル設定
    self.physicsBody = SKPhysicsBody.init(edgeLoopFrom: self.frame)
    // block1
    let block1 = self.childNode(withName: "block1") as? SKSpriteNode
    block1?.physicsBody = SKPhysicsBody(texture: (block1?.texture!)!, size:(block1?.size)!)
    // block2
    let block2 = self.childNode(withName: "block2") as? SKSpriteNode
    block2?.physicsBody = SKPhysicsBody(rectangleOf: (block2?.frame.size)!)
    block2?.physicsBody?.isDynamic = false
    // block3
    let block3 = self.childNode(withName: "block3") as? SKSpriteNode
    block3?.physicsBody = SKPhysicsBody(rectangleOf: (block3?.frame.size)!)
    block3?.physicsBody?.isDynamic = false
}

まず SKPhysicsBody.init で物理エンジンの枠を指定します
今回は画面を枠にすることでノードが画面外にいかないようにしています

そして各ノードを取得して physicsBody で物理エンジンを指定します
block1 は落下させるため SKPhysicsBody(texture:) を設定します
他の 2 つは固定させて置いておくだけなので SKPhysicsBody(rectangleOf:) を設定し isDynamic を false に設定します
こうすることで物理エンジンは適用するものの重力の影響は受けなくなります
こうすることで block1 が block2, 3 に衝突する感じにすることができます

動作確認

では実行して確認してみます
以下のように block1 が転がって最終的には地面に到着すれば OK です
physicsbody2.gif

最後に

SpriteKit の物理エンジンを使ってみました
ノードを取得してプロパティに SKPhysicsBody を設定するだけなので非常に簡単です

物理エンジンの当たり判定 (Body Type) や衝突後の動きの変更などいろいろなカスタマイズもできるので試してみると良いと思います
設定は .sks だけでできるものも多いです

参考サイト

0 件のコメント:

コメントを投稿