三方向
敵機をランダムに三方向へ移動させます。左右に移動する場合はスピードの50%ずつ直進、左右移動させます。
左右移動するとやがて画面をはみ出てしまいます。そこで画面端に達したら、左移動->右へ、右移動->左へ変更します。
定数
次のように方向用の定数を定義します。
1 2 3 |
var H_LEFT = 0; //方向左 var H_CENTER = 1; //方向直進 var H__RIGHT = 2; //方向右 |
出撃処理
出撃処理で方向をランダムに決定します(11行目)。14行目で方向を敵機情報へ格納しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* 出撃 */ function fight(){ count = 0; for(var i=0;i<te.length;i++){//出撃していない敵機を探す if( te[i][0] == TEKI_ON){ //横位置をランダムに決定 x = Math.round( Math.random()*(canvas.width-teki_x_size )); //方向をランダムに決定 h = Math.round( Math.random()*2); te[i][0] = TEKI_FIGHT; te[i][1] = h; te[i][2] = x; te[i][3] = teki_y_size * -1; te[i][4] = teki_speed; count++; if(count>=teki_fight_su){ //1回の出撃数を超えた? break; } } } teki_fight_su=teki_fight_su + 1; //1回の出撃数増加 teki_speed=teki_speed+0.02; //スペードアップ } |
敵機描画処理
敵機描画処理で方向に従い進めます。それが13行~25行目です。画面左右にはみ出た場合は方向を変えます、その処理が30行~27行目です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* 敵機描画 */ function tekiMove(){ teki_count++; if(teki_count>TEKI_INTER){//出撃間隔に達した? fight(); teki_count = 0; } for(var i=0;i<te.length;i++){//出撃中の敵機を探す if(te[i][0] == TEKI_FIGHT){ ctx.drawImage(teki,te[i][2],te[i][3],teki_x_size,teki_y_size);//描画 switch(te[i][1]){ case H_LEFT: //左方向へ進む te[i][2] = te[i][2] - te[i][4]/2; te[i][3] = te[i][3] + te[i][4]/2; break; case H_CENTER://直進 te[i][3] = te[i][3] + te[i][4]; break; case H__RIGHT://右方向へ進む te[i][2] = te[i][2] + te[i][4]/2; te[i][3] = te[i][3] + te[i][4]/2; break; } if( te[i][3] > canvas.height){ //画面下に達したら te[i][0] = TEKI_ON; } if( te[i][2] < 0){ //左画面はみ出し? te[i][2] = 0; te[i][1] = H__RIGHT; } if( te[i][2] > canvas.width - teki_x_size){//右画面はみ出し? te[i][2] = canvas.width - teki_x_size; te[i][1] = H_LEFT; } } } } |
実行
動作を確認します。実行画面へ
敵機同士が重なり合う、弾丸で破壊できない、次のステップでこれらを対応します。
ここまでのソースコードを掲載します。