▼ActionScript 2.0メモ▼
障害物避けゲーム


障害物避けゲームを作成する。画面をクリック後、キーボードで操作できる。




画像の準備
iamge0.png0.png

image1.png1.png

image2.png2.png


ソースコード
BroomFight.as
//障害物避けゲーム
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];
    }
}

application.xml
<?xml version="1.0" encoding="iso-8859-1"?>

<!-- バージョン=7,画面サイズ=176x208,フレームレート=10フレーム/秒 -->
<movie version="7" width="176" height="208" framerate="10">

    <!-- 背景色=白 -->
    <background color="#ffffff"/>

    <!-- class.swfを含める -->
    <clip import="classes.swf" />
       
    <frame>
        <library>
            <!-- アプリケーション -->
            <clip id="Application" class="BroomFight" />

            <!-- 画像ファイル -->
            <clip id="image0" import="0.png" />
            <clip id="image1" import="1.png" />
            <clip id="image2" import="2.png" />
        </library>

        <!-- アプリケーションをXY座標(0,0)、深度1000に配置 -->
        <place id="Application" name="app" x="0" y="0" depth="1000" />
    </frame>
</movie>


コンパイル
mtasc -version 7 -swf classes.swf -header 176:208:100 BroomFight
swfmill simple application.xml BroomFight.swf




−戻る−