アステロイド #2ch(2005-12-18) (ここか画像をクリックしたらゲームが開始できます)

 

フレームが表示されてない方はこちらをクリック!

 

効果音 -> SFXg



 



2005-12-18に作ったのアステロイド系ゲームのFLASHです。

< 操作説明 >-----------------------------------------
マウスで方向を合わせてクリックすることで弾を発射できます。
----------------------------------------------------
キーボードでITEMを選択できます
z : STRAIGHT
x : HURA-HURA
c : SPEED
v : R_TURN
b : L_TURN

----------------------------------------------------



アステロイド #2ch のプログラムは以下のとおりになっています(いろいろあるので、主な部分を抜粋)

 

<メインのフレームアクション>

stop();
//--------初期設定--------
//numは敵機の数
num = 10;
score = 0;
level = 1;
//dlevelは次のレベルにいくときに必要なスコア
dlevel = 1000;
time = 0;
//レベルアップの音の生成
lvUP_se = new Sound();
lvUP_se.attachSound("lvUP_SE");
//敵を出現させる関数
teki();
function teki() {
 //敵が100以上にはならないようにする。(それ以前にそこまでいけんorz)
 if (num>100) {
  num = 100;
 }
 //敵機の生成
 for (i=-1; i>=-num; i--) {
  _root.attachMovie("teki", "teki"+(-i), i, {_visible:false, _x:Math.random()*1000-500+Stage.width/2, _y:Math.random()*1000-500+Stage.height/2});
 }
 num += 1;
}
//前のシーンに戻るための関数
function prev_scene() {
 prevScene();
}
onEnterFrame = function () {
 //レベルアップに必要なスコアにいったとき
 if (score%(dlevel+100)>=dlevel) {
  //レベルアップを表示
  now_level._visible = true;
  //敵の再配置
  teki();
  //次レベルまでのタスク設定
  dlevel += Math.floor(dlevel/200)*100;
  //レベルアップ
  level++;
  //カウントを初期化
  time = 0;
  //レベルアップ音の再生
  lvUP_se.start();
 }
 //カウント
 time++;
 if (time>50) {
  //カウントが50フレーム分加算されたら、レベルアップを非表示にする
  now_level._visible = false;
 }
};

<主砲のムービークリップアクション>

onClipEvent (load) {
 //--------初期設定--------
 //numは弾の数。
 num = 1;
 time = 0;
 //弾の種類の初期設定
 tama_data = "straight";
 //弾の発射音の生成
 tama_se = new Sound();
 tama_se.attachSound("tama_SE");
}
onClipEvent (mouseMove) {
 //主砲の角度を変える。(updateAfterEventを使って動きを滑らかにする)
 dx = _root._xmouse-_x;
 dy = _root._ymouse-_y;
 rad = Math.atan2(-dx, dy);
 deg = rad*180/Math.PI;
 _rotation = deg;
 updateAfterEvent();
}
onClipEvent (keyDown) {
 //------弾種変更の設定-------
 if (Key.isDown(90)) {
  //zキーを押したとき
  _root.sentaku._y = 338.5;
  tama_data = "straight";
 } else if (Key.isDown(88)) {
  //xキーを押したとき
  _root.sentaku._y = 350;
  tama_data = "hura-hura";
 } else if (Key.isDown(67)) {
  //cキーを押したとき
  _root.sentaku._y = 362.5;
  tama_data = "speed";
 } else if (Key.isDown(86)) {
  //vキーを押したとき
  _root.sentaku._y = 375;
  tama_data = "r_turn";
 } else if (Key.isDown(66)) {
  //bキーを押したとき
  _root.sentaku._y = 387;
  tama_data = "l_turn";
 }
}
onClipEvent (mouseDown) {
 //前の弾を打ってから3フレーム進んでいたら次の弾を発射する。
 if (time>3) {
  //弾の発射音を再生
  tama_se.start(0.05);
  //主砲のノックバックの表現を再生
  this.gotoAndPlay(2);
  //弾は1画面中に10個までしか発射できない。(敵機の当たり判定の関係でこうなった(技術不足))
  if (10<num) {
   num = 1;
  }
  //弾の生成
  _root.attachMovie("tama", "tama"+num, num, {_x:this._x-_width/5*Math.sin(rad), _y:this._y+_height/5*Math.cos(rad), rad:rad, tama:tama_data});
  num++;
  //カウントを0に戻す。
  time = 0;
 }
}
onClipEvent (enterFrame) {
 //時間の経過を取得
 time++;
}

 

<弾のムービークリップアクション>

