//障害物避けゲーム
class BroomFight extends MovieClip {
//シーン
private var S_TITLE :Number=1;//タイトル
private var S_PLAY :Number=2;//プレイ
private var S_GAMEOVER:Number=3;//ゲームオーバー
//システム
private var init:Number; //初期化
private var scene:Number; //シーン
private var image:Array=new Array(20);//イメージ
private var label:Array=new Array(2); //ラベル
private var format:Array=new Array(2);//フォーマット
//ゲーム
private var score:Number; //スコア
private var speed:Number; //スピード
private var keyPress:Boolean;//キープレス
//コンストラクタ
function BroomFight() {
var ref:Object=this;
var i,j:Number;
var keyListener:Object=new Object();
//システム
init=S_TITLE;
format[0]=new TextFormat();
format[0].size=16;
format[1]=new TextFormat();
format[1].size=24;
//イメージ
image[0]=addMovie("image0","image0");
image[0]._y=178;
image[0]._visible=true;
image[1]=addMovie("image1","image1");
image[1]._x=32-16;
image[1]._visible=true;
for (i=2;i<20;i++) image[i]=addMovie("image"+i,"image2");
//ラベル
label[0]=addLabel("label0","SCORE:0",16);
label[0]._visible=true;
label[1]=addCenterLabel("label1","",24,30);
label[1]._visible=true;
//キーイベント
Key.addListener(keyListener);
keyListener.onKeyDown=function() {
ref.keyPress=true;
}
keyListener.onKeyUp=function() {
ref.keyPress=false;
}
//タイマー
createEmptyMovieClip("timer",getNextHighestDepth());
this["timer"].onEnterFrame=function():Void {
ref.tick();
};
}
//定期処理
function tick():Void {
var i,j:Number;
//初期化
if (init>=0) {
//タイトル
if (init==S_TITLE) {
image[1]._y=100-16;
for (i=2;i<20;i++) image[i]._visible=false;
label[1].text="BroomFight";
label[1].setTextFormat(format[1]);
}
//プレイ
else if (init==S_PLAY) {
label[1].text="";
score=0;
speed=0;
}
//ゲームオーバー
else if (init==S_GAMEOVER) {
label[1].text="GAME OVER";
label[1].setTextFormat(format[1]);
}
keyPress=false;
scene =init;
init =-1;
}
//タイトルの処理
else if (scene==S_TITLE) {
if (keyPress) init=S_PLAY;
}
//プレイの処理
else if (scene==S_PLAY) {
//スコア
score++;
label[0].text="SCORE:"+score;
label[0].setTextFormat(format[0]);
//キャラの位置
if (keyPress) {
if (speed>-20) speed--;
} else {
if (speed<20) speed++;
}
image[1]._y+=speed;
if (image[1]._y<-16 || image[1]._y>208-16) init=S_GAMEOVER;
//星の出現
if (rand(10)==0) {
for (i=2;i<20;i++) {
if (image[i]._visible) continue;
image[i]._y=rand(200)-8;
image[i]._x=176;
image[i]._visible=true;
break;
}
}
//星の移動
for (i=2;i<20;i++) {
if (!image[i]._visible) continue;
image[i]._x-=3;
if (calcLen(image[1]._x+16,image[1]._y+16,image[i]._x+8,image[i]._y+8)<100) {
init=S_GAMEOVER;
}
if (image[i]._x<-32) image[i]._visible=false;
}
}
//ゲームオーバーの処理
else if (scene==S_GAMEOVER) {
if (keyPress) init=S_TITLE;
}
}
//距離の2乗の計算
private function calcLen(x0:Number,y0:Number,x1:Number,y1:Number):Number {
return (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1);
}
//乱数の取得
private function rand(num:Number):Number {
return Math.floor(Math.random()*num);
}
//ムービーの追加
private function addMovie(name:String,linkageID:String):MovieClip {
createEmptyMovieClip(name,getNextHighestDepth());
this[name].attachMovie(linkageID,linkageID,getNextHighestDepth());
this[name]._visible=false;
return this[name];
}
//ラベルの追加
private function addLabel(name:String,text:String,size:Number):TextField {
var format:TextFormat=new TextFormat();
format.size=size;
createTextField(name,getNextHighestDepth(),0,0,0,0);
this[name].selectable=false;
this[name].autoSize="left";
this[name].text=text;
this[name].setTextFormat(format);
this[name]._visible=false;
return this[name];
}
//センターラベルの追加
private function addCenterLabel(name:String,text:String,size:Number,y:Number):TextField {
var format:TextFormat=new TextFormat();
format.size=size;
createTextField(name,getNextHighestDepth(),0,y,_width,size+10);
this[name].selectable=false;
this[name].autoSize="center";
this[name].text=text;
this[name].setTextFormat(format);
this[name]._visible=false;
return this[name];
}
}
|