In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 忍者 vs インベーダー

/**
 * Copyright tanoshiijunko ( http://wonderfl.net/user/tanoshiijunko )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jV0u
 */

// forked from testtaro's 忍者 vs インベーダー
package {
    import flash.filters.DropShadowFilter;
    import flash.geom.Point;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.display.Sprite;
    
    [SWF(width=450, height=450, backgroundColor=0x222222)]//ステージサイズと背景色指定
    public class FlashTest extends Sprite {
        private const STAGE_SIZE:int = 450;//ステージサイズ
        
        private var colobj:Object = {"1":0xffffff,"2":0xb22222,"3":0x1e90ff,"4":0xffd700,"5":0x006400,"6":0x8B4513};//色テーブル
        
        private var frame:int = 0;//経過フレーム
        private var score:int = 0;//スコア
        private var scoreText:TextField;//スコアの表示用テキストフィールド
        private var time:int = 40;//残り時間
        private var timeText:TextField;//残り時間の表示用テキストフィールド
        
        //各種ボタン押下フラグ
        private var rightFlag:Boolean = false;
        private var leftFlag:Boolean = false;
        private var buttonFlag:Boolean = false;
        
        //各種スプライト
        private var player:Sprite;//プレイヤー
        private var tama:Sprite;//弾
        private var enemy:Array;//敵配列
        
        public function FlashTest() {
            addEventListener(Event.ADDED_TO_STAGE, init);//ステージに追加されたら初期化
        }
        
        //初期化
        private function init(e:Event):void{
            removeEventListener(Event.ADDED_TO_STAGE,init);
            
            //背景
            var bg:Sprite = new Sprite();
            drawDot("bg",bg);
            addChild(bg);
            bg.width = bg.height = STAGE_SIZE;
            
            //点数表示
            scoreText = new TextField();
            scoreText.textColor = 0xffffff;//文字色
            updateScoreText();
            addChild(scoreText);
            
            //残り時間表示
            timeText = new TextField();
            timeText.textColor = 0xffffff;
            timeText.y = 20;
            updateTimeText();
            addChild(timeText);
            
            //プレイヤー生成
            player = new Sprite();
            var player2:Sprite = CreateSprite(0,0,50,50,"player");
            player.addChild(player2);
            player2.x = -25;
            player.x = STAGE_SIZE / 2;
            player.y = STAGE_SIZE - 80;
            addChild(player);
            
            
            //弾生成
            tama = new Sprite();
            var tama2:Sprite = CreateSprite(0,0,30,30,"tama");
            tama.addChild(tama2);
            tama2.x = tama2.y = -15;
            tama.visible = false;
            addChild(tama);
           
            //敵配列
            enemy = new Array();
           
            //イベントリスナー登録
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);//キーダウン
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);//キーアップ
            addEventListener(Event.ENTER_FRAME,update);//毎フレーム
        }
        
        //************************************************
        //メインループ
        //************************************************
        private function update(e:Event):void{
           frame++;//経過フレーム
           if(frame % 30 == 0){//30フレーム毎に残り時間減らす
               time--;
               updateTimeText();//表示更新
               if(time <= 0){//残り時間が0になったらゲームオーバー
                   gameOver();
               }
           }
           
           if(frame % 5 == 0){
               player.scaleX = player.scaleX * -1;
           }           
           
           if(rightFlag){//移動
               player.x += 10;
           }else if(leftFlag == true){
               player.x -= 10;
           }
           
           if(buttonFlag && !tama.visible){//弾発射
               tama.x = player.x;//座標をプレイヤーに合わせる
               tama.y = player.y;
               tama.visible = true;
           }
           
           
           if(tama.visible){//弾更新(表示中だけ)
               tama.y -= 7;
               tama.rotation += 30;//回転
               if(tama.y < -tama.height){//画面外に行ったとき非表示に
                   tama.visible = false;
               }
           }
           
           if(frame % 30 == 0){//敵生成
              var newenemy:Object = createEnemy();//敵オブジェクト
              enemy.push(newenemy);//敵オブジェクトをリストに追加
              addChild(newenemy.sp);//敵スプライトをステージに追加
           }
           
           //敵更新 & 弾との当たり判定
           for(var i:int = enemy.length-1;i >= 0;i--){//要素を削除しても実行順に影響が無いように後ろから更新
               enemy[i].update.call(enemy[i]);//敵更新
               var esp:Sprite = enemy[i].sp;//敵スプライト
               
               //弾が表示中で敵と接触したとき
               //弾を非表示にして敵をステージとリストから取り除く
               if(enemy[i].liveFlag && tama.visible && tama.hitTestObject(esp)){
                   enemy[i].dropStart();
                   tama.visible = false;//弾非表示
                   score++;//得点加算
                   updateScoreText();//表示更新
               }
               
               if(enemy[i].removeFlag == true){//削除フラグがtrueのときステージとリストから取り除く
                 esp.parent.removeChild(esp);//ステージから削除
                 enemy.splice(i,1);//リストから削除
               }
           }
        }
        
        //ゲームオーバー
        private function gameOver():void{
            var gameoverText:TextField = new TextField();//ゲームオーバーテキスト
            gameoverText.textColor = 0xffffff;
            gameoverText.text = "Game Over";
            gameoverText.x = (STAGE_SIZE - gameoverText.width)/2;
            gameoverText.y = (STAGE_SIZE - gameoverText.height)/2;
            addChild(gameoverText);
            
            removeEventListener(Event.ENTER_FRAME,update);//イベントリスナー削除で時間停止
        }
        
        private function updateScoreText():void{//表示スコア更新
            scoreText.text = "Score : " + score.toString();
        }
        
        private function updateTimeText():void{//表示時間更新
            timeText.text = "Time : " + time.toString();
        } 
       
       //スプライト生成、指定のidでドット絵を描画させる
       private function CreateSprite(tx:Number,ty:Number,tw:Number,th:Number,id:String):Sprite{
            var sp:Sprite = new Sprite();
            sp.x = tx; sp.y = ty;
            drawDot(id,sp);//ドット絵の描画
            sp.width = tw; sp.height = th;
            sp.filters = [new DropShadowFilter(8)];//フィルター
            return sp;
        } 
        
        private function createEnemy():Object{//敵の生成
            var obj:Object = new Object();
            obj.sp = CreateSprite(-30,rnd(200) + 50,30,30,"enemy" + rnd(2).toString());
            obj.liveFlag = true;//生存フラグ
            obj.removeFlag = false;//削除フラグ
            
            obj.boundCount = 4;//バウンド回数
            obj.dropVy = -5;//初期値
            obj.dropAy = 1;//加速度
            
            //ランダムで更新関数と初期位置を設定
            obj.sp.width = obj.sp.height = 30 + (rnd(4) * 10);//大きさ
            obj.lineY = obj.sp.y;//横移動の基準になる高さ
            obj.spd = (rnd(4) + 4);//移動速度
            
            if(rnd(2) == 1){//右から
                obj.sp.x = STAGE_SIZE;
                obj.spd = -obj.spd;
            }
            
            obj.moveUpdate = function():void{
                this.sp.x += this.spd;
                this.sp.y = this.lineY + (Math.sin((this.sp.x / 10)) * 10);//上下に揺らす
                if(this.sp.x > STAGE_SIZE + 30 || this.sp.x < -30){//画面外に出たらステージとリストから取り除く
                      this.removeFlag = true; 
                }
            }
            
            obj.dropUpdate = function():void{
                this.dropVy += this.dropAy;
                this.sp.y += this.dropVy;
                
                if(this.boundCount > 0){
                    if(this.sp.y > (STAGE_SIZE - this.sp.height)){
                        this.sp.y = STAGE_SIZE - this.sp.height;
                        this.dropVy = -(this.dropVy * 0.5);
                        this.boundCount--;
                    }
                }else if(this.sp.y > STAGE_SIZE){//画面外に落ちたら削除
                    this.removeFlag = true;
                }
            }
            
            obj.dropStart = function():void{
                this.liveFlag = false;
                this.update = this.dropUpdate;
                this.sp.alpha = 0.3;
            }
            
            obj.update = obj.moveUpdate;
            
            return obj;
        }
        
        //スプライトにドット絵を描き込む
        private function drawDot(id:String,sp:Sprite):void{
            var dot:Array = new Array(5);//ドットデータ
            
            switch(id){
                case "player"://プレイヤー
                    dot[0] = "0011100";
                    dot[1] = "1013300";
                    dot[2] = "1111111";
                    dot[3] = "0011101";
                    dot[4] = "0010100";
                break;
                case "enemy0"://敵1
                    dot[0] = "20002";
                    dot[1] = "22222";
                    dot[2] = "21212";
                    dot[3] = "22222";
                    dot[4] = "02020";
                break;
                case "enemy1"://敵2
                    dot[0] = "02220";
                    dot[1] = "22222";
                    dot[2] = "02120";
                    dot[3] = "22222";
                    dot[4] = "20202";
                break;
                case "tama"://弾
                    dot[0] = "00400";
                    dot[1] = "04440";
                    dot[2] = "44044";
                    dot[3] = "04440";
                    dot[4] = "00400";
                break;
                case "bg"://背景
                    dot[0] = "333333333333333333";
                    dot[1] = "333111133333333333";
                    dot[2] = "331111113333311133";
                    dot[3] = "333333333333111113";
                    dot[4] = "333333333333333333";
                    dot[5] = "333333333333333333";
                    dot[6] = "335553555333333333";
                    dot[7] = "335653565333333333";
                    dot[8] = "333633363333333333";
                    dot[9] = "555555555555555555";
                break;
            }
            
            var tw:int = String(dot[0]).length;
            var th:int = dot.length;
            for(var i:int = 0;i < th;i++){
                for(var j:int = 0;j < tw;j++){
                    var colchar:String = String(dot[i]).substring(j,j+1);
                    if(colchar != "0"){
                        sp.graphics.beginFill(colobj[colchar],1);
                        sp.graphics.drawRect(j * 10,i * 10,10,10);
                        sp.graphics.endFill();
                    }
                }
            }
        }
        
        //乱数
        private function rnd(val:int):int{
            return Math.floor(Math.random() * val);
        }
        
        //************************************************
        //入力
        //************************************************
        //キーダウン
        private function keyDownHandler(e:KeyboardEvent):void{
            switch(e.keyCode){
                case Keyboard.RIGHT:
                    rightFlag = true;
                break;
                case Keyboard.LEFT:
                    leftFlag = true;
                break;
                case 65://Aキー
                    buttonFlag = true;
                break;
            }
        }
        
        //キーアップ
        private function keyUpHandler(e:KeyboardEvent):void{
            switch(e.keyCode){
                case Keyboard.RIGHT:
                    rightFlag = false;
                break;
                case Keyboard.LEFT:
                    leftFlag = false;
                break;
                case 65://Aキー
                    buttonFlag = false;
                break;
            }
        }
        
    }
}