ビームと敵との当たり判定を行い、ビームが当たったら敵を破壊できるようにします。
当たり判定とアニメーションの管理は、今回それほど難しいことはしません。
ですから、一緒に説明します。
まず、動作を確認しましょう。
マウスをクリックしてUFOを撃ってみて下さい。
ビームが当たると爆発します。
プログラムを次のように変更して下さい。
const LINE_MAX = 6; // 宝と敵の段数 var enemyArr:Array = []; var turn:Vector.<int> = new Vector.<int>(LINE_MAX,true); var state:Vector.<int> = new Vector.<int>(LINE_MAX,true); var delcnt:Vector.<int> = new Vector.<int>(LINE_MAX,true); var beamFlg:int = 0; var xSpeed:Number = 0; initFunc(); //---------------------------------------------------- // システム関連の初期化 function initFunc() { trace("initFunc ---"); for( var i=0; i < LINE_MAX; i++ ){ enemyArr[i] = new enemy(); // 敵の作成 enemyArr[i].stop(); disp.addChild(enemyArr[i]); // ステージに表示 } initGame(); // 毎フレームイベントの登録 stage.addEventListener(Event.ENTER_FRAME, mainloop); // マウスイベント 左ボタン押下のイベント登録 stage.addEventListener(MouseEvent.MOUSE_DOWN, m_down); } //---------------------------------------------------- // 毎フレーム処理 function mainloop(event:Event):void { // マウスの座標を取得して自機を動かす player_mc.x += (player_mc.mouseX / 5); if( beamFlg == 0 ){ // 0:未発射 1:発射中 // 未発射なら自機と動きを同期させる beam_mc.x = player_mc.x; } else { // 発射中のとき弾を移動する beam_mc.y -= 10; if( beam_mc.y < -30 ){ // 画面外へ弾が出たとき beamFlg = 0; beam_mc.x = player_mc.x; beam_mc.y = player_mc.y - 25; } } moveEnemy(); // 敵の移動 } //---------------------------------------------------- // 敵の移動 function moveEnemy() { var ex:int; var ey:int; for( var i=0; i < LINE_MAX; i++ ){ // 爆発中 if( state[i] == 2 ){ delcnt[i]--; if( delcnt[i] == 0 ){ state[i] = 0; // 0:待機中 enemyArr[i].x = 530; enemyArr[i].gotoAndStop(1); } } // 出現中のみ以下の処理を行う if( !(state[i] == 1) ) continue; // 敵の移動処理 if( turn[i] == 0 ){ enemyArr[i].x -= xSpeed; // 左際まできたら右移動へ変更 if( enemyArr[i].x < 20 ){ turn[i] = 1; } } else { enemyArr[i].x += xSpeed; // 画面外へ出たら待機中にする if( enemyArr[i].x > 530 ){ state[i] = 0; // 0:待機中 } } ex = enemyArr[i].x; ey = enemyArr[i].y; // 敵と弾との当たり判定の範囲を、見た目で調整する if( (beam_mc.x > ex-20) && (beam_mc.x < ex+20) && (beam_mc.y > ey-20) && (beam_mc.y < ey+20) ){ state[i] = 2; // 2:爆発中 delcnt[i] = 18; // 消滅までのカウント beamFlg = 0; // 0:未発射 1:発射中 enemyArr[i].play(); beam_mc.x = player_mc.x; beam_mc.y = player_mc.y - 25; } } if( Math.random() < 0.015 ){ // 敵の出現率 // 出現位置 var rnd:int = Math.floor(Math.random()*LINE_MAX); for( i=0; i < LINE_MAX; i++ ){ var lno = (rnd + i) % LINE_MAX; if( !(state[lno] == 0) ) continue; state[lno] = 1; // 1:出現中 turn[lno] = 0; // 0:左移動 enemyArr[lno].x = 530; break; } } } //---------------------------------------------------- // ゲーム関連の初期化 function initGame() { trace("initGame ---"); beamFlg = 0; // 0:未発射 1:発射中 xSpeed = 2.0; // 敵の初期移動速度 player_mc.y = 360; // 自機のy座標(固定) beam_mc.x = player_mc.x; beam_mc.y = player_mc.y - 25; // 弾の表示(半分 自機と重ねる) for( var i=0; i < LINE_MAX; i++ ){ // 敵の初期設定 enemyArr[i].x = 530; enemyArr[i].y = (i*42) + 60; turn[i] = 0; // 0:左移動 1:右移動 2:右(宝付き) state[i] = 0; // 0:待機中 1:出現中 2:爆発中 } } //---------------------------------------------------- // マウス左ボタン押されたとき function m_down(event:MouseEvent):void { if( beamFlg == 1 ) return; // 0:未発射 1:発射中 beamFlg = 1; // 自機の位置に弾を表示する beam_mc.x = player_mc.x; beam_mc.y = player_mc.y - 25; }
変更点を見ていきます。
6行目、敵が爆発している時間をカウントする為の配列変数です。
20行目、.stop() を付けることでアニメーションを停止します。
前回のムービープレビューを思い出して下さい。
UFOの表示と爆発アニメの表示を繰り返し行ってましたね。
これを止めてUFOの表示状態にします。
61、62行目、当たり判定を行う時に使用する変数です。
66-73行目、敵が爆発中なら delcnt をカウントダウンして0になったとき
爆発中から待機中へ変更します。
70、71行目、待機中へ変更するとき、敵を画面外へ移動し(70行)
アニメのフレームを1へ戻しています。(71行)
gotoAndStop(1) とは、1フレーム目に移動してアニメを止める命令です。
1フレーム目にはUFOの絵が配置されているので、UFOの絵で止まることになります。
93,94行目、当たり判定をする判断文(97-98行目)を見やすくするために変数に入れてます。
見やすいプログラムはバグも入り難くなるためおすすめです。
97,98行目、ビームと敵の座標の重なりを調べています。(当たり判定)
プラスマイナス20によって敵の当たりの大きさを指定しています。
この値を大きくすることで、ビームとの接触が起こり易くなります。
99,100行目、爆発中にして消滅カウントを入れることで、66行目以降の処理が
行われるようになります。
101行目、ビームフラグを未発射にすることで、次のビームが撃てるようになります。
102行目、.play() を付けることで止めてあったアニメーションを動かします。
UFOの絵で止めてあったものが動き出し、爆発アニメが表示されることになります。
1つのキャラクターを動かすことは play() stop() gotoAndStop() を知っていれば
ほとんどできると思います。
もう1つ gotoAndPlay() も便利です。
gotoAndStop() は指定したフレームへ移動して止める。
gotoAndPlay() は指定したフレームへ移動して再生する。
というものです。
これらを上手く使ってキャラクターを歩かせたり、爆発させたり出来ます。
次[ 宝石を表示する ]へ進む