【Swift】SpriteKitの使い方。2つの物理ボディをくっつけたり、ピンやヒモで結合する。(Swift 3.0、XCode 8.0)

2020年6月16日

SKPhysicsJointとは

本記事ではSKPhysicsJoint(以下、物理ジョイント)について説明する。

物理ジョイントとは、異なる物理ボディ同士をくっつけるクラスである。固定、ピン、ヒモ、バネなどくっつける方法は複数ある。

 

物理ジョイントを試してみる

実際に物理ジョイントを使って物理ボディをくっつけてみよう。

以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備では2本の丸太をシーンに配置し、ドラッグで運べるようにしておいた。

 

以下のコードは変更前のソースコード。

 

固定する (SKPhysicsJointFixed)

物理ボディを接着剤でくっつけたのように固定する。

didMoveメソッドに以下のコードを追加する。

 

引数で指定するアンカーポイントには丸太と丸太のちょうど真ん中を指定した。しかし、固定の場合はアンカーポイントをどこにしようと動きは同じになる。

固定するために物理ボディ同士を接触させる必要は無い。接触していなくても透明の棒で繋げたかのように物理ボディは固定される。
アンカーポイント

 

以下は実際のプレイ動画。ノードは平行移動するのではなく、くっついている物理ボディの影響を受けて角度が変わる。

検証では画面端に物理ボディの壁を設置している。壁にぶつかると物理ボディがくっついて離れなくなるのが気になる。

ピンで結合する (SKPhysicsJointPin)

物理ボディと物理ボディをピンをつけて結合し、関節のように回転できる状態で結合する。

didMoveメソッドの物理ジョイント作成箇所を以下のコードに変更する。

 

アンカーポイントは先ほどと同じように丸太と丸太の間にしている。ピンの場合はアンカーポイントが関節部のようになって物理ボディ同士に角度をつけれるようになる。

Pinのアンカーポイント

 

以下は実際のプレイ動画

 

物理ジョイントのプロパティを変更することで回転の抵抗や最小、最大角度を設定することができる。

以下のコードは最小角度を30度、最大角度を90度に設定したコード。

 

以下は実際のプレイ動画。30度〜90度以外の角度を維持できなくなった。

ヒモで結ぶ (SKPhysicsJointLimit)

物理ボディと物理ボディを紐で結んだように結合する。

didMoveメソッドの物理ジョイント作成箇所を以下のコードに変更する。

 

以下は実際のプレイ動画。丸太をドラッグしたとき、プレイ開始時の丸太間の距離より大きくなると、他の丸太が引きずられてついてくる。丸太同士がぶつからなくなるのが残念だ(Swift 3.0)。

 

動きが分かりづらいので、丸太間に線を描画してみよう。

TestScene.swiftを以下のコードに変更する。変更箇所は青色箇所。

 

下図のように丸太の子に空ノードを配置し、空ノードと空ノードの間に線を引いた。

丸太のアンカーポイントを丸太の端に移動してアンカーポイント間に線を引くと丸太が回らなくなってしまうためこの方法をとっている。空ノードを使わずに、計算などを使った上手い方法があるような気がする。

丸太と丸太に線を引く

 

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

 

maxLengthプロパティで丸太間の最大距離を設定できる。設定しない場合は、プレイ開始時の丸太間の距離が最大距離になる。

 

以下は実際のプレイ動画。150ポイント以上離れたら丸太がついてくるようになった。