スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
壁にめり
込むバグをご
報告いただきました!
ステージ2で少し先のゴーストをスタート付近におびき寄せて右に向いてダメージを受けると後ろの落ちないようの壁に当たり、地面にめり込むというあまり関係ないバグを見つけました。sakiyomidaさん
バグ
報告してくださったsakiyomidaさん、ありがとうございます。このバグはちょっと
痛いので
直そうと
思います。そして
少し大きめなバグ修正になったので、チュートリアルまるまる1
回分として
記事化しました。
バグの確認
とりあえずどんなときにどんなバグが
起きるのか
見ておきます。
壁に
追い
込まれた
状態で
敵にぶつかると
壁にめり
込んでしまうのです……これはマズイ。
ブロック定義「スタックを回避する」を改修する
今回メインで
直すのはブロック
定義「スタックを
回避する」です。
コスを変更する
横向きのスタックを
回避したいので、コスを
変更します。
ちょっと
条件分岐が多いブロック定義なので挿入部分を間違わないように気をつけてください。
障害物に触れているかどうかを判定する
直前のX座標を控えておく
これからX
座標を
調整していくので、
変更前のX
座標をバックアップしておきます。
スプライトの大きさと同じ回数チェックする
スプライトが
壁にまるまる
埋もれてしまってもいいように、
大きさの
分だけチェックを
繰り
返すことにします。
余裕をもたせたいならここにプラスしてもOK。
試しに逆進させる
向いてる
方とは
逆側に1
座標ずつズラしていきます。
脱出できたら止める
X
座標に
補正値を
加えたあとに
改めて
障害物に
触れているか
調べます。もう
触れてなかったら
脱出成功なので、
処理を
止めます。
脱出できなかった場合はX座標を戻す
テストする
よぉしいい
感じ、おわり、と
思いきや
別のバグが
発生しています。
今度は
自分から
壁にグイグイ
当たるように
進んでみます。すると……。
X
座標がどんどんズレてしまって、そのうちプレイヤーがカメラから
外れてしまうのです。これは
良くないですね。
カメラとX座標の同期を改善しよう
このバグの
根本的な
原因は、X
座標をズラしたのにカメラは
動いてない、という
点です。
今回はカメラをX
軸に
動かしているブロック
定義「X
軸に
移動する」を
改修することで
対応していきたいと
思います。
条件分岐を追加する
X
座標がズレてない
場合は
今まで
通りの
処理を
行えばOKなので、
条件分岐で
仕切ります。
今回ガッツリ
処理を
追加するのは「でなければ」の
方です。
X座標を調整する
X
座標が0ではないときだけ、X
座標に
補正値を
加えます。
テストする
壁に
当たってX
座標がズレても、
同時に
逆にも
補正しているのでX
座標が
増えないようになりました。これでバグ
修正は
終わり……じゃないんです😅
再びブロック定義「スタックを回避する」を改修する
今回の
修正で、これまで
隠れていたバグが
浮き
彫りになりました。よくある
話です。
スライムが止まらないw
スライムってマジ
進撃のスライムなんですよね……
当たっても
全然止まらない。
将棋で
言う
香車《きょうしゃ》みたいな
敵モブなんです……。いや、
香車は
当たれば
止まるか……スライム、
厄介だぜ。こうなる↓
ピューンって
上にw
ブロック定義「スタックを回避する」でY座標を戻す
X
座標は
変数「
直前のX
座標」に
値をバックアップしておいて、
回避できなかったらX
座標を
元に
戻してありました。Y
座標ではこれを
行っていません。ちゃんとやります。
直前のY座標をバックアップする
回避できなかったらY座標を元に戻す
テストする
うん、
上にピューンって
行くバグは
直った。もう
問題ない。ないよね。うん、ないね。ははっ。え?なんかネコが
壁にめり
込んでないかって?オー、ワタシ、ニホンゴ、ワカラナーイ、ソーリーソーリーナイカクソーリー。
冗談はさておき、はい、またバグってますね。
直します、
直しますよぉ!バグめぇ!
再びブロック定義「X軸に移動する」を改修する
原因を
明らかにしておきましょう。
犯人は……ワタシだぁwいや、バグを
憎んで
人を
憎まず。
誰が
悪いとかじゃない。
次の
動画を
見てください↓
X
座標とネコの
動きが
鍵です。
このバグをちょっとマシにしていきます。マシに。
ブロック定義「X軸に移動する」に条件を追加する
X
座標を
補正する
際に
壁があったらマズイ?なら
壁にぶつかってるときは
補正しなければいいよ!という
発想です。そしてコレ
自体は
正しいですが、パーフェクトではありません。
問題点は何か
こうなります↓
壁に
埋もれても
脱出はできてます。そして、そのまま
左に
行こうとしても
補正が
働いて
再び
埋もれるバグはなくなりました。しかし!
右に
進もうとすると
壁の
中に
引きずり
込まれてしまいます……ホラーです😫
何が起きているか
X
座標と
補正で
何か
間違いが
起きています。それを
明確にするために
次の
動画を
見てください。
これは
壁から
脱出した
直後です。
直後なのでX
座標が0ではなくプラスに
増えています。この
状態で
右に
歩こうとしています。すると
補正が
働き、一
歩動くごとにX
座標がマイナス1されているのです。するとネコはどんどん
左側に
動いていき、
結果的に
壁に
引きずり
込まれるのです。
補正が
裏目に
出ました。
どうしたらいいか
ネコが
左に
動いていくのに
合わせてステージ(カメラ)も
左に
動かせば
壁にめり
込むことはなくなります。ネコが
右に
動くと
左に
補正される、なら
壁も
左に
動かせばネコは
壁に
埋もれないよね、という
話です。
- 変更前)ネコが右に動く→左に補正される→壁があるとめり込む
- 変更後)ネコが右に動く→左に補正される→壁も左に動かす→壁はないからネコは動ける
こんな↑イメージの
改修をしていきます。
カメラを補正する
作業はカンタンです、コピペ。
テストする
だいぶマシになりました。
壁には
引きずり
込まれません。まだまだ
改善の
余地はありそうです。あとちょっと!
最後に微調整する
変数の初期化
処理の順番を調整する
アニメーションとスタックを
回避する
処理を
入れ
替えた
方が
動きがスムーズでした。
ブロック定義「スタックを回避する」を微調整する
コス
名のバックアップを
取ります。
変数「直前のコスチューム名」を作る
バックアップを取る
コスを元に戻す
テストする
だいぶマシになりました。
万が
一埋もれてしまっても、
無事に
脱出できて、かつ
壁に
引きずり
込まれないような
処理になっています。
まとめ
1つのバグを
直そうとしたら
芋づる
式にバグがどんどん
発生して、けっこうな
大改修になりました。よくある。よくあるんです。こういうバグを
潰す
作業に
集中しちゃう
人はけっこうプログラマーに
多いかも。
以前プログラマーの
先輩から、この
世にバグのないシステムなんてない、と
聞かされました。バグはあります。ホコリみたいなもんです。
南極にだってホコリはあるって
聞いたこともあります。みんなの
作品にバグがあっても、それは
力量不足とか
設計ミスとか
深く
考えず、どうしてバグってるのかを
追求してから
直すようにしてみてください。