014_mov_と_movies

ジャンル別ゲームの作り方 (ラン&ジャンプ系)

今回はラン&ジャンプ系ゲームの作り方を紹介します。
手順としては以下の通りです。

1. プレイヤーを表示する。重力で落下させる
2. 床を表示する。プレイヤーが床の上に乗れるようにする
3. プレイヤーの横移動を実装する。それに追従して画面をスクロールさせる
4. 床を動的に生成する。当たり判定が正しくできているかを確認する
5. 画面外に落下したらゲームオーバー
6. 一定ラインを超えたらゲームクリア

■1. プレイヤーを表示する。重力で落下させる

まずはプレイヤーを表示して重力で落下させます。

重力の扱いを理解していれば、特に難しくないと思います。

■2. 床を表示する。プレイヤーが床の上に乗れるようにする

床を表示して、プレイヤーがその上に乗れるようにします。

判定は「上からの当たり判定のみ有効にする」という方法で実装できます。

ジャンプも実装して、ちゃんとジャンプ後に着地できるか確認しておきましょう。

■3. プレイヤーの横移動を実装する。それに追従して画面をスクロールさせる

プレイヤーが横に移動し続けるようにします。そして、その動きに追従して、画面をスクロールさせます。

スクロールの考え方としては、「ワールド座標系」「スクリーン座標系」という2つの座標系の考え方を理解することです。

* ワールド座標系:各オブジェクトが実際に存在する座標
* スクリーン座標系:画面内に表示する座標

計算方法ですが、例えば、ワールド座標としてはプレイヤーをどんどん右に移動させて、プレイヤーの位置を 500px に移動したとします。
ただ、画面上では、プレイヤーは 80px の位置に表示させたいとします。
そうすると、スクリーン座標の左側は 500 - 80 = 420px にズラす必要があります。この値を元にプレイヤーだけでなく、床オブジェクトも実際の座標から 420px ズラすとスクロールが実装できます。

この考え方を実装することが難しい場合は、ひとまず床そのものを動かす、という方法もありです。その場合は、プレイヤーが右へ移動する処理は不要となります。

■4. 床を動的に生成する。当たり判定が正しくできているかを確認する

床をプログラムから自動生成するようにします。ひとまず上記画面のようにランダムな位置に出現するようにしても良いです。
このときに、当たり判定が正常にできているかを確認します。上の画面のようにプレイヤーが空中に浮いてしまったりしないようにします。

ちなみに私がこのサンプルを作るときにハマって空中浮遊してしまった原因は、

プレイヤーの当たり判定が大きすぎて、上側の接触でも接地判定としていると推測しました。実際にこれも原因の1つだったのですが、この修正では解消せず、1時間ほど悩んだところ……、

床のコリジョンサイズを間違えるという痛恨のミスをしていました。プレイヤーの当たり判定を足元のみにする修正だけではうまくいかないわけです。
思い込みで調査するのは危険、ということを改めて思い知りました……

■5. 画面外に落下したらゲームオーバー

プレイヤーのY座標が画面外に移動したら、プレイヤーを消滅させるなどしてゲームオーバー表示をします。

■6. 一定ラインを超えたらゲームクリア

プレイヤーの移動距離が一定を超えたらゲームクリアとします。上記画面ではゴールオブジェクトに接触したらクリアとしていますが、簡単にできそうな方法で問題ありません。

■補足:床オブジェクト出現のアルゴリズムについて

床オブジェクト出現のアルゴリズムについて補足します。
出現タイミングは、床オブジェクトの横幅以上のスクロールが発生したときです。例えば、床オブジェクトの横幅が 32px の場合、前回床オブジェクトが出現した時よりも 32px 画面が動いていたら、出現判定を行うようにします。

また、極端にランダムな高さで出現させると、プレイヤーがジャンプで飛び移れなくなるので注意です。
方法としては、前回出現させた床のY座標を覚えておいて、その値から例えば±128px 以内の位置に出現させる(最大のジャンプ力を考慮します)、とすると無理がない位置に出現させることが可能となります。

それと同じ考え方で、同じ高さに連続して出現させる場合は、前回の高さそのままで出現させるようにします。

■ゲームを拡張する

ラン&ジャンプ系ゲームはスマートフォン向けのゲームジャンルとして人気なので、それらを参考に、色々なアクションを追加していくのも楽しいと思います。
例えば、ジャンプ中にタップすると2段ジャンプしたりや長押しで滑空など……。

少し難易度は高いかもしれませんが、BIT.TRIP RUNNER のように音楽と同期するアクションにするのも良いですね。

◾️関連する記事

ラン&ジャンプ系で、サイドビューのアクションゲームの作り方を理解したら、次はもう少し複雑なアクションゲームに挑戦しても良いかもしれません。

この記事が気に入ったらサポートをしてみませんか?