アステロイド #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)...」で保存できます)
|