スクラッチでマリオのゲームを作る特大レッスン #16 - 恐怖、壁に引きずり込まれるホラーなバグ!

スクラッチでマリオのゲームを作る特大レッスン #16 - 恐怖、壁に引きずり込まれるホラーなバグ!
ok-scratch
スクラッチでマリオを作ってたらバグが多かったので直してみた、という回です。こうやって洗練されていく……。
難しさ

任意)自分の作業中のスクラッチ作品URLを記録しておこう!再開するときに便利だよ。

LOADING...

※ この記録は今使ってるPCに保存されます。別のPCで作業するときは表示されません。

スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。

(かべ)にめり()()バグをご報告(ほうこく)いただきました!
ステージ2で(すこ)(さき)のゴーストをスタート付近(ふきん)におびき()せて(みぎ)()いてダメージを()けると(うし)ろの()ちないようの(かべ)()たり、地面(じめん)にめり()()というあまり関係(かんけい)ないバグを()つけました。sakiyomidaさん
バグ報告(ほうこく)してくださったsakiyomidaさん、ありがとうございます。このバグはちょっと(いた)いので(なお)そうと(おも)います。そして(すこ)(おお)きめなバグ修正(しゅうせい)になったので、チュートリアルまるまる1(かい)(ぶん)として記事(きじ)()しました。

バグの確認(かくにん)

とりあえずどんなときにどんなバグが()きるのか()ておきます。
(かべ)()()まれた状態(じょうたい)(てき)にぶつかると(かべ)にめり()んでしまうのです……これはマズイ。

ブロック定義(ていぎ)「スタックを回避(かいひ)する」を改修(かいしゅう)する

今回(こんかい)メインで(なお)すのはブロック定義(ていぎ)「スタックを回避(かいひ)する」です。

コスを変更(へんこう)する

横向(よこむ)きのスタックを回避(かいひ)したいので、コスを変更(へんこう)します。
ちょっと条件(じょうけん)分岐(ぶんき)(おお)いブロック定義(ていぎ)なので挿入(そうにゅう)部分(ぶぶん)間違(まちが)わないように()をつけてください。

障害物(しょうがいぶつ)()れているかどうかを判定(はんてい)する

直前(ちょくぜん)のX座標(ざひょう)(ひか)えておく

これからX座標(ざひょう)調整(ちょうせい)していくので、変更(へんこう)(まえ)のX座標(ざひょう)をバックアップしておきます。

スプライトの(おお)きさと(おな)回数(かいすう)チェックする

スプライトが(かべ)にまるまる(うず)もれてしまってもいいように、(おお)きさの(ぶん)だけチェックを()(かえ)すことにします。余裕(よゆう)をもたせたいならここにプラスしてもOK。

(ため)しに逆進(ぎゃくしん)させる

()いてる(ほう)とは(ぎゃく)(がわ)に1座標(ざひょう)ずつズラしていきます。
  • 数式(すうしき)を解説(かいせつ)します 数式(すうしき)を解説(かいせつ)します
    \u003cp\u003eまず「()き / ()きの絶対値(ぜったいち)」を()てください。()きが90()右向(みぎむ)き)なら、90 ÷ 90 = 1となります。()きが-90()左向(ひだりむ)き)なら、-90 ÷ 90 = -1になります。これをそのままX座標(ざひょう)(くわ)えても前進(ぜんしん)するだけなので、もっとめりこんでしまう。そこで「0 - 1 = -1」とか「0 - (-1) = 1」にして、()反転(はんてん)させてます。\u003c/p\u003e

脱出(だっしゅつ)できたら()める

X座標(ざひょう)補正(ほせい)()(くわ)えたあとに(あらた)めて障害物(しょうがいぶつ)()れているか調(しら)べます。もう()れてなかったら脱出(だっしゅつ)成功(せいこう)なので、処理(しょり)()めます。

