【AS3代码】戳气球游戏

package
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    import flash.media.Sound;
    import flash.text.*;

    
    public class Main extends Sprite
    {        
        public static const STATE_INIT:int = 10;
        public static const STATE_PLAY:int = 20;
        public static const STATE_GAME_OVER:int = 30;
        public var gameState:int = 0;                    //游戏状态
        
        public var score:int = 0;        //玩家的分数
        public var chances:int = 0;        //漏掉的气球数
        public var level:Number = 1;    //等级
        
        public var bg:MovieClip;
        public var enemies:Array;        //存储敌人(气球)的数组
        public var player:MovieClip;    //引用玩家的图片
        public var tempEnemy:MovieClip;    //随机出来的气球
        
        public var scoreLabel:TextField = new TextField();    //分数标题
        public var levelLabel:TextField = new TextField();    //等级标题
        public var chancesLabel:TextField = new TextField();//漏网标题
        public var scoreText:TextField = new TextField();    //分数值
        public var levelText:TextField = new TextField();    //等级值
        public var chancesText:TextField = new TextField();    //漏网值
        public const SCOREBOARD_Y:Number = 380;    //计分板位于游戏底部
        
        public function Main():void
        {
            init();
        }
        private function init():void
        {
            this.addEventListener(Event.ENTER_FRAME, gameLoop);
            
            //显示背景
            bg = new BackImage();
            this.addChild(bg);
            
            //设置计分板标题和默认值
            scoreLabel.text = "得分:";
            scoreText.text = "0";
            levelLabel.text = "等级:";
            levelText.text = "1";
            chancesLabel.text = "碰撞:";
            chancesText.text = "0";
            
            //放置游戏底部
            scoreLabel.y = SCOREBOARD_Y;
            levelLabel.y = SCOREBOARD_Y;
            chancesLabel.y = SCOREBOARD_Y;
            scoreText.y = SCOREBOARD_Y;
            levelText.y = SCOREBOARD_Y;
            
            chancesText.y = SCOREBOARD_Y;
            
            //设置标题和值横向坐标
            scoreLabel.x = 5;
            scoreText.x = 50;
            chancesLabel.x = 105;
            chancesText.x = 155;
            levelLabel.x = 205;
            levelText.x = 260;
            
            //显示计分板
            this.addChild(scoreLabel);
            this.addChild(levelLabel);
            this.addChild(chancesLabel);
            this.addChild(scoreText);
            this.addChild(levelText);
            this.addChild(chancesText);
            
            gameState = STATE_INIT;
        }
        
        //调整游戏状态的循环函数
        public function gameLoop(e:Event):void
        {
            switch(gameState)
            {
                case STATE_INIT:
                    initGame();
                    break;
                
                case STATE_PLAY:
                    playGame();
                    break;
                
                case STATE_GAME_OVER:
                    endGame();
                    break;
            }
        }
        
        //初始化游戏
        public function initGame():void
        {
            //初始化游戏
            score = 0;                    //分数
            chances = 0;                //漏网数            
            //level = 1;
            
            levelText.text = level.toString();
            
            player = new PlayerImage();
            this.addChild(player);
            player.startDrag(true, new Rectangle(0,0,550,400));
            
            //存储气球们
            enemies = new Array();
            
            gameState = STATE_PLAY;
        }
        
        //开始游戏
        public function playGame():void
        {
            //旋转飞镖
            player.rotation += 20;
            
            //创建气球(敌人)函数
            makeEnemies();
            
            //更新祈求Y坐标以及飘出屏幕时移除掉
            moveEnemies();
            
            //检测玩家是否与敌人发生了碰撞,如果是的话就触发一事件
            testCollisions();
            
            //查看等级(level)是否可增加或游戏是否可结束
            testForEnd();
        }
        
        public function makeEnemies():void
        {
            //获取一个0-99之间的随机数
            var chance:Number = Math.floor(Math.random() * 100);
            
            //等级越大,气球出现的概率越高
            if(chance < level+2)
            {
                //创建气球
                tempEnemy = new EnemyImage();
                
                //等级越高,气球速度越快
                tempEnemy.speed = level + 3;
                
                //随机刷出1-5帧中对应颜色的气球出来
                var xxxx = Math.floor(Math.random() * 5) + 1;                
                tempEnemy.gotoAndStop(xxxx);
                
                //气球Y轴出现的坐标,从底端开始移动
                tempEnemy.y = 435;
                
                //气球X轴出现的坐标,由于屏幕是0-540,所以气球(本身有30个宽度)从0-514中随机刷出
                tempEnemy.x = Math.floor(Math.random() * 515);
                
                var tt:TextField = new TextField();
                var ttf:TextFormat = new TextFormat();
                ttf.bold = true;
                ttf.align = "center";
                ttf.size = 30;
                tt.text = xxxx;
                tt.setTextFormat(ttf);
                tempEnemy.addChild(tt);
                
                //气球显示到场景
                this.addChild(tempEnemy);
                
                //添加到气球数组中,以便跟踪
                enemies.push(tempEnemy);
            }
        }
        
        //便利气球数组,更新每个气球Y坐标,移动气球向上飘
        public function moveEnemies():void
        {
            var tempEnemy:MovieClip;
            for(var i:int = enemies.length - 1; i >= 0; i--)
            {
                tempEnemy = enemies[i];
                tempEnemy.y -= tempEnemy.speed;
                
                //若气球由下而上飞出屏幕顶部了
                if(tempEnemy.y < -35)
                {
                    chances++;    //漏网数+1
                    chancesText.text = chances.toString();
                    enemies.splice(i,1);    //该气球从气球数组中删掉
                    removeChild(tempEnemy);    //把气球从显示列表中移除
                }
            }
        }
        
        //飞镖和气球碰撞检测
        public function testCollisions():void
        {
            //调用声音对象
            var sound:Sound = new Pop();
            var tempEnemy:MovieClip;
            
            //从气球数组里遍历剩下的气球
            for(var i:int = enemies.length - 1; i >= 0; i--)
            {
                tempEnemy = enemies[i];
                
                //检测当前气球是否和飞镖有碰撞
                if(tempEnemy.hitTestObject(player))
                {
                    score++;
                    scoreText.text = score.toString();
                    sound.play();
                    enemies.splice(i,1);    //该气球从气球数组中删掉
                    removeChild(tempEnemy);    //把气球从显示列表中移除
                }
            }
        }
        
        //查看等级(level)是否可增加或游戏是否可结束
        public function testForEnd():void
        {
            if(chances >= 5)
            {
                gameState = STATE_GAME_OVER;
            }
            else if(score >= level * 5)
            {
                level++;                
                levelText.text = level.toString();
                
                var level_up:TextField = new TextField();
                level_up.text = "恭喜你!升到" + level + "级了!!!";
                this.addChild(level_up);
            }
        }        
        
        //结束游戏
        public function endGame():void
        {
            //把气球一个个的从显示列表中移除
            for(var i:int = 0; i < enemies.length; i++)
            {
                removeChild(enemies[i]);
                enemies= [];
            }
            
            player.stopDrag();
        }
    }
}
posted @ 2012-06-21 15:16  王翔(kingfly)  阅读(925)  评论(0编辑  收藏  举报