概要
前回 SKAction を使って SKNode を動かしてみました
SpriteKit には協力な物理エンジンが備わっておりデフォルトで簡単に使用することができます
今回は物理エンジン (SKPhysicsBody) を使って SKNode に重力を与えてみました
環境
- macOS X 10.12.6
- Xcode 8.3.3 (8E3004b)
SKNode を配置する
GameScene.sks を編集しましょう
前回から以下のような感じで SKNode を配置しましょう
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 です
最後に
SpriteKit の物理エンジンを使ってみました
ノードを取得してプロパティに SKPhysicsBody を設定するだけなので非常に簡単です
物理エンジンの当たり判定 (Body Type) や衝突後の動きの変更などいろいろなカスタマイズもできるので試してみると良いと思います
設定は .sks だけでできるものも多いです
0 件のコメント:
コメントを投稿