脱出(だっしゅつ)できなかった場合(ばあい)はX座標(ざひょう)(もど)

  • なんで脱出(だっしゅつ)できなかったって分(わ)かるの? なんで脱出(だっしゅつ)できなかったって分(わ)かるの?
    \u003cp\u003e\u003cspan style=\u0022font-family: -apple-system, BlinkMacSystemFont, \u0026quot;Segoe UI\u0026quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, \u0026quot;Helvetica Neue\u0026quot;, sans-serif; color: initial;\u0022\u003eもし脱出(だっしゅつ)できていたら、「(おお)きさ」(かい)()(かえ)すループ(ない)の「このスクリプトを()める」が(うご)いて、今回(こんかい)()いた「X座標(ざひょう)直前(ちょくぜん)のX座標(ざひょう)にする」まで処理(しょり)(とど)かないのです。\u003c/span\u003e\u003c/p\u003e\u003cp\u003eつまり、ここまで処理(しょり)()てしまったということはイコール脱出(だっしゅつ)できなかったということになります。\u003c/p\u003e

テストする

よぉしいい(かん)じ、おわり、と(おも)いきや(べつ)のバグが発生(はっせい)しています。今度(こんど)自分(じぶん)から(かべ)にグイグイ()たるように(すす)んでみます。すると……。
X座標(ざひょう)がどんどんズレてしまって、そのうちプレイヤーがカメラから(はず)れてしまうのです。これは()くないですね。

カメラとX座標(ざひょう)同期(どうき)改善(かいぜん)しよう

このバグの根本的(こんぽんてき)原因(げんいん)は、X座標(ざひょう)をズラしたのにカメラは(うご)いてない、という(てん)です。今回(こんかい)はカメラをX(じく)(うご)かしているブロック定義(ていぎ)「X(じく)移動(いどう)する」を改修(かいしゅう)することで対応(たいおう)していきたいと(おも)います。

条件(じょうけん)分岐(ぶんき)追加(ついか)する

X座標(ざひょう)がズレてない場合(ばあい)(いま)まで(とお)りの処理(しょり)(おこな)えばOKなので、条件(じょうけん)分岐(ぶんき)仕切(しき)ります。今回(こんかい)ガッツリ処理(しょり)追加(ついか)するのは「でなければ」の(ほう)です。

X座標(ざひょう)調整(ちょうせい)する

X座標(ざひょう)が0ではないときだけ、X座標(ざひょう)補正(ほせい)()(くわ)えます。
  • 逆進(ぎゃくしん)させています 逆進(ぎゃくしん)させています
    \u003cp\u003e\u003cspan style=\u0022font-family: -apple-system, BlinkMacSystemFont, \u0026quot;Segoe UI\u0026quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, \u0026quot;Helvetica Neue\u0026quot;, sans-serif; color: initial;\u0022\u003e()きのときと(おな)じですね。まず「X座標(ざひょう) ÷ X座標(ざひょう)絶対値(ぜったいち)」を()てみましょう。\u003c/span\u003e\u003c/p\u003e\u003cp\u003eX座標(ざひょう)がたとえばプラス5のときは画面(がめん)中央(ちゅうおう)よりも右側(みぎがわ)にいます。なのでマイナス5を(くわ)えてX座標(ざひょう)を0に(もど)したいですよね。そこで「5 ÷ 5 = 1」を反転(はんてん)させて「0 - 1 = - 1」としてからX座標(ざひょう)(くわ)えていきます。\u003c/p\u003e\u003cp\u003eこれで(うご)くたびに1ずつX座標(ざひょう)補正(ほせい)されていきます。\u003c/p\u003e

テストする

動画(どうが)下部(かぶ)にあるX座標(ざひょう)注目(ちゅうもく)ぅ、画素(がそ)(あら)くてゴメンね)
(かべ)()たってX座標(ざひょう)がズレても、同時(どうじ)(ぎゃく)にも補正(ほせい)しているのでX座標(ざひょう)()えないようになりました。これでバグ修正(しゅうせい)()わり……じゃないんです😅

