あさちゅんのゲームブログスマートフォン用の表示で見るあさちゅんのゲームブログUnityやSiv3Dに関するゲーム開発メモを残していきますこの広告は、90日以上更新していないブログに表示しています。C++Siv3Dで横スクロールゲームを作るの最終回です。横スクロールゲームを完成させ、改良案とそのために学ばないといけない技術について触れようと思います。俯瞰視点のゲームで画面上のキャラクターに指をあてると、ゲーム内でどれだけ動こうが実はキャラクターは画面の中心にいることがわかります。(ステージの端だとまた別ですが)なので、基本的な考えとしてはキャラクターは常に画面の中心に置き、それ以外のオブジェクトを逆向きに動かすことで実現できます。本当に逆向きに動かしてると訳がわからなくなってくるので、座標の上では画面外まで動かし、描画する時だけプレイヤーが画面の中心になるように引っ張ってきます。0)、つまり画面左上に固定します。プレイヤーの描画から見ていきます。0)に固定したいので、実際に指定する座標はその左上です。描画に使用していませんが、画面中心に固定しているのでそれで正しいです。次にブロックの描画を見てみます。movedBy関数は引数に指定されただけ動かしたRectFを返す関数です。今回はプレイヤーの動く向きの逆に動かしたいので、座標にマイナスを付けた値だけ動かします。そのために、ブロックからプレイヤーの座標を知る必要があるので、PlayerクラスにgetPos関数、BlockクラスにsetPlayerPos関数を用意します。ここで注意してほしいのが、moveBy関数ではなくmovedBy関数を用いることです。moveBy関数はmovedBy関数と違ってもとのRectFを変更します。今回はもとのデータは変更せずに、描画する時だけ動かしたいのでmovedBy関数を使用します。実行してみると、画面左上にキャラを固定してスクロールさせているので、見事にどれだけ動かしてもSiv3D君が見えません。スクロールが実装できたのがわかると思います。キャラを画面中心に固定する流石にこれは鬼畜ゲー過ぎるので、わかりやすく画面中心に固定します。言っても、実はここまで来れば一発です。Window::Center関数で画面の中心の座標を取得できます。0)に固定するために指定した座標にWindow::Center関数の値を足すだけで画面の中心にSiv3D君が現れます。まとめと改良案3回に渡り、長々とお付き合いいただきありがとうございました!せっかくなので、このサンプルの改良案とその技術について触れようと思います。個人的に上に書いたもの程、簡単に実装できると思います。ゲームオーバーの実装プレイヤーのy座標が一定を超える(下に落ち過ぎる)とアプリを終了する等で実現できます。速度を実装するサンプルは移動分をそのまま座標に足していますが、新たにメンバ変数として速度を作り、毎ループ座標に速度を加える設計にして、キーボードの入力や重力を速度に加えるようにすれば、加速度などを実装できるようになります。キャラの向きを変えるキャラの画像を向きによって複数用意し、進行方向によって描画する画像を切り替えると、よりゲームっぽくなります。下以外の当たり判定を実装するサンプルは下方向のみに当たり判定があるので、それを上下左右に適応し、衝突した方向の速度を0にすることで実装できます。乗ると落ちるブロックを作るプレイヤーが乗ったのを検知したら、ブロック側のupdate関数内でプレイヤーを落とす時と同じ処理をすれば実装できます。ブロックを削除できるようにするブロックにメンバ変数として死亡フラグを持たせ、Siv3DのErase_if関数と組み合わせることにより実装できます。アイテムを実装する基本的にはブロックと同じで、プレイヤーが触れたら消えて、何かの効果を発揮するようにすれば実装できます。シーン管理をする実際のゲームはタイトル画面やリザルト画面などがゲーム画面以外にも存在し、それらが切り替わっていると思います。HamFrameworkのSceneManagerに対応させると、簡単にそれらが実装できます。ポーズを実装するこちらの記事で紹介しています。複数のクラスをまとめて扱う今はPlayerとBlockだけでしたが、今後たくさんのクラスを実装した時に、その度にArrayを追加するのは大変です。それらをまとめて扱えるようにしましょう。その前に、今はPlayerクラスはcheckGround関数、BlockクラスはsetPlayerPos関数を使用していますが、ポインタや参照を用いることによって、引数で渡していたものをメンバに保存させると、Main関数からこれらの関数を呼ぶ必要がなくなります。なると、PlayerクラスとBlockクラスはupdate関数、draw関数を有しているという共通点が生まれます。これらの関数を有する親クラスを作成、PlayerとBlockはその子クラスとして継承させることができます。後はMain関数にあったArrayをArray<"親クラスのポインタ">とすると一つのArrayで管理することが可能になります。この例の場合は微妙ですが、落ちるブロックと普通のブロックをまとめて扱う等はすごく便利だと思います。おまけコピペで動くSiv3Dです。Studioでつまずいた点まとめ先週、6月26日に10時間ハッカソンに行ってきました。重力とジャンプの実装Siv3Dで横スクロールゲームを作るの第二回です。»プロフィールid:chunchunmorningUnityやSiv3Dに関するゲーム開発メモを残していきます。サーバとはSiv3DのTCP通信で文字列を扱うGoogleVRのGazeInputModuleを扱う月別アーカイブはてなブログをはじめよう!chunchunmorningさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。