//弾の移動差
wid = 12;
hei = 12;
onEnterFrame = function () {
 //--------弾種の設定--------
 if (tama == "straight") {
  x_sp = Math.sin(rad);
  y_sp = Math.cos(rad);
  _x -= x_sp*wid;
  _y += y_sp*hei;

  if (_x<-_width || _y<-_height || Stage.width<_x || Stage.height<_y) {
   removeMovieClip(this);
  }
 } else if (tama == "hura-hura") {
  x_sp = Math.sin(rad+(Math.random()-0.5)*3);
  y_sp = Math.cos(rad+(Math.random()-0.5)*3);
  _x -= x_sp*wid;
  _y += y_sp*hei;
  if (_x<-_width || _y<-_height || Stage.width<_x || Stage.height<_y) {
   removeMovieClip(this);
  }
 } else if (tama == "speed") {
  x_sp = Math.sin(rad);
  y_sp = Math.cos(rad);
  _x -= x_sp*wid*2;
  _y += y_sp*hei*2;
  if (_x<-_width || _y<-_height || Stage.width<_x || Stage.height<_y) {
   removeMovieClip(this);
  }
 } else if (tama == "r_turn") {
  x_sp = Math.sin(rad);
  y_sp = Math.cos(rad);
  _x -= x_sp*wid*1.5;
  _y += y_sp*hei*1.5;
  rad += 0.1;
  if (_x<-_width || _y<-_height || Stage.width<_x || Stage.height<_y) {
   removeMovieClip(this);
  }
 } else if (tama == "l_turn") {
  x_sp = Math.sin(rad);
  y_sp = Math.cos(rad);
  _x -= x_sp*wid*1.5;
  _y += y_sp*hei*1.5;
  rad -= 0.1;
  if (_x<-_width || _y<-_height || Stage.width<_x || Stage.height<_y) {
   removeMovieClip(this);
  }
 }
};

 

<敵機のムービークリップアクション>

stop();
//敵機破壊音の生成
teki_se = new Sound();
teki_se.attachSound("teki_SE");
//自機破壊音の生成
end_se = new Sound();
end_se.attachSound("end_SE");
onEnterFrame = function () {
 //最初、または再配置の時ifを実行
 if (frg != 1) {
  for (; ; ) {
   if (0<_x && _x<Stage.width && 0<_y && _y<Stage.height) {
    //座標がステージ外になるまで再配置
    _x = Math.random()*1000-500+Stage.width/2;
    _y = Math.random()*1000-500+Stage.height/2;
   } else {
    //座標がステージ中になったら見えるようにする
    _visible = true;
    break;
   }
  }
  //ステージの大きさを取得
  sw = Stage.width;
  sh = Stage.height;
  //主砲と敵機の角度を決定
  dx = _x-_root.jiki._x;
  dy = _y-_root.jiki._y;
  rad = Math.atan2(dx, -dy)+(Math.random()-0.5)/5;
  deg = rad*180/Math.PI;
  _rotation = deg;
  //主砲の速度
  speed = 2;
  //再配置完了のフラッグ
  frg = 1;
 } else {
  //ステージから大分離れたら再配置
  if (500+sw/2<_x || _x+sw/2<-500 || 500+sh/2<_y || _y<-500+sh/2) {
  frg = 0;
 }
  //弾に当たったら破壊ムービーを再生して再配置
  //ifの条件が長いのは勉強不足だからです。forでやったら処理が重くなったのでこっちにしました。
  if (this.hitTest(_root.tama1) || this.hitTest(_root.tama2) || this.hitTest(_root.tama3) || this.hitTest(_root.tama4) || this.hitTest(_root.tama5) || this.hitTest(_root.tama6) || this.hitTest(_root.tama7) || this.hitTest(_root.tama8) || this.hitTest(_root.tama9) || this.hitTest(_root.tama10)) {
   //スコア加算
   _root.score += 100;
   //破壊ムービー再生
   play();
   //破壊音再生(2重再生回避にstopを入れた)
   teki_se.stop("teki_SE");
   teki_se.start(0.1);
  }
  //移動用の計算
  _x -= speed*Math.sin(rad);
  _y += speed*Math.cos(rad);
  if (_root.jiki.hitTest(_x, _y, true)) {
   //主砲に当たったら終了音を鳴らす
   end_se.start("end_SE");
   //終了画面へ移動
   _root.gotoAndPlay("end");
  }
 }
};



最近FLASHいじってないし、プログラミング自体もあんまりやってなくて、なまってきた気がしたので、作ってみようかなということで作ったゲームです。

前回ゲーム(Morning893.)を作って反省した点を踏まえて作ったので、まぁまぁ普通にはできたと思います。

前回の反省点。

 ・先に計画を立ててから作るべし。(前回後付後付の繰り返しで、プログラムがめちゃくちゃになってしまったため。)

 ・できるだけ効率よくプログラムすべし。(上と同じようだが、できるだけ短くしたほうが楽。とはいっても、実際効率がいいとは言えないようですが・・・頭が弱いだけに悔やまれる・・・)

 ・音、エフェクト、絵。細部まで作りこむべし。(前回の反響として大きかったものとして、ひとつはSE部分だった。加えて、自分が面白いゲームと思うものは、絵がきれい。または、エフェクトがかっこいい。音楽がきれい。とか、細部のこだわりが見て取れるものであったから。)

といった感じだが、1つ目は実行できた。2つ目はなるべく自分なりに努力してみた。3つ目は音、エフェクトに関しては、ある程度考えてつけたが、絵の部分はお粗末・・・。絵(画)は、大変です・・・

 

システムは1日目で作って、2日目に音をつけました。ってことで製作日数は2日。大分早くできるようになった気がする。とはいってもまだまだ内容が薄い(お粗末、プログラム汚い)ので、勉強しないとね・・・。まぁ、いろいろ感想はあるんだけど、まぁまぁの作品が1つ作れてよかった。

 

PS.ゲーム製作について書いてある本買えばよかった・・・



今回製作したファイル

 

astero_2ch.fla

astero_2ch.swf(「右クリック→対象をファイルに保存(A)...」で保存できます)

 

FLASHへ