【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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值