自機と障害物の当たり判定を行います。
Flash では当たり判定を行うのに、とても簡単な方法があります。
詳しくは [ 1ドット当たり判定 ] を参照して下さい。
当たり判定を追加したプログラムは次のようになります。
var flg1 = 0; var flg2 = 0; var flg3 = 0; var flg4 = 0; var hitflg = 0; // 毎フレーム実行されるイベントを登録 stage.addEventListener(Event.ENTER_FRAME, mainloop); function mainloop(event:Event):void { 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; // 自機を回転する } 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 では、当たったかどうかを記録する変数を用意しています。
B では、初期化をしています。これが無いと、1度当たるとずっと当たっている状態に
なってしまいます。
C のところで当たり判定を行っています。
障害物1つずつと自機との判定を行っているので、4つあります。
障害物のインスタンス名と自機の座標で、当たり判定を行います。
hitflg は当たり(1) 外れ(0) の情報を格納します。
この情報を元に、当っている時はやられ演出を行います。
D で、やられ演出として自機の回転を行います。
player_mc.rotation += 15;
これは「自機を15度ずつ角度を付ける」という処理です。
この処理が数フレーム続けて行われると回転しているように見えます。
今回使っている当り判定の方法は
1ドットの座標と対象となるものとの関係をチェックしてます。
指定した座標に対象物が存在する時「当っている」と判断します。
この方法のメリットは取り扱いが簡単であること
デメリットは、実際の見た目と当り判定に違いがあることです。
見た目と当たりとの誤差があるため、ゲームの内容によっては注意が必要です。
正確な当たり判定を必要とするタイプのゲームには向きません。
今回は
自機の当り判定の範囲が小さい = プレイヤーに有利
および
当たり判定の正確性はあまり重要ではない
ということで、この方法でも許されると思います。
注意するパターンとして、敵の当たりを1ドットで判定するようなゲームを作ると
当たりが小さくて、プレイヤーが撃った弾がなかなか当らない
という状況が発生します。プレイヤーはすごいストレスを感じることになるでしょう。
対象物の性質に合わせて判定方法を使い分ける必要があります。
当たり判定をする時に注意することがあります。
それは当り判定を行うタイミングです。
今回のプログラムの概要は次のようになっています。
注目する点は、当り判定の場所です。
自機や障害物の移動処理の前にあります。
移動処理では、次フレームに表示する場所を計算しています。
移動処理後に当り判定をもってくると、移動先の位置で判定することになるので
実際の見た目で接触していないのに、「当たり」と判定される可能性があるのです。
今回のような大雑把なゲーム内容では、あまり気にする必要もないのですが
今後ゲームを作成していく上で、このポイントは重要になってきます。
移動処理と当り判定の場所は、意識しながら作るようにしましょう。
(移動先で当り判定をする場合もあります 例:玉が壁で跳ね返る処理など)
次[ 当たり判定からゲームオーバーへ ]へ進む