▼Papervision3Dメモ▼
ゲームの作成


前方から接近する隕石を避け続けた時間を競うゲーム「SpaceChace」を作成する。


方向キー 戦闘機の移動
Enterキー ゲーム開始
Spaceキー 視点変更


リソースの準備
SWFを配置するフォルダにモデルファイル「fighter.mqo」「rock.mqo」を配置。



ソースコードの編集
SpaceChace.as
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);
        }
    }
}


ビルド
mxmlc -source-path C:\flash\PV3D_1_5\src -default-size 480 480 -default-frame-rate=30 -default-background-color=0x6395EE SpaceChace.as




−戻る−