当たり判定が入ったので、ゲームオーバーを表示させましょう。
まず、新しいレイヤーを作ります。
表示優先のことを考えて、自機や障害物よりも上に表示されるようにします。
表示優先のことが分からない場合は
[ 表示優先 ] を参照してください。
「GAME OVER」のメッセージを作ります。
文字のサイズを60に変更します。
フォントファミリー(文字のタイプ)とスタイルは任意で設定してください。
メッセージを横長にします。
メッセージは、画面中央へ移動してください。
ここで一度、ムービープレビューしてみましょう。
「GAME OVER」が常に表示されてますね。
これをゲーム中は表示せず、自機と障害物が接触したとき表示されるようにします。
「GAME OVER」にインスタンス名を指定して
プログラムで制御できるようにします。
ゲームオーバーを追加したプログラムは次のようになります。
var flg1 = 0; var flg2 = 0; var flg3 = 0; var flg4 = 0; var hitflg = 0; var endflg = 0; // 0:play 1:gameover 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:当り if( ball_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){ hitflg = 1; } if( ball2_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){ hitflg = 1; } if( ball3_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){ hitflg = 1; } if( ball4_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){ 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の6行目で、ゲームオーバー状態を調べる変数を宣言しています。
8行目では、「GAME OVER」メッセージを非表示にしてます。
Bでは、ゲームオーバー状態 (endflg==1) なら自機を回転させ
return を入れて、ここより下の処理を行わないようにします。
Cでは、 プレイ中 (endflg==0) ならゲームオーバー状態とし (endflg=1)
「GAME OVER」の表示をします。
またここでも、return を入れて以降の処理を行わないようにします。
プログラムは仕様通りに動くことが全てです。
どんな書き方をしても良いのです。
しかし、規模が大きくなるほど複雑になり易く
正常に動くプログラムを組むことが難しくなります。
今後のことを考えると
バグが発生しにくい
メンテナンスがし易い (変更や追加がし易い)
このようなプログラムが組めるようになるのが理想です。
ここで、プログラミングのポイントを考察してみましょう。
Bの所で、ゲームオーバー状態 (endflg==1) なら自機を回転させ
return より下の処理を行わないようにしています。
ゲームオーバー状態では、他の処理 (当り判定や移動処理) は必要ありません。
このように必要なことだけ処理するようにして、バグが発生しにくい状況を作ります。
Cの所で、プレイ中 (endflg==0) かどうかの判断(if文)を行ってますが
実は行う必要はありません。
なぜなら 36 行目以降は
「 自機と障害物が接触している状態 (hitflg==1) 」
であり、ゲームオーバーの条件がそろっているからです。
ではなぜプレイ中かどうかの判断を入れたのか。
1つのフラグに複数の意味を持たせないためです。
hitflg は「接触しているか」の判断をするために作りました。
endflg の判断文をいれなければ、ここでゲームオーバー処理をしているため
「ゲームオーバーか」という2つの意味を持たせることになります。
複雑なプログラムを組み始めたとき、1つのフラグに複数の意味を持たせると
使い方を間違える状況が発生しやすくなります。
今後、複雑なプログラムを組むようになると、同じような状況の処理が色々な場所に出てきます。
無理やり行う必要はないのですが、可能な限り1つにまとめるようにしましょう。
プログラムを作ってから時間が経つと、いろいろと忘れることが多くなります。
プログラムの変更が発生した時に、複数の箇所に分かれていると見落としが発生します。
処理がまとまっていると確認する箇所も減り、同時にプログラム自体がシンプルな作りなります。
シンプルで分かり易いプログラムは
バグの発生率を下げ、メンテナンス効率を高めます。
次[ 絵を入れる ]へ進む