あさちゅんのゲームブログ

UnityやSiv3Dに関するゲーム開発メモを残していきます

Siv3Dで横スクロールゲームを作る #2 重力とジャンプの実装

Siv3Dで横スクロールゲームを作るの第二回です。

前回で役者は揃えたので、今回はそれらに動きを与えて一気にゲームとして仕上げてみます。

重力の実装

タイトルは重力の実装ですが、加速度は考えずに等速直線運動で済ませます。

やり方は簡単でPlayerのupdate関数内部でy座標を増やすだけです。update関数は毎ループ呼ばれているので、これでSiv3D君が下に落ちます。

当たり判定の実装

このままだと、無限に落下し続けてしまうのでブロックに当たり判定をつけます。

まずは、Block側に点との重なっているかを判定するintersects関数を作ります。ブロックの当たり判定 = 内部のRectFの当たり判定なので、関数の内容はRectFのintersects関数を呼ぶだけです。

この時注意してほしいのが、関数の後ろにconstがついていることです。これはconstメンバ関数といい、後でconst参照渡しをしたいため付けています。今はわからなくても付けておいてください。

次にPlayer側の当たり判定を実装します。現在、地面と接しているかを表すbool型のm_isGroundedを用意します。そしてメンバ関数としてBlockオブジェクトを受け取り、現在どれかと当たっているか(=地面に接しているか)を確認してm_isGroundedを変更するcheckGround関数を用意します。次にさっきupdate関数内で実装した重力を地面に接していない時だけ適用するように変更します。

これでBlockとPlayerに必要な機能は揃ったので、あとはMain関数のでplayerのupdate関数を呼ぶ前にcheckGround関数を呼んで地面に接しているかを判定すれば完了です。

ジャンプの実装

次にジャンプを実装します。メンバ変数として残りのジャンプ時間を示すint型のm_jumpFrameを用意します。もちろん初期値は0です。そして"キャラクターが地面に接している" かつ "ジャンプ中じゃない" 時にキーが押されるとm_jumpFrameを30に設定します。

あとはupdate関数内部でm_jumpFrameが0じゃない時(=ジャンプ中)の時にy座標を下げて、キャラを上に飛ばし、m_jumpFrameを減らします。update関数は60fpsとすれば一秒間に60回呼ばれるはずなので、30回update関数が呼ばれると0.5秒間上昇します。

まとめ

重力と当たり判定を実装しただけで一気にゲームっぽくなったと思います。次は最後の仕上げに画面のスクロールを作ってみようと思います。

次回

おまけ

前回大まかな枠組みを作ったのでそこに肉付けするだけなのですが、説明の都合上省略が多く、どこに追加したかわかりづらいと思うので、全体を載せておきます。

使用したソフト
Windows 10
Siv3D January 2016
Siv3D-kun, ©2015 Siv3D, licensed under a CC BY-NC: http://creativecommons.org/licenses/by-nc/4.0/