package {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.filesystem.*;
import flash.text.*;
import flash.utils.*;
//シューティングゲーム
public class ShootingGame extends Sprite {
//シーン定数
private static const S_TITLE:int =0;//タイトル
private static const S_PLAY:int =1;//プレイ
private static const S_TIMEOVER:int=2;//タイムオーバー
//ファイル定数
private static const FILE_GAME:File=
File.applicationStorageDirectory.resolvePath("game.dat");
//素材クラス
[Embed(source='background.swf')]
private var BackGround:Class;
[Embed(source='fighter.swf')]
private var Fighter:Class;
//素材オブジェクト
private var fighter:Sprite; //戦闘機
private var enemy:Array=new Array(0);//敵機
//システム
private var init:int =S_TITLE; //初期化
private var scene:int=S_TITLE; //シーン
private var score:int=0; //スコア
private var hiscore:int=0; //ハイスコア
private var time:int=0; //タイム
private var clickTime:Number=0;//前回クリック時間
//コンポーネント
private var base:Sprite; //ベース
private var label:Object=new Object(); //ラベル
private var format:Object=new Object();//ラベル
//コンストラクタ
public function ShootingGame() {
//ベースの生成
base=new Sprite();
base.graphics.beginFill(0xFFFFFF);
base.graphics.drawRect(0,0,640,480);
base.graphics.endFill();
base.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
addChild(base);
//背景の生成
base.addChild(new BackGround());
//戦闘機の生成
fighter=new Fighter();
fighter.x=320;
fighter.y=300;
base.addChild(fighter);
//ラベルの生成
label["score"]=Util.makeLabel(0,0,640,80);
base.addChild(label["score"]);
label["hiscore"]=Util.makeLabel(0,0,640,40);
base.addChild(label["hiscore"]);
label["title"]=Util.makeLabel(0,80,640,80);
base.addChild(label["title"]);
//ラベル書式の生成
format["title"]=Util.makeTextFormat(50,0xFF3333,
TextFormatAlign.CENTER);
format["score"]=Util.makeTextFormat(30,0xEE4444);
format["hiscore"]=Util.makeTextFormat(30,0xEE4444,
TextFormatAlign.RIGHT);
//ウィンドウサイズの調整
stage.scaleMode=StageScaleMode.SHOW_ALL;
//ウィンドウリサイズイベントの追加
stage.nativeWindow.addEventListener(
NativeWindowBoundsEvent.RESIZE,onResizeWindow);
//ファイルの読み込み
try {
hiscore=parseInt(Util.readFile(FILE_GAME));
} catch (e:Error) {
hiscore=0;
}
//タイマーの追加
var timer:Timer=new Timer(100,0);
timer.addEventListener(TimerEvent.TIMER,onTick);
timer.start();
}
//ウィンドウリサイズイベントの処理
private function onResizeWindow(evt:NativeWindowBoundsEvent):void {
var rect:Shape=new Shape();
rect.graphics.beginFill(0x000000);
rect.graphics.lineStyle(0,0x000000);
rect.graphics.drawRect(0,0,640,480);
rect.graphics.endFill();
this.mask=rect;
}
//マウスダウンイベントの処理
private function onMouseDown(evt:MouseEvent):void {
//クリック
if (scene==S_TITLE) {
init=S_PLAY;
} else if (scene==S_TIMEOVER) {
init=S_TITLE;
}
//ダブルクリック
if (getTimer()-clickTime<300) Util.changeScreen(stage);
clickTime=getTimer();
}
//タイマーイベントの処理
private function onTick(evt:TimerEvent):void {
var i:int,idx:int,e:Enemy;
//初期化
if (init>=0) {
//タイトル
if (init==S_TITLE) {
//敵の削除
for (i=enemy.length-1;i>=0;i--) {
if (enemy[i].bom==null) {
base.removeChild(enemy[i].normal);
} else {
base.removeChild(enemy[i].bom);
}
enemy.splice(i,1);
}
//システム
score =0;
time =300;
fighter.x=320;
fighter.y=300;
//コンポーネント
editLabel("title","スペースジーク AIR");
editLabel("score","SCORE:"+score);
editLabel("hiscore","HI SCORE:"+hiscore);
}
//プレイ
else if (init==S_PLAY) {
editLabel("title","");
}
//タイムオーバー
else if (init==S_TIMEOVER) {
fighter.rotation=0;
//ハイスコア
if (hiscore<score) {
hiscore=score;
editLabel("title","New Record!");
editLabel("hiscore","HI SCORE:"+hiscore);
Util.writeFile(FILE_GAME,""+hiscore);
}
//ハイスコア未満
else {
editLabel("title","任務完了");
}
}
//共通の初期化
scene=init;
init =-1;
}
//プレイ
if (scene==S_PLAY) {
//スコア
if (--time<10) init=S_TIMEOVER;
editLabel("score","SCORE:"+score+"\nTIME :"+Math.floor(time/10));
//敵機の撃ち落し判定
for (i=0;i<enemy.length;i++) {
if (enemy[i].isHit(fighter.x,fighter.y)) {
idx=base.getChildIndex(enemy[i].normal);
base.removeChild(enemy[i].normal);
base.addChildAt(enemy[i].bom,idx);
score+=10;
}
}
//戦闘機の移動
fighter.rotation=0;
if (Math.abs(mouseX-fighter.x)<60) fighter.x=mouseX;
if (Math.abs(mouseY-fighter.y)<40) fighter.y=mouseY;
if (mouseX<fighter.x) {fighter.x-=60;fighter.rotation=-10;}
if (mouseX>fighter.x) {fighter.x+=60;fighter.rotation=10;}
if (mouseY<fighter.y) fighter.y-=40;
if (mouseY>fighter.y) fighter.y+=40;
}
//敵機の移動と削除
for (i=enemy.length-1;i>=0;i--) {
//敵の移動
if (enemy[i].move()) continue;
//敵の削除
if (enemy[i].bom==null) {
base.removeChild(enemy[i].normal);
} else {
base.removeChild(enemy[i].bom);
}
enemy.splice(i,1);
}
//敵機の出現
if (scene==S_PLAY && Util.rand(100)<30) {
e=new Enemy();
base.addChildAt(e.normal,1);
enemy.push(e);
}
}
//ラベルの編集
private function editLabel(key:String,text:String):void {
label[key].text=text;
label[key].setTextFormat(format[key]);
}
}
}
|