• 【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_START_PLAYER:int = 20;
            public static const STATE_PLAY_GAME:int = 30;
            public static const STATE_REMOVE_PLAYER:int = 40;
            public static const STATE_END_GAME:int = 50;
            
            public var gameState:int = 0;    //游戏状态
            public var score:int = 0;        //玩家的分数
            public var chances:int = 0;        //漏掉的气球数            
            public var bg:MovieClip;        //游戏背景
            public var enemies:Array;        //存储敌人的数组
            public var missiles:Array;        //玩家发射的导弹
            public var explosions:Array;    //爆炸特效
            public var player:MovieClip;    //引用玩家的图片
            public var level:Number;        //等级            
            
            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 = 5;    //计分板位于游戏顶部
            
            public function Main():void
            {
                init();
            }
            private function init():void
            {
                this.addEventListener(Event.ENTER_FRAME, gameLoop);
                
                //显示背景
                bg = new BackImage();
                this.addChild(bg);
                
                //设置计分板标题和默认值
                scoreLabel.text = "得分:";            
                levelLabel.text = "等级:";    
                chancesLabel.text = "生命:";            
                scoreText.text = "0";            
                levelText.text = "1";
                chancesText.text = "3";
                
                scoreLabel.textColor = 0xffffff;
                levelLabel.textColor = 0xffffff;
                chancesLabel.textColor = 0xffffff;
                scoreText.textColor = 0xffffff;
                levelText.textColor = 0xffffff;
                chancesText.textColor = 0xffffff;
                
                //放置游戏底部
                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_START_PLAYER:
                        startPlayer();
                        break;
                    
                    case STATE_PLAY_GAME:
                        playGame();
                        break;
                    
                    case STATE_REMOVE_PLAYER:
                        removePlayer();
                        break;
                    
                    case STATE_END_GAME:
                        endGame();
                        break;
                }
            }
            
            //初始化游戏
            public function initGame():void
            {
                //当点击鼠标时,创建玩家发射的导弹
                stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownEvent);
                
                //初始化游戏
                score = 0;                    //分数
                chances = 3;                //飞船数    
                enemies = new Array();        //敌人数组
                missiles = new Array();
                explosions = new Array();
                level = 1;
                
                levelText.text = level.toString();            
                player = new PlayerImage();
                gameState = STATE_START_PLAYER;
            }
            
            public function startPlayer():void
            {
                this.addChild(player);
                player.startDrag(true, new Rectangle(0,320,550,365));
                gameState = STATE_PLAY_GAME;
            }
            
            public function removePlayer():void
            {
                //从敌人数组反向遍历出一个个敌人
                for(var i:int = enemies.length-1; i>=0; i--)
                {
                    removeEnemy(i);
                }
                for(i = missiles.length-1; i>= 0; i--)
                {
                    removeMissile(i);
                }
                this.removeChild(player);
                gameState = STATE_START_PLAYER;
            }
            
            //开始游戏
            public function playGame():void
            {
                //创建敌人函数
                makeEnemies();
                
                //更新祈求Y坐标以及飘出屏幕时移除掉
                moveEnemies();
                
                //检测玩家是否与敌人发生了碰撞,如果是的话就触发一事件
                testCollisions();
                
                //查看等级(level)是否可增加或游戏是否可结束
                testForEnd();
            }
            
            public function makeEnemies():void
            {
                //获取一个0-99之间的随机数
                var chance:Number = Math.floor(Math.random() * 100);
                var tempEnemy:MovieClip;
                
                //等级越大,气球出现的概率越高
                if(chance < level+2)
                {
                    //创建敌人                
                    var feiji:Number = Math.floor(Math.random() * 45);
                    
                    if(feiji < 17)
                    {
                        tempEnemy = new EnemyImage();
                    }
                    else if(feiji >= 17 && feiji < 34)
                    {
                        tempEnemy = new EnemyImage1();
                    }
                    else if(feiji >= 34 && feiji < 45)
                    {
                        tempEnemy = new EnemyImageBoss();
                    }
                    //等级越高,气球速度越快
                    tempEnemy.speed = level + 1;
                    
                    //敌人出现的y坐标
                    tempEnemy.y = -25;
                    
                    //气球X轴出现的坐标,由于屏幕是0-540,所以敌人(本身有30个宽度)从0-514中随机刷出
                    tempEnemy.x = Math.floor(Math.random() * 515);
                    
                    //敌人显示到场景
                    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;
                    
                    var pp:Number = Math.floor(Math.random() * 4);
                    if(pp < 3)
                    {
                        tempEnemy.x -= pp;
                    }
                    else
                    {
                        tempEnemy.x += pp;
                    }
                    
                    
                    //若敌人飞出屏幕底部了
                    if(tempEnemy.y > 435)
                    {
                        removeEnemy(i);
                    }
                }
                
                //移除子弹
                var tempMissile:MovieClip;
                for(i = missiles.length-1; i>=0; i--)
                {
                    tempMissile = missiles[i];
                    tempMissile.y -= tempMissile.speed;
                    if(tempMissile.y < -35)
                    {
                        removeMissile(i);
                    }
                }
                
                //移除爆炸效果
                var tempExplosion:MovieClip;
                for(i = explosions.length-1; i>= 0;i--)
                {
                    tempExplosion = explosions[i];
                    if(tempExplosion.currentFrame >= tempExplosion.totalFrames)
                    {
                        removeExplosion(i);
                    }
                }
            }
            
            //子弹和敌人碰撞检测、自己和敌人碰撞检测
            public function testCollisions():void
            {
                var tempEnemy:MovieClip;    //当前敌人
                var tempMissile:MovieClip;    //当前发射的导弹
                
                //遍历敌人数组
                for(var i:int = enemies.length - 1; i >= 0; i--)
                {
                    //循环到的当前敌人对象
                    tempEnemy = enemies[i];
                    
                    //遍历发射的导弹数组
                    for(var j:int = missiles.length-1; j>=0; j--)
                    {
                        //循环到的当前导弹对象
                        tempMissile = missiles[j];
                        
                        //如果当前敌人和当前导弹发生碰撞
                        if(tempEnemy.hitTestObject(tempMissile))
                        {
                            score++;    //积分+1
                            scoreText.text = score.toString();
                            
                            //调用爆炸特效(传递敌人的x,y坐标,在该坐标上爆炸)
                            
                            makeExplosion(tempEnemy.x + (tempEnemy.width / 2), tempEnemy.y + (tempEnemy.height / 2));
                            
                            removeEnemy(i);        //移除当前敌人
                            removeMissile(j);    //移除当前导弹
                            break;
                        }
                    }
                }
                
                //检测自己和敌人是否有碰撞
                for(i = enemies.length-1; i>=0;i--)
                {
                    //循环到的当前敌人
                    tempEnemy = enemies[i];
                    
                    //如果当前敌人和自己发生碰撞
                    if(tempEnemy.hitTestObject(player))
                    {
                        chances--;    //生命-1
                        chancesText.text = chances.toString();
                        
                        makeExplosion(player.x + (player.width / 2), player.y + (player.height / 2));
                        
                        gameState = STATE_REMOVE_PLAYER;
                    }
                }
            }
            
            //创建并播放爆炸动画
            public function makeExplosion(ex:Number, ey:Number)
            {
                //创建爆炸对象
                var tempExplosion:MovieClip = new ExplosionImage();
                tempExplosion.x = ex;
                tempExplosion.y = ey;
                this.addChild(tempExplosion);
                
                //由于爆炸动画有7帧,会自动播放,所以放到爆炸数组里以后控制它们
                explosions.push(tempExplosion);
                
                //播放爆炸声音
                var sound:Sound = new Explode();
                sound.play();
            }
            
            
            //查看等级(level)是否可增加或游戏是否可结束
            public function testForEnd():void
            {
                if(chances <= 0)
                {
                    removePlayer();
                    gameState = STATE_END_GAME;
                }
                else if(score > level * 30)
                {
                    level++;                
                    levelText.text = level.toString();
                }
            }    
            
            public function removeEnemy(idx:int)
            {
                this.removeChild(enemies[idx]);
                enemies.splice(idx,1);
            }
            
            public function removeMissile(idx:int)
            {
                this.removeChild(missiles[idx]);
                missiles.splice(idx,1);
            }
            
            public function removeExplosion(idx:int)
            {
                this.removeChild(explosions[idx]);
                explosions.splice(idx,1);
            }
            
            public function onMouseDownEvent(e:MouseEvent)
            {
                if(gameState == STATE_PLAY_GAME)
                {
                    //创建子弹对象
                    var tempMissile:MovieClip = new MissileImage();
                    tempMissile.x = player.x + (player.width / 2);
                    tempMissile.y = player.y;
                    tempMissile.speed = 20;
                    missiles.push(tempMissile);
                    this.addChild(tempMissile);
                    
                    var sound:Sound = new Shoot();
                    sound.play();
                }
            }
            
            //结束游戏
            public function endGame():void
            {
                trace("游戏结束!");
            }
        }
    }
  • 相关阅读:
    使用 CocoStudio UI 编辑器实现《乱斗堂》设置界面
    windows下patch
    继承复习
    游戏中地图的制作(二)
    STL容器之List:rbegin
    RDTSC
    Create QR Code
    Spy++ 简介
    COM component(COM组件)
    git
  • 原文地址:https://www.cnblogs.com/kingfly/p/2563780.html
Copyright © 2020-2023  润新知