package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.ui.*;
import flash.utils.*;
import org.papervision3d.scenes.*;
import org.papervision3d.objects.*;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.libspark.pv3d.*;
//ゲームの作成
public class SpaceChace extends Sprite {
//定数
public const S_PLAY:int =0;//プレイ
public const S_GAMEOVER:int=1;//ゲームオーバー
//システム
private var base :Sprite;//ベース
private var keyCode:int; //キーコード
//モデル
private var container:Sprite; //コンテナ
private var scene3D :Scene3D; //シーン
private var camera :Camera3D; //カメラ
private var fighter :DisplayObject3D;//戦闘機
private var rock :Array; //岩
//ラベル
private var textFormat:TextFormat;//テキスト書式
private var lblScore:TextField; //スコアラベル
private var lblGameOver:TextField;//ゲームオーバーラベル
//ゲーム
private var init :int;//初期化
private var scene :int;//シーン
private var score :int;//スコア
private var cameraMode:int;//カメラモード
//コンストラクタ
public function SpaceChace():void {
//ステージの設定
stage.quality ="MEDIUM";
stage.scaleMode="noScale";
stage.align =StageAlign.TOP_LEFT;
stage.stageFocusRect=false;
//ベース
base=new Sprite();
base.graphics.beginFill(0x6395EE);
base.graphics.drawRect(0,0,480,480);
base.graphics.endFill();
addChild(base);
keyCode=-1;
//コンテナの生成
container=new Sprite();
base.addChild(container);
container.x=stage.stageWidth /2;
container.y=stage.stageHeight/2;
//シーンの生成
scene3D=new Scene3D(container);
//カメラの生成
camera=new Camera3D();
camera.x=0;
camera.y=-100;
camera.z=200;
cameraMode=1;
//モデルの読み込み
fighter=scene3D.addChild(new Metasequoia_1_5("fighter.mqo"));
fighter.rotationY=180;
fighter.rotationX=90;
rock=new Array(10);
for (var i:int=0;i<rock.length;i++) {
rock[i]=scene3D.addChild(new Metasequoia_1_5("rock.mqo"));
rock[i].rotationY=180;
rock[i].rotationX=90;
}
//テキスト書式の指定
textFormat=new TextFormat();
textFormat.font ="_等幅";
textFormat.size =20;
textFormat.color =0xFFFFFF;
textFormat.bold =true;
//スコアラベルの生成
lblScore=new TextField();
lblScore.text ="SCORE:0";
lblScore.autoSize =TextFieldAutoSize.LEFT;
lblScore.selectable=false;
lblScore.setTextFormat(textFormat);
base.addChild(lblScore);
//ゲームオーバーラベルの生成
lblGameOver=new TextField();
lblGameOver.y =200;
lblGameOver.width =480;
lblGameOver.text ="G A M E O V E R";
lblGameOver.autoSize =TextFieldAutoSize.CENTER;
lblGameOver.selectable=false;
lblGameOver.visible=false;
lblGameOver.setTextFormat(textFormat);
base.addChild(lblGameOver);
//初期化
init=S_PLAY;
//イベントリスナーの追加
base.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
base.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
base.addEventListener(MouseEvent.CLICK,onClick);
//定期処理イベントの指定
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
//定期処理
private function onEnterFrame(evt:Event):void {
var i:int;
//初期化
if (init>=0) {
if (init==S_PLAY) {
fighter.x=0;
fighter.y=-200;
for (i=0;i<rock.length;i++) {
rock[i].x=rand(800)-400;
rock[i].y=500+rand(1000);
}
lblGameOver.visible=false;
} else {
lblGameOver.visible=true;
}
scene=init;
init=-1;
}
//プレイ
if (scene==S_PLAY) {
//スコアの加算
lblScore.text="SCORE:"+(++score);
lblScore.setTextFormat(textFormat);
for (i=0;i<rock.length;i++) {
//岩の移動
rock[i].y-=10;
if (rock[i].y<-500) {
rock[i].x=rand(800)-400;
rock[i].y=500+rand(1000);
}
//ゲームオーバー判定
if (isHit(fighter.x,fighter.y,rock[i].x,rock[i].y)) {
init=S_GAMEOVER;
}
}
//キー操作
if (keyCode==Keyboard.LEFT) {
if (fighter.x< 300) fighter.x+=10;
} else if (keyCode==Keyboard.RIGHT) {
if (fighter.x>-300) fighter.x-=10;
} else if (keyCode==Keyboard.UP) {
if (fighter.y< 300) fighter.y+=10;
} else if (keyCode==Keyboard.DOWN) {
if (fighter.y>-300) fighter.y-=10;
}
}
//ゲームオーバー
else if (scene==S_GAMEOVER) {
//キー操作
if (keyCode==Keyboard.ENTER) {
init=S_PLAY;
}
}
//視点切り替え
if (keyCode==Keyboard.SPACE) {
keyCode=-1;
if (cameraMode==0) {
cameraMode=1;
camera.y=-100;
camera.z=200;
} else {
cameraMode=0;
camera.x=0;
camera.y=0;
camera.z=300;
}
}
//レンダリング
scene3D.renderCamera(camera);
}
//キーダウンイベントの処理
private function onKeyDown(evt:KeyboardEvent):void {
keyCode=evt.keyCode;
}
//キーアップイベントの処理
private function onKeyUp(evt:KeyboardEvent):void {
keyCode=-1;
}
//マウスクリックイベントの処理
private function onClick(evt:MouseEvent):void {
stage.focus=base;
}
//岩の衝突判定
private function isHit(x0:Number,y0:Number,x1:Number,y1:Number):Boolean {
return (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)<8000;
}
//乱数の取得
public function rand(num:Number):Number {
return Math.floor(Math.random()*num);
}
}
}
|