(ふたた)びブロック定義(ていぎ)「スタックを回避(かいひ)する」を改修(かいしゅう)する

今回(こんかい)修正(しゅうせい)で、これまで(かく)れていたバグが()()りになりました。よくある(はなし)です。

スライムが()まらないw

スライムってマジ進撃(しんげき)のスライムなんですよね……()たっても全然(ぜんぜん)()まらない。将棋(しょうぎ)()香車(きょうしゃ)《きょうしゃ》みたいな(てき)モブなんです……。いや、香車(きょうしゃ)()たれば()まるか……スライム、厄介(やっかい)だぜ。こうなる↓
ピューンって(うえ)にw

ブロック定義(ていぎ)「スタックを回避(かいひ)する」でY座標(ざひょう)(もど)

X座標(ざひょう)変数(へんすう)直前(ちょくぜん)のX座標(ざひょう)」に()をバックアップしておいて、回避(かいひ)できなかったらX座標(ざひょう)(もと)(もど)してありました。Y座標(ざひょう)ではこれを()っていません。ちゃんとやります。

直前(ちょくぜん)のY座標(ざひょう)をバックアップする

回避(かいひ)できなかったらY座標(ざひょう)(もと)(もど)

テストする

うん、(うえ)にピューンって()くバグは(なお)った。もう問題(もんだい)ない。ないよね。うん、ないね。ははっ。え?なんかネコが(かべ)にめり()んでないかって?オー、ワタシ、ニホンゴ、ワカラナーイ、ソーリーソーリーナイカクソーリー。冗談(じょうだん)はさておき、はい、またバグってますね。(なお)します、(なお)しますよぉ!バグめぇ!

(ふたた)びブロック定義(ていぎ)「X(じく)移動(いどう)する」を改修(かいしゅう)する

原因(げんいん)(あき)らかにしておきましょう。犯人(はんにん)は……ワタシだぁwいや、バグを(にく)んで(ひと)(にく)まず。(だれ)(わる)いとかじゃない。(つぎ)動画(どうが)()てください↓
X座標(ざひょう)とネコの(うご)きが(かぎ)です。
  • 何(なに)が起(お)きてるの? 何(なに)が起(お)きてるの?
    \u003cp\u003e\u003cspan style=\u0022font-family: -apple-system, BlinkMacSystemFont, \u0026quot;Segoe UI\u0026quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, \u0026quot;Helvetica Neue\u0026quot;, sans-serif; color: initial;\u0022\u003eさきほどX座標(ざひょう)がズレているときはカメラは(うご)かさずに逆進(ぎゃくしん)させて補正(ほせい)するという処理(しょり)を、ブロック定義(ていぎ)「X(じく)移動(いどう)する」に追加(ついか)しました。\u003c/span\u003e\u003c/p\u003e\u003cp\u003eこのため、X座標(ざひょう)がプラス33のときはカメラが(うご)かさずに、一()あるくごとにX座標(ざひょう)がマイナス1ずつ補正(ほせい)されます。すると、ネコはX33からX32に移動(いどう)します。これだと、X32に(かべ)があった場合(ばあい)、せっかく脱出(だっしゅつ)した(かべ)(ふたた)(うず)もれてしまうことになります。\u003c/p\u003e\u003cp\u003eこれでは(しん)解決(かいけつ)からは程遠(ほどとお)いのが現状(げんじょう)です。\u003c/p\u003e
このバグをちょっとマシにしていきます。マシに。

ブロック定義(ていぎ)「X(じく)移動(いどう)する」に条件(じょうけん)追加(ついか)する

X座標(ざひょう)補正(ほせい)する(さい)(かべ)があったらマズイ?なら(かべ)にぶつかってるときは補正(ほせい)しなければいいよ!という発想(はっそう)です。そしてコレ自体(じたい)(ただ)しいですが、パーフェクトではありません。

