Entry: main  << >>
Swing Slingshotの実装に使用した物理演算について
0
    皆さんこんにちは。noppikinattaです。
    Flashゲーム Swing Slingshot を遊んでいただいてありがとうございます。
    多くのレスポンスをいただき嬉しく思っています。

    このゲームは私がActionScript3で組んだ初めての作品です。
    今回は習作ということで、ゼロの状態から手探りで作っていきました。
    (公開はあほげー作品のほうが先ですが、作り始めたのはこっちが先です。)
    ソースコードを公開する前にもうちょっと綺麗な感じにリファクタリングしようかとも思ったのですが、
    せっかくなので、ソースと一緒に実装に関する記事を残して思い出にします。

    今回は星の動きについて。


    星の動作は、スイングバイの動きを実現するために、星が月に引かれる重力加速度の計算を行っています。
    座標を直接操作するよりも、各星オブジェクト(ソースコード内のStarクラス)に速度のパラメータをもたせ、
    毎フレーム算出される重力加速度で速度を調整するほうが、手間をかけずにそれっぽい動きになりました。

    重力加速度の算出は、
    大きさの算出→xy成分への分割
    という手順で行っています。


    1.重力加速度の大きさを求める

    重力加速度の大きさ

    重力加速度の大きさは上の式で表現することができます。
    月と星の距離によって変化する重力加速度をこの式を利用して算出しています。

    分子の万有引力定数 * 質量は、変化させる必要がないので月オブジェクト(Moonクラス)にgravityBaseメンバとして定義しています。
    ActionScript3では、2点間の距離はPoint.distanceメソッドで取得できます。分母の値はこれで算出します。

    余談ですが、月と星の距離が一定の値よりも大きくなったときは、重力加速度が0であるとして計算を終了しています。
    フィールドの全体に重力が及ぶと、星が全然床に落ちないという現象が発生したのでそうなりました。
    Moon.gravityRadiusプロパティの値を調整すると、現象が再現されます。



    2.重力加速度をxy成分に分割する

    重力加速度の成分分割

    一般的な横スクロールアクションゲームで重力加速度が存在する場合は、その方向は下で一定です。
    今回のゲームでは、重力加速度を月の方向に向いたベクトルの形にしなければ、星がその方向に運動してくれません。

    月と星の座標は得ているので、x座標の差とy座標の差の比から、重力加速度をx方向とy方向に分割します。
    得た値を星オブジェクトに渡し、加速度を星の速度に加算し、星を動かしています。


    簡単ですが今回はこのぐらいで終わります。
    記事にしてみると思ったよりも何もなくてつまらんですね。
    次回は描画について書きます。
    | noppikinatta | 21:47 | comments(0) | trackbacks(0) | - | - |
    Comment








    Trackback