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: Shooter Game 応用形

シューティングゲーム
使用するパッケージをインポートする
Get Adobe Flash player
by TodaTakuya 24 Jan 2012
    Embed
/**
 * Copyright TodaTakuya ( http://wonderfl.net/user/TodaTakuya )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/4R6x
 */

// forked from DanYuya's Shooter Game 応用形
// forked from DanYuya's Shooter Game 基本形
// シューティングゲーム
package {
    // 使用するパッケージをインポートする
    import fl.controls.*;
    import flash.text.*;
    import flash.display.Sprite;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;
        
    public class ShooterGame extends Sprite {
        public var timer:Timer;        // タイマー
        public var enemyTimer:Timer;   // タイマー(敵機)
        public var myCombat:Sprite;    // 自機
        public var myBullet:Array;     // 自機の弾丸(複数)
        public var vy:Array;           // 自機の弾丸の速度(y方向)
        public var enemy:Sprite;       // 敵機
        public var theta:Number = 0.0;       // 敵機の位相
        public var myCombathitFlag:Boolean = false;  // 自機衝突判定
        public var enemyhitFlag:Boolean = false;  // 敵機衝突判定
        public var compBubble:Array;     // 敵機の弾丸(すべて)
        public var bubbleVelocity:Array; // 敵機の弾丸とビームの速度(y方向)
        public var tf:TextFormat;      // ラベル
        public var fld:TextField;      // ラベル
        
        public function ShooterGame() {
            // 配列(Array型)のインスタンス生成
            myBullet = new Array();
            vy = new Array();
            compBubble = new Array();
            bubbleVelocity = new Array();
            
            // Sprite 型の自機グラフィックスの生成
            myCombat = new Sprite();
            myCombat.graphics.beginFill( 0x0000FF, 1.0 );
            myCombat.graphics.drawRect( -2, 0, 4, 10 );
            myCombat.graphics.beginFill( 0x0000FF, 1.0 );
            myCombat.graphics.drawRect( -6, 2, 12, 2 );
            myCombat.graphics.beginFill( 0x0000FF, 1.0 );
            myCombat.graphics.drawRect( -3, 8, 6, 2 );
            myCombat.x = stage.mouseX;
            myCombat.y = stage.stageHeight - 50;
            stage.addChild( myCombat );
            
            // 敵機の生成
            enemy = new Sprite();
            enemy.graphics.beginFill( 0x999999, 1 );
            enemy.graphics.drawCircle( 0, 0, 15 );
            enemy.graphics.beginFill( 0x999999, 1 );
            enemy.graphics.drawCircle( -75, -55, 20 );
            enemy.graphics.beginFill( 0x999999, 1 );
            enemy.graphics.drawCircle( +75, -55, 20 );
            enemy.graphics.beginFill( 0x999999, 1 );
            enemy.graphics.drawCircle( -75, +55, 20 );
            enemy.graphics.beginFill( 0x999999, 1 );
            enemy.graphics.drawCircle( +75, +55, 20 );
            enemy.graphics.lineStyle( 5, 0x999999, 0.7 );
            enemy.graphics.moveTo( -75, -55 );
            enemy.graphics.lineTo( +75, 55 );
            enemy.graphics.moveTo( +75, -55 );
            enemy.graphics.lineTo( -75, 55 );
            enemy.x = stage.stageWidth / 2;
            enemy.y = 125;
            stage.addChild( enemy );
            
            // マウス操作に関するイベントハンドラの登録
            stage.addEventListener( MouseEvent.MOUSE_MOVE, mMove );
            stage.addEventListener( MouseEvent.CLICK, mClick );
            
            // タイマーに関するイベントハンドラの登録とタイマーの開始
            timer = new Timer( 50 );
            timer.addEventListener( TimerEvent.TIMER, loop );
            timer.start();
                        
            // 敵機(左前)の攻撃に関するタイマー
            enemyTimer = new Timer( 500 );
            enemyTimer.addEventListener( TimerEvent.TIMER, leftfront );
            enemyTimer.start();
            
            // 敵機(右前)の攻撃に関するタイマー
            enemyTimer = new Timer( 750 );
            enemyTimer.addEventListener( TimerEvent.TIMER, rightfront );
            enemyTimer.start();
            
            // 敵機(左後ろ)の攻撃に関するタイマー
            enemyTimer = new Timer( 1000 );
            enemyTimer.addEventListener( TimerEvent.TIMER, leftback );
            enemyTimer.start();
            
            // 敵機(右後ろ)の攻撃に関するタイマー
            enemyTimer = new Timer( 1250 );
            enemyTimer.addEventListener( TimerEvent.TIMER, rightback );
            enemyTimer.start();            
        }
          
        public function mMove( event:MouseEvent ): void{
            // 自機の位置をマウスの位置(座標)に合わせる
            myCombat.x = stage.mouseX;
            myCombat.y = stage.mouseY;            
        }

        public function mClick( event:MouseEvent ): void{
            // 弾丸のグラフィックスを生成する
            var bullet:Sprite = new Sprite();
            bullet.graphics.beginFill( 0xFF0000, 1.0 );
            bullet.graphics.drawCircle( 0, 0, 5 );
            bullet.graphics.beginFill( 0xFF0000, 0.5 );
            bullet.graphics.drawCircle( 0, 4, 4 );
            bullet.graphics.beginFill( 0xFF0000, 0.25 );
            bullet.graphics.drawCircle( 0, 8, 3 );
            bullet.x = myCombat.x;
            bullet.y = myCombat.y - 10;
            myBullet.push( bullet );    // 弾丸を配列 myBullet に追加する
            vy.push( -10 );   // 弾丸の y 方向の速度
            stage.addChild( myBullet[myBullet.length - 1] );
        }

        public function loop( event:TimerEvent ): void{ // 繰り返し処理
            // 自機の全ての弾丸について
            for( var i:int = 0; i < myBullet.length; i++ ){
                // 位置の計算
                myBullet[i].y += vy[i];
                
                // 衝突の判定
                if( enemy.x - 10 < myBullet[i].x && myBullet[i].x < enemy.x + 10
                 && enemy.y - 10 < myBullet[i].y && myBullet[i].y < enemy.y + 10 ){
                    enemyhitFlag = true;
                }
            }
            // 敵機の移動
            if( !enemyhitFlag ){
                theta += 0.05;
                if( theta > 2 * Math.PI ){
                    theta -= 2 * Math.PI;
                }
                enemy.x = 0.5 * stage.stageWidth * ( 1 + Math.sin( theta ) );
            }
            else{
                // 敵機に自機の弾丸に当たったら(ゲームクリア処理)
                if( enemy.alpha > 0 ){
                    enemy.alpha -= 0.05; // フェードアウト
                }
                else{
                    // 終了処理(ゲームクリア)
                    stage.removeChild( enemy );
                    stage.removeEventListener( MouseEvent.MOUSE_MOVE, mMove );
                    stage.removeEventListener( MouseEvent.CLICK, mClick );
                    timer.stop();
                    enemyTimer.stop();
                    
                    // ゲーム終了ラベルの表示
                     tf = new TextFormat();
                     tf.align = "center";
                     tf.font = "Times New Roman";
                     tf.size = 16;
                     tf.color = 0x000000;
                    
                     fld = new TextField();
                     fld.defaultTextFormat = tf;
                     fld.text = "Mission Accomplished!";
                     fld.x = stage.stageWidth / 2 - 60;
                     fld.y = stage.stageHeight / 2 - 16;
                     fld.width = 150;
                     stage.addChild( fld );
                }
            }
                        
            // 敵機(左前)の弾丸の移動
            for( var j:int; j < compBubble.length; j++ ){
                compBubble[j].y += bubbleVelocity[j];
                            
            // 自機に敵機の弾丸が当たったら(ゲームオーバー処理)         
                if( myCombat.x - 95 < compBubble[j].x && compBubble[j].x < myCombat.x + 95
                 && myCombat.y - 75 < compBubble[j].y && compBubble[j].y < myCombat.y + 75 ){
                    myCombathitFlag = true;
                }
                
                if( myCombathitFlag ){
                    // 終了処理(ゲームオーバー)
                    stage.removeChild( myCombat );
                    stage.removeEventListener( MouseEvent.MOUSE_MOVE, mMove );
                    stage.removeEventListener( MouseEvent.CLICK, mClick );
                    timer.stop();
                    enemyTimer.stop();
                     
                    // ゲーム終了ラベルの表示
                     tf = new TextFormat();
                     tf.align = "center";
                     tf.font = "Times New Roman";
                     tf.size = 16;
                     tf.color = 0x000000;
                    
                     fld = new TextField();
                     fld.defaultTextFormat = tf;
                     fld.text = "Mission Failed...";
                     fld.x = stage.stageWidth / 2 - 100;
                     fld.y = stage.stageHeight / 2 - 16;
                     fld.width = 200;
                     stage.addChild( fld );
                }
            }
            
            // 敵機(右前)の弾丸の移動
            for( var k:int; k < compBubble.length; k++ ){
                compBubble[k].y += bubbleVelocity[k];
                            
            // 自機に敵機の弾丸が当たったら(ゲームオーバー処理)         
                if( myCombat.x - 75 < compBubble[k].x && compBubble[k].x < myCombat.x + 75
                 && myCombat.y - 55 < compBubble[k].y && compBubble[k].y < myCombat.y + 55 ){
                    myCombathitFlag = true;
                }
                
                if( myCombathitFlag ){
                    // 終了処理(ゲームオーバー)
                    stage.removeChild( myCombat );
                    stage.removeEventListener( MouseEvent.MOUSE_MOVE, mMove );
                    stage.removeEventListener( MouseEvent.CLICK, mClick );
                    timer.stop();
                    enemyTimer.stop();
                     
                    // ゲーム終了ラベルの表示
                     tf = new TextFormat();
                     tf.align = "center";
                     tf.font = "Times New Roman";
                     tf.size = 16;
                     tf.color = 0x000000;
                    
                     fld = new TextField();
                     fld.defaultTextFormat = tf;
                     fld.text = "Mission Failed...";
                     fld.x = stage.stageWidth / 2 - 100;
                     fld.y = stage.stageHeight / 2 - 16;
                     fld.width = 200;
                     stage.addChild( fld );
                }
            }
            
            // 敵機(左後ろ)の弾丸の移動
            for( var m:int; m < compBubble.length; m++ ){
                compBubble[m].y += bubbleVelocity[m];
                            
            // 自機に敵機の弾丸が当たったら(ゲームオーバー処理)         
                if( myCombat.x - 75 < compBubble[m].x && compBubble[m].x < myCombat.x + 75
                 && myCombat.y - 55 < compBubble[m].y && compBubble[m].y < myCombat.y + 55 ){
                    myCombathitFlag = true;
                }
                
                if( myCombathitFlag ){
                    // 終了処理(ゲームオーバー)
                    stage.removeChild( myCombat );
                    stage.removeEventListener( MouseEvent.MOUSE_MOVE, mMove );
                    stage.removeEventListener( MouseEvent.CLICK, mClick );
                    timer.stop();
                    enemyTimer.stop();
                     
                    // ゲーム終了ラベルの表示
                     tf = new TextFormat();
                     tf.align = "center";
                     tf.font = "Times New Roman";
                     tf.size = 16;
                     tf.color = 0x000000;
                    
                     fld = new TextField();
                     fld.defaultTextFormat = tf;
                     fld.text = "Mission Failed...";
                     fld.x = stage.stageWidth / 2 - 100;
                     fld.y = stage.stageHeight / 2 - 16;
                     fld.width = 200;
                     stage.addChild( fld );
                }
            }
            
            // 敵機(右後ろ)の弾丸の移動
            for( var n:int; n < compBubble.length; n++ ){
                compBubble[n].y += bubbleVelocity[n];
                            
            // 自機に敵機の弾丸が当たったら(ゲームオーバー処理)         
                if( myCombat.x - 75 < compBubble[n].x && compBubble[n].x < myCombat.x + 75
                 && myCombat.y - 55 < compBubble[n].y && compBubble[n].y < myCombat.y + 55 ){
                    myCombathitFlag = true;
                }
                
                if( myCombathitFlag ){
                    // 終了処理(ゲームオーバー)
                    stage.removeChild( myCombat );
                    stage.removeEventListener( MouseEvent.MOUSE_MOVE, mMove );
                    stage.removeEventListener( MouseEvent.CLICK, mClick );
                    timer.stop();
                    enemyTimer.stop();
                     
                    // ゲーム終了ラベルの表示
                     tf = new TextFormat();
                     tf.align = "center";
                     tf.font = "Times New Roman";
                     tf.size = 16;
                     tf.color = 0x000000;
                    
                     fld = new TextField();
                     fld.defaultTextFormat = tf;
                     fld.text = "Mission Failed...";
                     fld.x = stage.stageWidth / 2 - 100;
                     fld.y = stage.stageHeight / 2 - 16;
                     fld.width = 200;
                     stage.addChild( fld );
                }
            }
        }
                
        public function leftfront( event:TimerEvent ): void{
            // 敵機(左前)から放出される弾丸の処理
            var bubble:Sprite = new Sprite();
            bubble.graphics.beginFill( 0x00FF00, 0.8 );
            bubble.graphics.drawCircle( -75, +55, 10 );            
            bubble.x = enemy.x;
            bubble.y = enemy.y + 10;
            compBubble.push( bubble );   // 敵機から放出される弾丸を配列 compBubble に追加する
            bubbleVelocity.push( +5 );   // 弾丸の y 方向の速度
            stage.addChild( compBubble[compBubble.length - 1] );
        }
        
        public function rightfront( event:TimerEvent ): void{
            // 敵機(右前)から放出される弾丸の処理
            var bubble:Sprite = new Sprite();
            bubble.graphics.beginFill( 0x00FF00, 0.8 ); 
            bubble.graphics.drawCircle( +75, +55, 10 );
            bubble.x = enemy.x;
            bubble.y = enemy.y + 10;
            compBubble.push( bubble );   // 敵機から放出される弾丸を配列 compBubble に追加する
            bubbleVelocity.push( +10 );   // 弾丸の y 方向の速度
            stage.addChild( compBubble[compBubble.length - 1] );
        }
        
        public function leftback( event:TimerEvent ): void{
            // 敵機(左後ろ)から放出される弾丸の処理
            var bubble:Sprite = new Sprite();
            bubble.graphics.beginFill( 0x00FF00, 0.8 );
            bubble.graphics.drawCircle( -75, -55, 10 );
            bubble.x = enemy.x;
            bubble.y = enemy.y + 10;
            compBubble.push( bubble );   // 敵機から放出される弾丸を配列 compBubble に追加する
            bubbleVelocity.push( +15 );   // 弾丸の y 方向の速度
            stage.addChild( compBubble[compBubble.length - 1] );
        }
        
        public function rightback( event:TimerEvent ): void{
            // 敵機(右後ろ)から放出される弾丸の処理
            var bubble:Sprite = new Sprite();
            bubble.graphics.beginFill( 0x00FF00, 0.8 );
            bubble.graphics.drawCircle( +75, -55, 10 );
            bubble.x = enemy.x;
            bubble.y = enemy.y + 10;
            compBubble.push( bubble );   // 敵機から放出される弾丸を配列 compBubble4 に追加する
            bubbleVelocity.push( +20 );   // 弾丸の y 方向の速度
            stage.addChild( compBubble[compBubble.length - 1] );
        }
    }
}