▼Adobe AIRメモ▼
シューティングゲーム


シューティングゲームを作成する。


リソース
background.swf
bom.swf
fighter.swf
normal.swf


ソースコード
ShootingGame.as
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]);        
        }
    }
}

Enemy.as
package {
    import flash.display.*;
    
    //敵機
    public class Enemy {
        //素材クラス
        [Embed(source='normal.swf')]
        private var Normal:Class;
        [Embed(source='bom.swf')]
        private var Bom:Class;

        //プロパティ
        public  var normal:Sprite;//通常
        public  var bom:Sprite;   //爆発
        private var vx:int;       //X軸方向の移動速度
        private var vy:int;       //Y軸方向の移動速度
        
        //コンストラクタ
        public function Enemy() {
            normal=new Normal();
            normal.x =170+Util.rand(300);
            normal.y =120+Util.rand(100);
            normal.width =40;
            normal.height=20;
            bom=null;
            vx=(normal.x<320)?-5:5;
            vy=(normal.y<170)?-3:3;
        }
        
        //移動
        public function move():Boolean {
            if (normal.width>=120) return false;
               normal.x+=vx;
               normal.y+=vy;
               normal.width+=5;
               normal.height=normal.width/2;
               return true;
        }
        
        //撃ち落し判定
        public function isHit(x:int,y:int):Boolean {
            if (Util.calcLen(x,y,normal.x,normal.y)>2500 || 
                bom!=null) return false;
            //爆発の生成
            bom=new Bom();
            bom.x=normal.x;
            bom.y=normal.y;
            bom.width =normal.height/5;
            bom.height=normal.height/5;
            return true;
        }
    }
}

Util.as
package {
    import flash.display.*;
    import flash.filesystem.*;
    import flash.text.*;

    //ユーティリティ
    public class Util {
        //ラベルの生成
        public static function makeLabel(x:int,y:int,w:int,h:int,
            autoSize:String=TextFieldAutoSize.NONE):TextField {
            var label:TextField=new TextField();
            label.selectable=false;
            label.x       =x;
            label.y       =y;
            label.width   =w;
            label.height  =h;
            label.autoSize=autoSize;
            return label;
        }

        //テキストフォーマットの生成
        public static function makeTextFormat(size:uint,color:uint,
            align:String=TextFormatAlign.LEFT):TextFormat {
            var format:TextFormat=new TextFormat();
            format.font ="_等幅";
            format.size =size;  
            format.color=color;
            format.bold =true;
            format.align=align;
            return format;
        }

        //2点間の距離の2乗の計算
        public static function calcLen(x0:int,y0:int,x1:int,y1:int):int {
            return (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0);
        }

        //乱数の取得
        public static function rand(num:uint):int {
            return Math.floor(Math.random()*num);
        }

        //ファイルの読み込み
        public static function readFile(file:File):String {
            var result:String=null;
            try {
                var fsr:FileStream=new FileStream();
                fsr.open(file,FileMode.READ);
                result=fsr.readMultiByte(file.size,"shift_jis");
                fsr.close();
            } catch (e:Error) {
            }
            return result;
        }
        
        //ファイルの書き込み
        public static function writeFile(file:File,text:String):Boolean {
            try {
                var fsw:FileStream=new FileStream();
                fsw.open(file,FileMode.WRITE);
                fsw.writeMultiByte(text,"shift_jis");
                fsw.close();
                return true;
            } catch (e:Error) {
            }
            return false;
        }

        //スクリーンモードの変更
        public static function changeScreen(stage:Stage):void {
            if (stage.displayState!=StageDisplayState.FULL_SCREEN) {
                stage.displayState=StageDisplayState.FULL_SCREEN;
            } else {
                stage.displayState=StageDisplayState.NORMAL;
            }
        }
    }
}




−戻る−