スクラッチコーチキャンプ ゲームクリエイターに、オレはなる!そんなキミを応援(子供も大人も)
  • ALL
  • はじめての方へ
  • スクラッチゲームの作り方

    スクラッチでマリオのゲームを作る特大レッスン#08 敵モブを召喚せよ2

    スクラッチでマリオのゲームを作る特大レッスン#08 敵モブを召喚せよ2
    この記事は スクラッチコーチで掲載されているオリジナル記事 のバックアップです。
    スターター作品
    なし
    今回の完成サンプル
    なし

    前回に引き続き、敵モブを作り込みます。

    敵モブの動きをグレードアップする

    ここまでで次のことが実現されました。

    • レベルによって敵モブの配置を変えることができる
    • 敵モブはプレイヤーが近づくまでスポーンしない
    • スポーン後は、画面内では表示されて、画面外に行くと非表示になる
    • 一定の速度で移動する

    方向転換する

    引き続き次の仕様も実現していきます。

    • 壁に当たると反転する
    • 坂を登ることができる
    • 重力の影響を受ける
    • 移動中はアニメーションする

    ブロック定義「障害物に触れているか調べる」を作る

    変数「障害物に触れているかどうか」を作る
    ブロックかレベルに触れたらTRUEにする

    ブロック定義「方向転換する」を作る

    利用する
    障害物に触れているどうか調べる
    障害物に触れている場合を作る
    坂を登る傾斜を指定する

    とりあえず3座標分の傾斜なら坂を登るようにしていきます。

    スクラッチでマリオのゲームを作る特大レッスン#08 敵モブを召喚せよ2を語るok-scratch ok-scratch

    u003cpu003e坂を検証するためには、坂を作っておく必要があります。まだシーンに坂がない方は、緩やかな坂を用意してください。こだわらなくてOKです。ただ斜めの四角で十分です。u003c/pu003e

    また障害物に触れているか調べる

    Y座標を高くしてもまだ当たっているか調べます。

    壁に当たったと見なす

    まだ当たっているなら、それは坂ではなく壁であると見なして、いったんY座標を戻します。

    反転する

    変数「進行方向」を-1なら1に、1なら-1に逆転させます。

    動作確認する

    壁に当たると移動方向が変わるようになりました!

    重力の影響を受けるようにする

    坂の処理を確かめるには、重力の影響を受ける必要があります。坂を下る動きができないからです。

    変数「スピードY」を作る

    初期化する

    ブロック定義「Y軸に移動する」を作る

    利用する

    重力を適用する

    接触判定用のループを作る

    プレイヤーでも作った、1座標ずつY座標を変えて、何かに接触しているかどうかを判断する処理を作ります。

    変数「直前のY座標」を作る

    Y座標を記録する

    1座標ずつズラす

    スピードYは、ジャンプ中はプラスですが、落下中はマイナス方向に値が動きます。プラスかマイナスか、条件分岐して判断する代わりに、絶対値の割り算でプラスとマイナスを判断します。

    数字でも解説しておきます。

    スピードYが10なら、10 ÷ 10 = 1です。

    スピードYが-10なら、-10 ÷ 10 = -1となります。

    これで条件分岐せずに、上昇中は1座標だけ上を調べられて、下降中は1座標だけ下を調べられます。

    障害物に触れているか調べる

    触れていたら減速する

    Y座標を元に戻す

    動作確認する

    ※このミニ動画は3倍速になっています

    動画の最初にちょっと高めのところにスポーンしたスライムが、重力の影響を受けて着地している様が確認できます。また、坂を下るようにも動いています。壁でも反転して、画面外に行くと消えることも見て取れます。

    バグを直す

    重力によるバグを確認する

    一見上手くいったように見えますが、実はバグがあります。画面外に消えたスライムが、二度と現れなくなるのです。

    スクラッチでマリオのゲームを作る特大レッスン#08 敵モブを召喚せよ2を語るok-scratch ok-scratch

    u003cpu003e実はスライムは消えたわけではなく、赤と緑のシーンの間でフルフルしています。画面の下を見て探してみてください。u003c/pu003e

    なぜこのようなことが起きるか説明します。

    画面外に行くことで「隠す」ブロックによって隠れるため、ブロック定義「障害物に触れているか調べる」の結果が常に「いいえ」になってしまいます。そうするとブロック定義「Y軸に移動する」では、ずっと重力の影響でY座標が-1され続けて、結果的に、隠れている間に画面の一番下まで落ちてしまうのです。そしてプレイヤーが近づくと表示され、画面下端でフルフル震えているスライムが見つかるという流れです。

    表示しているときだけ重力を適用する

    最適解ではないかもしれません。しかし、今できる最もカンタンで効果的な打ち手が、表示中のみブロック定義「Y軸に移動する」を適用することです。

    また、ブロック定義「方向転換する」も表示中のみ適用します。理由は、隠れている間はどのみち障害物に触れたか正しく判断できないため、やっても仕方ないからです。

    埋もれてしまうバグを確認する

    これでよし!と思いきや、今度は非表示中にシーンに埋もれこんでしまうバグが起こります。

    非表示中は方向転換しない(できない)ので、シーンに段差があっても直進して埋もれてしまいます。隠れている間はそれでもいいのですが、シーンに埋もれている間に表示してしまうと、シーンに埋もれてフルフル震え始めます。

    これは目立つバグなので対応していきます。

    ただ、けっこう難解な処理になるので、いったん飛ばして区切りの良いタイミングでタックルすることにします。

    アニメーションする

    次回はアニメーションするところを作り込んでいきます!このあとすぐに更新します。

    スクラッチでマリオのゲームを作る特大レッスン#08 敵モブを召喚せよ2を語るok-scratch ok-scratch

    u003cpu003e1記事が長いので、ちょっと分けていこうかなと思って。u003c/pu003e

    この記事への質問やコメントをどうぞ

    ただいま実験的に質問を受け付けています。

    コメントは受け付けていません。

    スパム防止のため、 質問をするにはログインが必要 です。ログインはスクラッチのアカウントがあれば誰でもできます。

    ブクマよろしくお願いします!という口コミを寄せてくれた方 ブクマよろしくお願いします!
    どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!