「スクラッチでマリオのゲームをつく特大とくだいレッスン#05.5 スタックを回避かいひせよ 」の解説

さいじゃく
スクラッチでマリオのゲームを作る特大レッスン#05.5 スタックを回避せよ
プレイヤーが地面に埋もれたバグを回避する方法が分かります!
スタータープロジェクト

リミックスしてスタート
ファイルをダウンロード
(Scratchデスクトップ用)

完成サンプル
Scratch公式サイト

今回のレッスンは、バグ修正用のミニレッスンです。壊れないブロックを叩いた弾みでプレイヤーがシーンにめり込んでしまったり、ジャンプしてブロックに乗ったタイミングで当たり判定エリアの隙間からブロックにめり込んでしまったり、プレイヤーが動けなくなる(スタックする)バグがあるとご報告いただきました。

なんらかの理由でめり込むとプレイヤーはもう動けなくなります。

それを修正するブロック定義を1つ追加します。

スクラッチでマリオのゲームを作る特大レッスン#05.5 スタックを回避せよを語るさいじゃく さいじゃく

報告してくれたpolandball-gamesさん、ありがとうございます!

準備

このレッスンは前回「スクラッチでマリオゲームの作り方#05 ブロックを壊せ」の続きです。

スクラッチプロジェクトをコピーして保存する

ファイル>コピーを保存する、を選んでプロジェクト名を「マリオプロジェクト005.5 スタックを回避する」としておきます。

プレイヤーをスタックさせない処理を作る

いまのところ、ブロック定義「Y軸に移動する」と「X軸に移動する」のあとは、プレイヤーは障害物に触れていない作りになっています。

そこで今回の作戦は、Y軸とX軸の移動後にも関わらずコスチューム「当たり判定エリア下」が障害物に触れていたらスタック状態であると判断して、プレイヤーのY座標を上方修正してあげる、という感じでいきます!

平たく言えば、埋もれてたら上に引っ張ってあげる、ということです。

ブロック定義「スタックを回避する」を作る

「再描画せずに実行する」オプションにチェックを入れておきます。

移動後かつアニメーション前に実行する

実行する場所が大切です。

レスキューするロジックを作る

移動後とアニメーションの間でスタック状態にあるかを調べてレスキューします。

コスチュームを指定する

コスチューム「当たり判定エリア下」に着替えます。この状態で障害物にめり込んでいるかどうかを調べていきます。

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

条件分岐ブロックを置く

この条件がTRUEトゥルーなら、それすなわちスタック状態ということです。地面とかブロックにめりこんでプレイヤーが動けず困っている状態です。助けていきましょう。

条件の中にループを置く

10回は暫定ですが、とりあえずOKです。

上に引っ張ってあげる

具体的なレスキュー活動がこれですね。Y座標をプラス1ずつして、障害物がなくなるまで上に引っ張ってあげるイメージです。

十分なところでレスキュー活動を止める

これで終わりでもいいのですが、このままだと必ずプラス10されてしまいます。

たとえばY座標にプラス6だけすれば十分だったのに、プラス10してしまうと、差分である4座標分はプレイヤーが空中に浮いてしまいます。

そうすると、プレイヤーは重力の影響を常に受けているので、4座標分は落下処理が行われてしまいます。

つまり、不自然な動作になるということです。

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

障害物を抜けたか調べる

抜けていたら止める

動作確認する

マウスを使ってシーンに埋めてみても……。

ピョコンっと地上に引き上げられます。

成功です。

パフォーマンス改善する

しかし、この処理は移動処理と同じように常にチェックが働いています。このレスキュー活動はあくまでイレギュラーな処理なので、頻度は少ないと思います。

そこで、動いているときは処理が走らないようにして、メモリを節約します。

こうすることで一瞬シーンにめり込むことはあっても、すぐに抜け出せるので十分だと思います。

次こそコインをゲットせよ!

急なバグ修正回でしたが、次回こそコインをゲットします!

数日以内に更新しますので、またブクマよろしくお願いします〜。更新しました!