【Swift】SpriteKitの使い方。2つの物理ボディをくっつけたり、ピンやヒモで結合する。【Swift】SpriteKitの使い方。2つの物理ボディをくっつけたり、ピンやヒモで結合する。2020年6月16日SKPhysicsJointとは本記事ではSKPhysicsJoint(以下、物理ジョイント)について説明する。物理ジョイントとは、異なる物理ボディ同士をくっつけるクラスである。固定、ピン、ヒモ、バネなどくっつける方法は複数ある。物理ジョイントを試してみる実際に物理ジョイントを使って物理ボディをくっつけてみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。事前準備では2本の丸太をシーンに配置し、ドラッグで運べるようにしておいた。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/10/spritekit_physics_joints_before_movie.mp4以下のコードは変更前のソースコード。//SKSファイルに配置した丸太ノードを取得する。//タッチしたノードを取得する。//タッチしたノードが丸太の場合、ターゲットノードに設定する。//タッチした座標を取得する。//ターゲットノードをタッチした座標まで移動するアクションを実行する。{//SKSファイルに配置した丸太ノードを取得する。{//タッチしたノードを取得する。SKSpriteNode//タッチしたノードが丸太の場合、ターゲットノードに設定する。{//タッチした座標を取得する。self)//ターゲットノードをタッチした座標まで移動するアクションを実行する。(SKPhysicsJointFixed)物理ボディを接着剤でくっつけたのように固定する。didMoveメソッドに以下のコードを追加する。//物理ジョインを作成する。//物理ジョインを追加する。{..省略..//物理ジョインを作成する。maruta1.frame.midY))//物理ジョインを追加する。self.physicsWorld.add(joint)}引数で指定するアンカーポイントには丸太と丸太のちょうど真ん中を指定した。固定の場合はアンカーポイントをどこにしようと動きは同じになる。固定するために物理ボディ同士を接触させる必要は無い。接触していなくても透明の棒で繋げたかのように物理ボディは固定される。以下は実際のプレイ動画。ノードは平行移動するのではなく、くっついている物理ボディの影響を受けて角度が変わる。検証では画面端に物理ボディの壁を設置している。壁にぶつかると物理ボディがくっついて離れなくなるのが気になる。(SKPhysicsJointPin)物理ボディと物理ボディをピンをつけて結合し、関節のように回転できる状態で結合する。didMoveメソッドの物理ジョイント作成箇所を以下のコードに変更する。//物理ジョインを作成する。//物理ジョインを追加する。{..省略..//物理ジョインを作成する。maruta1.frame.midY))//物理ジョインを追加する。self.physicsWorld.add(joint)}アンカーポイントは先ほどと同じように丸太と丸太の間にしている。ピンの場合はアンカーポイントが関節部のようになって物理ボディ同士に角度をつけれるようになる。以下は実際のプレイ動画https://hajihaji-lemon.com/apli/wp-content/uploads/2016/10/spritekit_joint_pin_movie.mp4物理ジョイントのプロパティを変更することで回転の抵抗や最小、最大角度を設定することができる。以下のコードは最小角度を30度、最大角度を90度に設定したコード。//回転の抵抗を設定する。//最小角度を30度に設定する。//最大角度を90度に設定する。//回転角度の制限を有効にする。{..省略..//回転の抵抗を設定する。0.5//最小角度を30度に設定する。0.5//最大角度を90度に設定する。CGFloat(M_PI_2)//回転角度の制限を有効にする。true}以下は実際のプレイ動画。30度〜90度以外の角度を維持できなくなった。(SKPhysicsJointLimit)物理ボディと物理ボディを紐で結んだように結合する。didMoveメソッドの物理ジョイント作成箇所を以下のコードに変更する。//物理ジョインを作成する。//物理ジョインを追加する。{..省略..//物理ジョインを作成する。maruta2.frame.midY))//物理ジョインを追加する。self.physicsWorld.add(joint)}以下は実際のプレイ動画。丸太をドラッグしたとき、プレイ開始時の丸太間の距離より大きくなると、他の丸太が引きずられてついてくる。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/10/spritekit_joint_limit_movie.mp4動きが分かりづらいので、丸太間に線を描画してみよう。TestScene.swiftを以下のコードに変更する。//SKSファイルに配置した丸太ノードを取得する。//物理ジョインを作成する。//物理ジョインを追加する。//図形ノードを作成する。//図形ノードを子ノードに追加する。//タッチしたノードを取得する。//タッチしたノードが丸太の場合、ターゲットノードに設定する。//タッチした座標を取得する。//ターゲットノードをタッチした座標まで移動するアクションを実行する。//丸太に配置した空ノードを取得する。//空ノードの座標をシーンを基準にしたものに変換する。//線を引くパスを設定する。//線の描画を更新する。{//SKSファイルに配置した丸太ノードを取得する。maruta1//物理ジョインを作成する。maruta2.frame.midY))//物理ジョインを追加する。self.physicsWorld.add(joint)//図形ノードを作成する。5//図形ノードを子ノードに追加する。{//タッチしたノードを取得する。SKSpriteNode//タッチしたノードが丸太の場合、ターゲットノードに設定する。{//タッチした座標を取得する。self)//ターゲットノードをタッチした座標まで移動するアクションを実行する。{//パスを作成する。CGMutablePath()//丸太に配置した空ノードを取得する。"//linepoint2")//空ノードの座標をシーンを基準にしたものに変換する。linePoint2!)//線を引くパスを設定する。position2.y))//線の描画を更新する。path}}下図のように丸太の子に空ノードを配置し、空ノードと空ノードの間に線を引いた。丸太のアンカーポイントを丸太の端に移動してアンカーポイント間に線を引くと丸太が回らなくなってしまうためこの方法をとっている。空ノードを使わずに、計算などを使った上手い方法があるような気がする。以下は実際のプレイ動画。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/10/spritekit_joint_limit_line_movie.mp4maxLengthプロパティで丸太間の最大距離を設定できる。設定しない場合は、プレイ開始時の丸太間の距離が最大距離になる。Swift//物理ボディ間の最大距離を設定する。150123//物理ボディ間の最大距離を設定する。150以下は実際のプレイ動画。150ポイント以上離れたら丸太がついてくるようになった。【Swift】SpriteKitの使い方。ゴムで引っ張ってボールを飛ばすような動きを作る。...【Swift】Spritekitの使い方。衝突した位置にパーティクルを放出する。...【Swift】SpriteKitの使い方。SKTileMapNodeで碁盤の目にタイルを配置してマップを作成する。...【Swift】SpriteKitの使い方。SKTileDefinitionを使ってタイルの画像を反転、回転したり、パラパラアニメのように切り替える。コメントをキャンセルメールアドレスが公開されることはありません。