問題点(もんだいてん)(なに)

こうなります↓
(かべ)(うず)もれても脱出(だっしゅつ)はできてます。そして、そのまま(ひだり)()こうとしても補正(ほせい)(はたら)いて(ふたた)(うず)もれるバグはなくなりました。しかし!(みぎ)(すす)もうとすると(かべ)(なか)()きずり()まれてしまいます……ホラーです😫

(なに)()きているか

X座標(ざひょう)補正(ほせい)(なに)間違(まちが)いが()きています。それを明確(めいかく)にするために(つぎ)動画(どうが)()てください。
これは(かべ)から脱出(だっしゅつ)した直後(ちょくご)です。直後(ちょくご)なのでX座標(ざひょう)が0ではなくプラスに()えています。この状態(じょうたい)(みぎ)(ある)こうとしています。すると補正(ほせい)(はたら)き、一()(うご)くごとにX座標(ざひょう)がマイナス1されているのです。するとネコはどんどん左側(ひだりがわ)(うご)いていき、結果的(けっかてき)(かべ)()きずり()まれるのです。補正(ほせい)裏目(うらめ)()ました。

どうしたらいいか

ネコが(ひだり)(うご)いていくのに()わせてステージ(カメラ)も(ひだり)(うご)かせば(かべ)にめり()()ことはなくなります。ネコが(みぎ)(うご)くと(ひだり)補正(ほせい)される、なら(かべ)(ひだり)(うご)かせばネコは(かべ)(うず)もれないよね、という(はなし)です。
  • 変更(へんこう)(まえ))ネコが(みぎ)(うご)く→(ひだり)補正(ほせい)される→(かべ)があるとめり()()
  • 変更(へんこう)())ネコが(みぎ)(うご)く→(ひだり)補正(ほせい)される→(かべ)(ひだり)(うご)かす→(かべ)はないからネコは(うご)ける
こんな↑イメージの改修(かいしゅう)をしていきます。

カメラを補正(ほせい)する

作業(さぎょう)はカンタンです、コピペ。

テストする

だいぶマシになりました。(かべ)には()きずり()まれません。まだまだ改善(かいぜん)余地(よち)はありそうです。あとちょっと!

最後(さいご)微調整(びちょうせい)する

変数(へんすう)初期化(しょきか)

処理(しょり)順番(じゅんばん)調整(ちょうせい)する

アニメーションとスタックを回避(かいひ)する処理(しょり)()()えた(ほう)(うご)きがスムーズでした。

ブロック定義(ていぎ)「スタックを回避(かいひ)する」を微調整(びちょうせい)する

コス(めい)のバックアップを()ります。

変数(へんすう)直前(ちょくぜん)のコスチューム(めい)」を(つく)

バックアップを()

コスを(もと)(もど)

テストする

だいぶマシになりました。(まん)(いち)(うず)もれてしまっても、無事(ぶじ)脱出(だっしゅつ)できて、かつ(かべ)()きずり()まれないような処理(しょり)になっています。

まとめ

1つのバグを(なお)そうとしたら(いも)づる(しき)にバグがどんどん発生(はっせい)して、けっこうな大改修(だいかいしゅう)になりました。よくある。よくあるんです。こういうバグを(つぶ)作業(さぎょう)集中(しゅうちゅう)しちゃう(ひと)はけっこうプログラマーに(おお)いかも。以前(いぜん)プログラマーの先輩(せんぱい)から、この()にバグのないシステムなんてない、と()かされました。バグはあります。ホコリみたいなもんです。南極(なんきょく)にだってホコリはあるって()いたこともあります。みんなの作品(さくひん)にバグがあっても、それは力量(りきりょう)不足(ぶそく)とか設計(せっけい)ミスとか(ふか)(かんが)えず、どうしてバグってるのかを追求(ついきゅう)してから(なお)すようにしてみてください。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチプログラミングのゲーム攻略

スクラッチプログラミングのゲーム

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品