現在制作中のゲーム「project005(仮)」、MI68での試遊中に発見したバグの原因究明&デバッグを行いました。
まず、自らプレイしてバグの減少が起こる時と起こらない時の違いを見つけます。
何回も繰り返してみると、「画面隅を通った時に起こりやすい」ことを見つけました。
それを踏まえて中身を見ていきます。
そうです、printデバッグです!
バクに関わりそうな要素の変数を同じ画面に表示したり、ターミナルウインドウで表示したりします。
ここでも、いろいろな変数を表示させて何度もプレイして変数の内容をチェックしていきます。
そして怪しい箇所を見つけたので、そこを絞って観ていきます。
原因がわかりました!
線の座標を記録するテーブルに同じ座標が入っていたことが原因でした。
mline[1].xとmline[2].xの値が同じ52だとわかり、気付きました。
魔法が発動する処理の流れは、↓になっています。
「魔法使いが通った所に線が出来て、それで囲むとその場所に魔法が発動する」
そのプロセスは、
- 通った所の場所をテーブルに代入していく
- そのテーブルからの座標を4ピクセル毎(グリッドポイント)にインデックス番号を使って別テーブルを作る
- 囲んだら、フィールドテーブル(4×4毎の縦横31×31にテーブル)を作って、線の位置の情報を移す
- 囲んだ部分を再帰法を使って確定
という流れになっていて、私が今まで組んだコードは、
「通った所の場所をテーブルに代入していく」ところで、進んだ時(テーブルに代入)と戻った時(線を消すためにテーブルから削除)の処理しか書いておらず、止まっていた時の処理は進んだ時と同じ処理を行うようになっていました。
そのため、画面隅にぶつかった時にそれ以上進もうとすると、同じ座標がテーブルに登録され続け、インデックスで4ピクセル毎に座標をチョイスする時に、ズレて読み込んでしまうことで、線ではなく空白(何も無い)情報に置き換わってしまっていたことが原因でした。
早速、止まっていた時にはテーブルに座標を追加しない様にして、修正しました。
バグが解って取れて清々しい気持ちです。
さあ、続きを行います。
コメント