読者です 読者をやめる 読者になる 読者になる

世界が変わったのだから、自分も変わらなくてはならない。

エンジニア兼デザイナーのナカモリのブログです。

【Swift】重力を適用させる簡単な方法

アプリ制作 Swift

f:id:takahironakamori:20160310224211p:plain

(本人がいうのもなんですが、上の画像って何がいいたいのかわかりにくいなぁ。)

今日は、Swift 2で重力を適用させるにはどうすればいいのかを考えました。

前提として、

  • オレンジが重力の影響を受けて上から落ちてきます。
  • 男の子は重力の影響は受けません(理由は置いておいて)。
  • 男の子に当たったオレンジはちょっと弾んだり、それっぽく動きます。

これを実装します。

落下らしさを表現するには

落下らしさを表現するには、下方向への移動だけでは重力っぽさはでません。重力っぽさを表現するには、一定の速度で移動するのではなく、下方向へどんどん加速していく必要があります。

物体を加速させるには、物体の速度を管理する必要があります。

したがって、

 ySpeed(物体の下向きの速度) += acceleration(加速度)
 yPosition(物体のY座標) -= ySpeed

という感じに、速度とY座標を別の変数で処理します。

衝突判定を含めて考えると、実装がなんだか大変そうです。

Swiftだと重力を簡単に適用することができます

Swift(2.1)のSpriteKitには簡単に重力を適用することができます。

上のような速度とY座標を変数で管理して…は必要ありませんでした。

関連する部分だけ記載したコードは下記のとおりです。

重力を適用させる

【11行目】
シーンに下方向の重力をベクトルで指定します。SpriteKitではY座標は上方向が正なので、下に落とす場合はY方向へ負の数値を指定します。

【19行目】
sampleSKSpriteNodeのphysicsBodyプロパティにSKPhysicsBodyオブジェクトをsampleSKSpriteNodeのテクスチャ(texture)を指定して追加します。テクスチャを指定することで、テクスチャの透明部分を無視してくれます。

【23行目】
重力の影響を受けなくするには、physicsBodyのdynamicプロパティを false にします。例えば、今回の前提では男の子は影響を受けないようにしたいのでfalseにします。

実際に試してみたのが下の動画です。


Swift2.1で重力を表現する

男の子に当たったオレンジは少し跳ねますが、重力が適用されているので引き続き下へ落ちていきます。

複雑なケースはまだ試していませんが、SwiftのSpriteKitの物理シミュレーションは簡単にいろいろなことができそうです。