スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
今回のレッスンは、バグ修正用のミニレッスンです。壊れないブロックを叩いた弾みでプレイヤーがシーンにめり込んでしまったり、ジャンプしてブロックに乗ったタイミングで当たり判定エリアの隙間からブロックにめり込んでしまったり、プレイヤーが動けなくなる(スタックする)バグがあるとご報告いただきました。
なんらかの理由でめり込むとプレイヤーはもう動けなくなります。
それを修正するブロック定義を1つ追加します。
報告してくれたpolandball-gamesさん、ありがとうございます!
準備
このレッスンは前回「スクラッチでマリオゲームの作り方#05 ブロックを壊せ」の続きです。
スクラッチプロジェクトをコピーして保存する
ファイル>コピーを保存する、を選んでプロジェクト名を「マリオプロジェクト005.5 スタックを回避する」としておきます。
プレイヤーをスタックさせない処理を作る
いまのところ、ブロック定義「Y軸に移動する」と「X軸に移動する」のあとは、プレイヤーは障害物に触れていない作りになっています。
そこで今回の作戦は、Y軸とX軸の移動後にも関わらずコスチューム「当たり判定エリア下」が障害物に触れていたらスタック状態であると判断して、プレイヤーのY座標を上方修正してあげる、という感じでいきます!
平たく言えば、埋もれてたら上に引っ張ってあげる、ということです。
ブロック定義「スタックを回避する」を作る
「再描画せずに実行する」オプションにチェックを入れておきます。
移動後かつアニメーション前に実行する
実行する場所が大切です。
レスキューするロジックを作る
移動後とアニメーションの間でスタック状態にあるかを調べてレスキューします。
コスチュームを指定する
コスチューム「当たり判定エリア下」に着替えます。この状態で障害物にめり込んでいるかどうかを調べていきます。
障害物に触れているか調べる
条件分岐ブロックを置く
この条件がTRUEなら、それすなわちスタック状態ということです。地面とかブロックにめりこんでプレイヤーが動けず困っている状態です。助けていきましょう。
条件の中にループを置く
10回は暫定ですが、とりあえずOKです。
上に引っ張ってあげる
具体的なレスキュー活動がこれですね。Y座標をプラス1ずつして、障害物がなくなるまで上に引っ張ってあげるイメージです。
十分なところでレスキュー活動を止める
これで終わりでもいいのですが、このままだと必ずプラス10されてしまいます。
たとえばY座標にプラス6だけすれば十分だったのに、プラス10してしまうと、差分である4座標分はプレイヤーが空中に浮いてしまいます。
そうすると、プレイヤーは重力の影響を常に受けているので、4座標分は落下処理が行われてしまいます。
つまり、不自然な動作になるということです。
まだ障害物に触れているか調べる
障害物を抜けたか調べる
抜けていたら止める
動作確認する
マウスを使ってシーンに埋めてみても……。
ピョコンっと地上に引き上げられます。
成功です。
パフォーマンス改善する
しかし、この処理は移動処理と同じように常にチェックが働いています。このレスキュー活動はあくまでイレギュラーな処理なので、頻度は少ないと思います。
そこで、動いているときは処理が走らないようにして、メモリを節約します。
こうすることで一瞬シーンにめり込むことはあっても、すぐに抜け出せるので十分だと思います。
次こそコインをゲットせよ!
急なバグ修正回でしたが、次回こそコインをゲットします!
数日以内に更新しますので、またブクマよろしくお願いします〜。更新しました!
- ① 横スクロールを制覇せよ
- ② ジャンプせよ
- ③ 壁・坂を攻略せよ
- ④ ゴールして次へ
- ⑤ ブロックを壊せ
- ⑥ スタックを回避せよ (いまここ)
- ⑦ コインをゲットせよ
- ⑧ 敵モブを召喚せよ1 (クローン化、スポーン、横移動など)
- ⑨ 敵モブを召喚せよ2 (方向転換や重力)
- ⑩ 敵モブを召喚せよ3 (アニメーション)
- ⑪ バトル開始1 (ダメージを受ける・与える)
- ⑫ バトル開始2 (ダメージのアニメーション、フィードバック)
- ⑬ 敵モブをリスポーンさせる
- ⑭ iPadに対応する
- ⑮ 迫りくるパタパタ (敵モブに新しい動きを追加する手順が分かる)
- ⑯ パタパタのバグ修正 (ジャンプのバグを直す)
- ⑰ 壁に埋もれるバグ修正 (バグがバグを呼ぶ、でも諦めない)