アクションゲームでは通常のジャンプだけでなくジャンプ台を設置してより高くより遠くへジャンプできるような道具を採用しているゲームもいくつかあると思います。
今回はこのジャンプ台をテーマにしてプログラムをつくってみたいと思います。
ネタ明かしをするとこれは1度目のジャンプ中にもう1度ジャンプさせることと同じことになるので、2段ジャンプにも応用できます。
ちなみに、過去に『スーパーマリオ風カメを踏んづけて甲羅を蹴る方法』というタイトルの記事で解説したプログラムも同じ手法を使っています。
この記事を読んでいただくと、アクションゲームでキャラクターがジャンプ台を使って高く遠くへジャンプするプログラミングの方法が分かります。
なお、この記事で使用しているスプライト(キャラクター・背景・オブジェクト・音声など)はすべてパブリックドメインの無料の素材をダウンロードして使用しています。
完成品
この章の内容をご自身のScratch環境に反映すれば、同じ動きを再現することができます。
完成した動き
左右の矢印キーを押すと主人公(キャラクター)がそれぞれの方向に移動、上向き矢印キーでジャンプします。
ジャンプ台が5台あり、それぞれバネのちからが異なっています。
一番左のジャンプ台のバネが最も弱く、右へ行くほど強い力が発生するようになっています。もちろん強い力のジャンプ台ほど高くジャンプすることができます。
使用したスプライト
スプライトは「キャラ1」「地面1」「背景1」「ジャンプ台」の4つです。
アクションゲーム用の背景・キャラクター・アイテム等の画像や音声は、パブリックドメインである「スーパーパワーアセットパック(CC0)のprehistoric-platformer」を使っています。
「キャラ1・地面1・背景1」スプライトについては、こちらの記事の「使用したスプライト」の章で詳しく説明していますので参照してください。↓↓↓
【Scratch 3.0】アクションゲーム ジャンプと地面にめり込まないように着地する方法(Tips)
【ジャンプ台のスプライト】
「ジャンプ台」スプライトは、コスチューム画面で自分で描いたものです。
バネの縮むところをアニメーションで表現するため、3パターンつくりました。
ご自身で作成しても良いですが、こちらからダウンロードして使ってもらってもOKです。↓↓↓
完成したスクリプト
完成したスクリプトの全体です。
【キャラ1のスクリプト】
今回のテーマである「ジャンプ台」のためにポイントとなるブロックに赤枠をつけています。
【地面1のスクリプト】
【背景1のスクリプト】
【ジャンプ台のスクリプト】
スクリプトの作り方
ここからはプログラムを作っていく中でポイントとなる部分を説明します。
ポイント①:ジャンプ台のクローンごとに異なる変数の値を持たせる
まず「ジャンプ台」を5台並べるために5つのクローンをつくります。
ジャンプ台のそれぞれのクローンには、ジャンプ台ごとに別々の「バネのちから」を持たせたいわけです。このときに必要となるのがプライベート変数です。
プライベート変数は「このスプライトのみ」にチェックを入れて変数をつくることで出来上がります。ここでは「バネのちからprivate」という名前でつくっています。
このプライベート変数に値を設定してからクローンをつくると、そのクローンはプライベート変数の値を持った状態でつくられます。つまり、プライベート変数の値を変化させれば、その変化した値を持ったままクローンがつくられるということです。
上のスクリプトを実行すると、それぞれのジャンプ台クローンが変数に持っている値は[5, 10, 15, 20, 25]となり、具体的には下の図のようになります。
ポイント②:キャラクターとジャンプ台の当たり判定をつくる
ジャンプ台をつくったら次にキャラクター(主人公)がジャンプ台に飛び乗ったときの当たり判定をつくります。この部分は「キャラ1」スプライトにプログラムを組んでいきます。
キャラクターのジャンプのやり方や足場の当たり判定については過去の記事で説明済みなのでここでは省略します。気にある方はこちらの記事などを参照してください。↓↓↓
【Scratch 3.0】アクションゲーム ジャンプしながら移動する方法(Tips)
【Scratch 3.0】アクションゲーム ブロックで足場や壁の作り方【当たり判定の方法】(Tips)
主人公が「もし(ジャンプ台に触れた)かつ(コスチュームの名前=”egg-shell_15”)なら」のときに「ジャンプ台を踏んだ」変数を1にしています。
ジャンプ台を踏んだかどうかを今後いろんな場面で使う可能性があるので、「ジャンプ台を踏んだ」変数の値で判断できるようにしています(0:踏んでない、1:踏んだ)。
【補足】もし「ジャンプ台に触れた」だけを条件にしてしまうと、ジャンプ台に横から当たったときも動いてしまいます。これを避けるためにもう1つの条件、主人公が落下中のコスチューム(egg-shell_15)を条件に追加しています。ちなみにコスチューム名「egg-shell_15」は下の画像です。
ポイント③:ジャンプ台クローンごとの変数の値に応じたジャンプをさせる
ポイント②で当たり判定ができたので、あとはジャンプ台でジャンプさせる部分のプログラムをつくっていきます。
まずは「ジャンプ台」スプライト側のプログラムをつくります。
ここが勘違いしやすい重要ポイントだと思いますが、ジャンプ台はクローンが表示されています。そのクローンに対してプログラムを行いたいはずなので、その場合は必ず「クローンされたとき」の下にブロックをつなげてあげないとクローン単位のコントロールはできません。
「クローンされたとき」の下に「ずっと」ブロックをつないで、その中に必要な条件を組み込んでいきます。
もし「キャラ1」スプライトに触れたら、「バネのちからpublic(すべてのスプライト用)」変数に「バネのちからprivate(このスプライトのみ)」値をセットします。
「このスプライトのみ」で作った変数をプライベート変数と呼ぶのに対して、「すべてのスプライト用」で作った変数をパブリック変数と呼びます。パブリック変数は複数のスプライト間で読み書きが可能な変数です。
こうすることで「ジャンプ台」スプライト側でセットされた「バネのちからpublic」変数の値を「キャラ1」スプライト側で読み取って使うようにします。
変数に値をセットした後は、コスチュームを切り替えてジャンプ台の伸び縮みをアニメーション表示させています。
「ジャンプ台」スプライト側で「バネのちからpublic」変数に値がセットされたので、「キャラ1」スプライト側の「もし(ジャンプ台を踏んだ=1)なら」ブロックの中でそれを読み取って「ジャンプ力」変数に入れ直します。そのうえで「着地するまで」定義ブロックを実行します。
もともと「着地するまで」定義ブロックのプログラムの中で再度「着地するまで」定義ブロックを実行しています。このように自分(着地するまで)の中で自分自身を呼び出すプログラムのことを「再帰プログラム」と言います。
難しそうに感じますが、あまり恐れることなく一手ずつ読み取っていけば問題ありません。
この「着地するまで」定義ブロックの中に「y座標を(ジャンプ力)ずつ変える」ブロックがあります。ここで使われる「ジャンプ力」変数の値が先ほどの「バネのちからpublic」変数の値に置き換わって実行されるだけです。
先ほどは説明しませんでしたが、「もし(ジャンプ台を踏んだ=1)なら」の中で「ジャンプ台を踏んだ」変数の値を0に戻しています。
すると、主人公が次にジャンプ台に触れるまで(1に変わるまで)は「もし~なら」ブロックはスキップするので実行されなくなります。つまり、ジャンプ台に触れた瞬間だけ「ジャンプ力」変数の中身が置き換わるという流れになっています。
ここまでのポイントを押さえれば、アクションゲームでキャラクターがジャンプ台を使って高く遠くへジャンプするスクリプトを完成させることができると思います。
失敗しやすいポイント
「バネのちからprivate」変数(このスプライトのみ)と「バネのちからpublic」変数(すべてのスプライト用)をきちんと使い分けることに注意が必要です。
変数をつくるときの「このスプライトのみ」と「すべてのスプライト用」の違いをしっかりと理解しておけば、クローンを扱うプログラムも自由につくれるようになると思います。
クローン別の変数の値を扱う基本的な概念や方法についてはこちらの記事で紹介しています。参考にしてみてください。↓↓↓
応用編
ジャンプ力が強いとステージの上辺に当たってしまいます。そんなときは背景のたてスクロールのプログラムを組み込むと高さの制限なくどんな高いジャンプでも表現することができるようになります。
ちょっと雑な作りになってますが。。。(つд⊂)
まとめ
さいごに、今回の記事で説明した『アクションゲームでキャラクターがジャンプ台を使って高く遠くへジャンプするプログラミング』のポイントをまとめます。
- ポイント①:ジャンプ台のクローンごとに異なる変数の値を持たせる
- ポイント②:キャラクターとジャンプ台の当たり判定をつくる
- ポイント③:ジャンプ台クローンごとの変数の値に応じたジャンプをさせる
今回のような再帰プログラムは、ジャンプであれば2段ジャンプでも使えますし下記の記事でも使っています。また、フラクタル図形を描くときにも使えます。
というのも、同じ動きを繰り返しおこないたいけれど、強さとか長さとか色とかのパラメータを変えたいときに再帰プログラムは使える、というのが基本的な認識です。覚えておくと意外と役に立つ場面があるかもしれません。
再帰プログラムの他の記事例↓↓↓
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)