バグとは・・・
仕様通りに動いていなかったり、不具合でゲームを楽しめない状況のことを言います。
バグ取りとは・・・
不具合を修正し、ゲームを正常に楽しめる状態にする作業を言います。
バグは、プログラムに限らず、グラフィックやサウンド
そして、仕様上の不具合などすべて含めます。
例えば
・仕様と違う動きをする
・当たり判定が正常に行われない
・表示が見難い
・キャラ化けする
・SE(サウンドエフェクト)が聞こえない
・サウンドにノイズがある
などなど、いろいろあります。
また、操作方法が分かりにくくプレイが楽しめないのなら、仕様上の不具合として
私はバグと判定しています。
バグを探すには、仕様通りの動きをしているかゲームをプレイして確認します。
確認作業中は、可能な限りいろいろなプレイを試みて下さい。
今回のゲームでは、マウスカーソルを左右に動かすだけなので出来ることが少ないです。
それでも色々と試してみましょう。
では、実際にプレイしてみましょう。
何か当たり判定で違和感を感じませんか?
発見できていない人は、障害物の左右下の角から自機を近づけてみて下さい。
そうです、ここにバグがあります。
障害物の絵と同じ丸い円として当たり判定されるはずが
四角い領域で当たり判定が行われています。
これを意識して再度プレイしてみてください。
言われている事がよく分からない人のために、障害物に四角を付けて表示してみました。
このバグが発生した理由は、絵を入れたことあります。
当たり判定に使用した hitTestPoint は、絵を入れると矩形(四角形)と判断されてしまうのです。
今回使っている当たり判定の方法を再確認したい場合は
[ 1ドット当たり判定 ]
[ 当たり判定を行う ]
を参照してください。
このバグを修正する方法は2つあります。
(1) 絵と当たり判定用の2つのムービークリップを用意して重ねる
(2) 当たり判定の方法を変更する
(1)は、見せる絵と hitTestPoint を使う絵と2つ用意して重ねる方法です。
これは色々な場面で有効です。
対象物が複雑な形をしていても当たり判定を簡単に行えるからです。
(2)は、状況に適した当たり判定を使うようにします。
今回の場合だと、対象物が円形なので2点間の距離による当たり判定が適しています。
詳しくは[ 2点間の距離による当たり判定 ]を参照してください。
当たり判定を変更したプログラムは次のようになります。
var flg1 = 0; var flg2 = 0; var flg3 = 0; var flg4 = 0; var hitflg = 0; var endflg = 0; // 0:play 1:gameover var ballr = (65+0)*(65+0); // 当りとなる距離 gameover.visible = false; // gameover 非表示 // 毎フレーム実行されるイベントを登録 stage.addEventListener(Event.ENTER_FRAME, mainloop); function mainloop(event:Event):void { if( endflg == 1 ){ player_mc.rotation += 15; // 自機を回転する return; } hitflg = 0; // 0:外れ 1:当り var xx = player_mc.x - ball_mc.x; var yy = player_mc.y - ball_mc.y; if( (xx * xx + yy * yy) < ballr ){ hitflg = 1; } xx = player_mc.x - ball2_mc.x; yy = player_mc.y - ball2_mc.y; if( (xx * xx + yy * yy) < ballr ){ hitflg = 1; } xx = player_mc.x - ball3_mc.x; yy = player_mc.y - ball3_mc.y; if( (xx * xx + yy * yy) < ballr ){ hitflg = 1; } xx = player_mc.x - ball4_mc.x; yy = player_mc.y - ball4_mc.y; if( (xx * xx + yy * yy) < ballr ){ hitflg = 1; } if( hitflg == 1 ){ // player_mc.rotation += 15; // 自機を回転する if( endflg == 0 ){ endflg = 1; gameover.visible = true; // gameover表示 return; } } else { player_mc.rotation = 0; } // マウスx座標を取得して自機を動かす player_mc.x = stage.mouseX; player_mc.y = 320; // 障害物の初期処理 var rnd:int = 0; if( flg1 == 0 ){ flg1 = 1; rnd = Math.random() * 400; ball_mc.y = -100 - rnd; // 初期y座標 } if( flg2 == 0 ){ flg2 = 1; rnd = Math.random() * 400; ball2_mc.y = -100 - rnd; } if( flg3 == 0 ){ flg3 = 1; rnd = Math.random() * 400; ball3_mc.y = -100 - rnd; } if( flg4 == 0 ){ flg4 = 1; rnd = Math.random() * 400; ball4_mc.y = -100 - rnd; } // 障害物の移動 ball_mc.y += 5; // 下に移動 if( ball_mc.y > 500 ){ // 画面外へ出た flg1 = 0; } ball2_mc.y += 5; if( ball2_mc.y > 500 ){ flg2 = 0; } ball3_mc.y += 5; if( ball3_mc.y > 500 ){ flg3 = 0; } ball4_mc.y += 5; if( ball4_mc.y > 500 ){ flg4 = 0; } }
変更箇所の確認です。
Aは、当たっていると判断される距離を用意しています。
障害物の半径を元にして、三平方の定理の計算式に当てはめています。
障害物の直径は130なので、半径としては65になります。
自機は1ドットとして扱っているので厚みがありません。半径は0となります。
Bは、23,24行目で2点間の距離を算出するための準備をしています。
26行目で、2点間の距離による当たり判定を行っています。
障害物は全部で4つあるため、残りも同じく変更しています。
これで障害物の形に沿った当たり判定が行われます。
ムービープレビューしてみましょう。
すぐにゲームオーバーになると、動作をチェックする暇もありません。
プログラムを一部変更し、チェックし易くしましょう。
Aのコメントを外し自機を回転するようにします。
Bは、endflg の判断文で条件が当てはまらない数値に変更して
ゲームオーバーへの処理へ進まないようにします。
もとの文はコメントにして、戻せるようにしましょう。
このように、バグを確認するためプログラムを変更することはよくあります。
大きく変更する時は、ファイルごとバックアップを取っておく方法も有効です。
それでは、ムービープレビューしてみましょう。
確認してみると、矩形ではなく円形で当たり判定が行われていることが分かります。
最後に、先ほど変更した endflg の判断文を元に戻して修正を終わります。
プログラムにバグは付き物です。
常に「まだバグがあるかも」と疑いながら作業するほうが、最終的に質の良いものとなるでしょう。
今回のゲームにしても、まだバグはあります。
しかも致命的なバグです。
(致命的とはゲームが正常に楽しめないレベルということ)
そのバグの内容は、障害物が横一列に並んで落下してくる時があり、絶対に避けられない
(逃げ道が無い)時があることです。
※他のゲームでも、避けられない状況が発生するものもありますが
大抵の場合、その状況になる手前で回避できるようになっています。
バグはどこに発生するか本当に分かりません。
何度もプレイして確認しながら根気よく対処するしかありません。