【Scratch 3.0】スーパーマリオ風 マリオジャンプの方法(Tips)

スポンサーリンク
スーパーマリオ風 マリオジャンプの方法_m

アクションゲームやプラットフォームゲームをつくる時にキャラクターをジャンプさせる動きは欠かせません。その時にお手本となるのはやはりスーパーマリオではないでしょうか?

スーパーマリオのジャンプは、Aボタンを短く押すと低くジャンプし長く押すと高くジャンプしたり、上昇するときのスピードと下降するときのスピードが違ったりしていて、意外と複雑に出来ています。

今回は、実は複雑なジャンプをしているスーパーマリオのようにキャラクターをジャンプさせる方法を紹介します。

この記事を読んでいただくと、スーパーマリオ風にキャラクターをジャンプさせるスクリプトの作り方とそのコツが分かります。

プラットフォームゲームとは

プラットフォームゲームとは、ゲームジャンルの1つで『左右移動とジャンプ操作によって足場(プラットフォーム)を飛び移り、足場からの落下や障害物を回避しつつ、目標地点へのゴールを目指す』という種類のゲームのことです。代表的な例としては「スーパーマリオブラザーズ」があります。

スクリプトの作り方

完成した動き

Aボタンの代わりにキーボードの「上向き矢印キー」を使っています。

「上向き矢印キー」を短く押すと低くジャンプして、長く押すと高くジャンプします。また、上昇中と下降中の下向きの力(重力)の強さを変えているのが特徴です。

下降中の方が若干スピードが速くなっているように見えませんか?

スーパーマリオ風 マリオジャンプの方法-GIFアニメ

完成したスクリプト

完成したスクリプトの全体です。スプライトは「ネコ」と「背景」の2つです。

【スプライト】

【ネコのスクリプト】

使っているすべての変数は、「すべてのスプライト用」で作成しています。

変数
  • 上昇時重力:すべてのスプライト用
  • 下降時重力:すべてのスプライト用
  • Yv:すべてのスプライト用

【背景のスクリプト】

背景のスクリプトは、スタート直後の座標を決める部分だけです。

スクリプトの説明

プログラムを作っていく中でポイントとなる部分を説明します。

ポイント①:上昇時と下降時で別々の重力を設定する

ジャンプ中は比較的ゆっくりスピードを緩めて、下降中はすばやく地面に着地させるような動きをつくるために重力を一定にするのではなく、上昇中と下降中で別々の値をつかうことで実現します。

この後で説明しますが、「上向き矢印キー」を押している間は「上昇時重力」変数をつかい、「上向き矢印キー」を離したときに「下降時重力」変数をつかうようにします。

ポイント②:ジャンプ中のY座標を計算する

「上向き矢印キー」が押された瞬間に「Yv」変数(これはジャンプ力を表します)を10に設定します。

そして地面に着地するまでの間、「Y座標をYvずつ変える」でY座標を計算しています。

Yvの計算式は「Yv-上昇時重力(0.5)」なので、Yvの値は次のように変化します。

Yvの値の変化:10 → 9.5 → 9.0 → 8.5 → 8.0 → 7.5 → ・・・

ポイント③:下降中のY座標を計算する

「上向き矢印キー」を押すのを止める(離す)と下の図のスクリプトの処理に入ります。

「もし((上向き矢印キーが押された)ではない)なら」ブロックの部分は、「上向き矢印キーが押されていない状態」を意味しています。

これがあることで上のポイント②で説明したスクリプト部分は逆説的に「上向き矢印キーが押されている間」に実行される条件ということになっています。

このときのYvの計算式は「Yv-下降時重力(1.75)」なので、Yvの値は次のように変化します。

Yvの値の変化:(上向き矢印キーを離した瞬間のYvの値が7.5の場合) → 5.75 → 4.0 → 2.25 → 0.5 → -1.25 → ・・・

ポイント④:「もし~なら」ブロックを正しく組み立てる

「もし~なら」ブロックを組み込む位置はコツのいるところかと思います。

下図の①の処理はキャラクターがゆっくり上昇してゆっくり下降する部分です。

この処理中に上向き矢印キーが離されたかどうかを「もし(上向き矢印キーが押されたではない)なら」ブロックでずっとチェックし続けています。

もしこの条件にマッチしたら、下図の②の処理を実行するようになっています。

このようにブロックを組み立てないと、上昇中や下降中にスピードを変化させることができません。

ここまでのポイントを押さえてスクリプトを組むことが出来たら、マリオジャンプのプログラムは完成です!

失敗しやすいポイント

もしかすると「もし~なら、でなければ」ブロックを使えば出来そうだ、と考えてしまうかもしれませんがこれでは上手くいきません。

これは2つの条件が並列になっているため、片方の条件が満たされていない時は必ずもう片方の条件が満たされているという意味になります。

下のスクリプトの例では、上向き矢印キーが押されていない間はずっと「でなければ」内の処理を実行し続ける形になっています。

このスクリプトを実行すると下の図(アニメーション)のように上向き矢印キーを押すとジャンプはしますが、その時の速さ(条件)は一定になります。(※今回実現したいこととは違う動きです)

スーパーマリオ風 マリオジャンプの方法-失敗-GIFアニメ

応用編

今回応用編は特にありません。

別の記事で「スーパーマリオのBダッシュ」のやり方も紹介していますので合わせて参考にしてみてください。

まとめ

さいごに、今回の記事で説明した『スーパーマリオ風にキャラクターをジャンプさせるスクリプトの作り方』のポイントをまとめます。

  • ポイント①:上昇時と下降時で別々の重力を設定する
  • ポイント②:ジャンプ中のY座標を計算する
  • ポイント③:下降中のY座標を計算する
  • ポイント④:「もし~なら」ブロックを正しく組み立てる

キャラクターのジャンプのさせ方は、実にさまざまな方法があります。単純なジャンプ、重力ジャンプ、2段ジャンプなど。

それ以外に地面に着地する際のバウンドのさせ方や壁の側面に触れた時の動きの作り方にも違いがあったり、ゲームの難易度やシナリオに合わせて使い分けられるようにしたいところです。

今回説明したスーパーマリオ風のジャンプのさせ方は、わりと基本的なジャンプの部類だと思います。ぜひここから発展させてオリジナルのジャンプの型を作ってみてください。

どうでしたか?上手くできたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)

この記事が『よかった/役に立った』と思ったら、左下のGoodボタンを押していただけると嬉しいです。

タイトルとURLをコピーしました