【Swift】SpriteKitの使い方。物理エンジンを使ってノードに重力をかける。(Swift 2.2、XCode 7.3)

2020年6月16日

物理エンジンとは

本記事ではSpriteKitの機能の物理エンジンについて説明する。

物理エンジンとは、ノードに重力加速度や衝突などの物理現象を発生させる機能である。この機能を使うと、現実世界と同じようような物理運動をするノードを表現できる。

ボールがぶつかる

 

ノードを落下させる

実際に物理エンジンを使ってノードを画面下に落としてみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。
⇒「テスト用プロジェクト

以下のコードは変更前のTestScene.swift。

TestSceneが現在シーンになったら、背景と鳥2匹のノードをシーンに設定している。

 

テスト開始前

 

TestScene.swiftに以下のメソッドを追加する。

ノードにSKPhysicsBodyのインスタンスを設定するだけで、そのノードは重力を受ける物体として落下し始める。引数には、物体の領域を指定するための画像とサイズを与えている。

 

以下は実際のプレイ動画

タップしたノードを落下させる

ちなみに、物理エンジンとは関係ないが、タップしたノードに物理ボディを設定するには以下のようにする。

 

以下は実際のプレイ動画

 

画面外に落ちていかないようにする

先ほどの例では、ノードは画面下端を通りぬけてそのまま落ちていく。画面端から物体を出ていかないようにしたい場合は以下のコードをdidMoveToViewメソッドに追加する。

画面端を物体の領域とする物理ボディをシーンに設定した。

 

以下は実際のプレイ動画。

 

もちろん、以下コードのように枠のサイズを指定すれば任意の場所を壁にできる。

 

以下は実際のプレイ動画

 

地面用のノードを追加する

地面用のノードを追加して落下するノードが落ちないようにしてもいい。その際、地面用のノードが落下してしまわないように、ノードのdynamicプロパティをfalseにすること。

具体的にはdidMoveToViewメソッドを以下のコードのように変更する。

 

以下は実際のプレイ動画

 

重力の方向や加速度を変更する

重力の方向や加速の大きさは画面下方向だけではなく、gravityプロパティの値を変更すれば方向も加速度も自由に変更できる。デフォルトはX方向「0」、Y方向「-9.8」に設定されている。高校の授業で習ったg(9.8m/s^2)だ。

例えば、画面左方向に重力をかけたい場合は以下のコードになる。

 

以下は実際のプレイ動画。左に落ちていった。重力加速度で飛行する鳥。。夢のような世界だ。