实例介绍
【实例简介】
用egret游戏框架做的飞机大战
【实例截图】
【核心代码】
module fighter { /** * 主游戏容器 */ export class GameContainer extends egret.DisplayObjectContainer { /**@private*/ private stageW:number; /**@private*/ private stageH:number; /**开始按钮*/ private btnStart; /**可滚动背景*/ private bg:fighter.BgMap; /**我的飞机*/ private myFighter:fighter.Airplane; /**我的子弹*/ private myBullets:fighter.Bullet[] = []; /**敌人的飞机*/ private enemyFighters:fighter.Airplane[] = []; /**触发创建敌机的间隔*/ private enemyFightersTimer:egret.Timer = new egret.Timer(1000); /**敌人的子弹*/ private enemyBullets:fighter.Bullet[] = []; /**成绩显示*/ private scorePanel:fighter.ScorePanel; /**我的成绩*/ private myScore:number = 0; /**@private*/ private _lastTime:number; public constructor() { super(); this._lastTime = egret.getTimer(); this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this); } /**初始化*/ private onAddToStage(event:egret.Event){ this.removeEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this); this.createGameScene(); } /**创建游戏场景*/ private createGameScene():void{ this.stageW = this.stage.stageWidth; this.stageH = this.stage.stageHeight; //背景 this.bg = new fighter.BgMap();//创建可滚动的背景 this.addChild(this.bg); //开始按钮 //开始按钮 this.btnStart = fighter.createBitmapByName("btnStart");//开始按钮 this.btnStart.x = (this.stageW - this.btnStart.width) / 2;//居中定位 this.btnStart.y = (this.stageH - this.btnStart.height) / 2;//居中定位 this.btnStart.touchEnabled = true;//开启触碰 this.btnStart.addEventListener(egret.TouchEvent.TOUCH_TAP,this.gameStart,this);//点击按钮开始游戏 this.addChild(this.btnStart); //我的飞机 this.myFighter = new fighter.Airplane(RES.getRes("f1"),100,"f1"); this.myFighter.y = this.stageH-this.myFighter.height-50; this.addChild(this.myFighter); this.scorePanel = new fighter.ScorePanel(); //预创建 this.preCreatedInstance(); } /**预创建一些对象,减少游戏时的创建消耗*/ private preCreatedInstance():void { var i:number = 0; var objArr:any[] = []; for(i=0;i<20;i ) { var bullet = fighter.Bullet.produce("b1"); objArr.push(bullet); } for(i=0;i<20;i ) { bullet = objArr.pop(); fighter.Bullet.reclaim(bullet); } for(i=0;i<20;i ) { var bullet = fighter.Bullet.produce("b2"); objArr.push(bullet); } for(i=0;i<20;i ) { bullet = objArr.pop(); fighter.Bullet.reclaim(bullet); } for(i=0;i<20;i ) { var enemyFighter:fighter.Airplane = fighter.Airplane.produce("f2",1000); objArr.push(enemyFighter); } for(i=0;i<20;i ) { enemyFighter = objArr.pop(); fighter.Airplane.reclaim(enemyFighter); } } /**游戏开始*/ private gameStart():void{ this.myScore = 0; this.removeChild(this.btnStart); this.bg.start(); this.touchEnabled=true; this.addEventListener(egret.Event.ENTER_FRAME,this.gameViewUpdate,this); this.addEventListener(egret.TouchEvent.TOUCH_MOVE,this.touchHandler,this); this.myFighter.x = (this.stageW-this.myFighter.width)/2; this.myFighter.fire();//开火 this.myFighter.blood = 10; this.myFighter.addEventListener("createBullet",this.createBulletHandler,this); this.enemyFightersTimer.addEventListener(egret.TimerEvent.TIMER,this.createEnemyFighter,this); this.enemyFightersTimer.start(); if(this.scorePanel.parent==this) this.removeChild(this.scorePanel); } /**响应Touch*/ private touchHandler(evt:egret.TouchEvent):void{ if(evt.type==egret.TouchEvent.TOUCH_MOVE) { var tx:number = evt.localX; tx = Math.max(0,tx); tx = Math.min(this.stageW-this.myFighter.width,tx); this.myFighter.x = tx; } } /**创建子弹(包括我的子弹和敌机的子弹)*/ private createBulletHandler(evt:egret.Event):void{ var bullet:fighter.Bullet; if(evt.target==this.myFighter) { for(var i:number=0;i<2;i ) { bullet = fighter.Bullet.produce("b1"); bullet.x = i==0?(this.myFighter.x 10):(this.myFighter.x this.myFighter.width-22); bullet.y = this.myFighter.y 30; this.addChildAt(bullet,this.numChildren-1-this.enemyFighters.length); this.myBullets.push(bullet); } } else { var theFighter:fighter.Airplane = evt.target; bullet = fighter.Bullet.produce("b2"); bullet.x = theFighter.x 28; bullet.y = theFighter.y 10; this.addChildAt(bullet,this.numChildren-1-this.enemyFighters.length); this.enemyBullets.push(bullet); } } /**创建敌机*/ private createEnemyFighter(evt:egret.TimerEvent):void{ var enemyFighter:fighter.Airplane = fighter.Airplane.produce("f2",1000); enemyFighter.x = Math.random()*(this.stageW-enemyFighter.width); enemyFighter.y = -enemyFighter.height-Math.random()*300; enemyFighter.addEventListener("createBullet",this.createBulletHandler,this); enemyFighter.fire(); this.addChildAt(enemyFighter,this.numChildren-1); this.enemyFighters.push(enemyFighter); } /**游戏画面更新*/ private gameViewUpdate(evt:egret.Event):void{ //为了防止FPS下降造成回收慢,生成快,进而导致DRAW数量失控,需要计算一个系数,当FPS下降的时候,让运动速度加快 var nowTime:number = egret.getTimer(); var fps:number = 1000/(nowTime-this._lastTime); this._lastTime = nowTime; var speedOffset:number = 60/fps; //我的子弹运动 var i:number = 0; var bullet:fighter.Bullet; var myBulletsCount:number = this.myBullets.length; for(;i < myBulletsCount;i ){ bullet = this.myBullets[i]; if(bullet.y < -bullet.height){ this.removeChild(bullet); Bullet.reclaim(bullet); this.myBullets.splice(i,1); i--; myBulletsCount--; } bullet.y -= 12 * speedOffset; } //敌人飞机运动 var theFighter:fighter.Airplane; var enemyFighterCount:number = this.enemyFighters.length; for(i = 0;i < enemyFighterCount;i ){ theFighter = this.enemyFighters[i]; if(theFighter.y>this.stage.stageHeight){ this.removeChild(theFighter); Airplane.reclaim(theFighter); theFighter.removeEventListener("createBullet",this.createBulletHandler,this); theFighter.stopFire(); this.enemyFighters.splice(i,1); i--; enemyFighterCount--; } theFighter.y = 4 * speedOffset; } //敌人子弹运动 var enemyBulletsCount:number = this.enemyBullets.length; for(i = 0;i < enemyBulletsCount;i ){ bullet = this.enemyBullets[i]; if(bullet.y>this.stage.stageHeight){ this.removeChild(bullet); Bullet.reclaim(bullet); this.enemyBullets.splice(i,1); i--; enemyBulletsCount--;//数组长度已经改变 } bullet.y = 8 * speedOffset; } this.gameHitTest(); } /**游戏碰撞检测*/ private gameHitTest():void { var i:number,j:number; var bullet:fighter.Bullet; var theFighter:fighter.Airplane; var myBulletsCount:number = this.myBullets.length; var enemyFighterCount:number = this.enemyFighters.length; var enemyBulletsCount:number = this.enemyBullets.length; //将需消失的子弹和飞机记录 var delBullets:fighter.Bullet[] = []; var delFighters:fighter.Airplane[] = []; //我的子弹可以消灭敌机 for(i=0;i<myBulletsCount;i ) { bullet = this.myBullets[i]; for(j=0;j<enemyFighterCount;j ) { theFighter = this.enemyFighters[j]; if(fighter.GameUtil.hitTest(theFighter,bullet)) { theFighter.blood -= 2; if(delBullets.indexOf(bullet)==-1) delBullets.push(bullet); if(theFighter.blood<=0 && delFighters.indexOf(theFighter)==-1) delFighters.push(theFighter); } } } //敌人的子弹可以减我血 for(i=0;i<enemyBulletsCount;i ) { bullet = this.enemyBullets[i]; if(fighter.GameUtil.hitTest(this.myFighter,bullet)) { this.myFighter.blood -= 1; if(delBullets.indexOf(bullet)==-1) delBullets.push(bullet); } } //敌机的撞击可以消灭我 for(i=0;i<enemyFighterCount;i ) { theFighter = this.enemyFighters[i]; if(fighter.GameUtil.hitTest(this.myFighter,theFighter)) { this.myFighter.blood -= 10; } } if(this.myFighter.blood<=0) { this.gameStop(); } else { while(delBullets.length>0) { bullet = delBullets.pop(); this.removeChild(bullet); if(bullet.textureName=="b1") this.myBullets.splice(this.myBullets.indexOf(bullet),1); else this.enemyBullets.splice(this.enemyBullets.indexOf(bullet),1); fighter.Bullet.reclaim(bullet); } this.myScore = delFighters.length; while(delFighters.length>0) { theFighter = delFighters.pop(); theFighter.stopFire(); theFighter.removeEventListener("createBullet",this.createBulletHandler,this); this.removeChild(theFighter); this.enemyFighters.splice(this.enemyFighters.indexOf(theFighter),1); fighter.Airplane.reclaim(theFighter); } } } /**游戏结束*/ private gameStop():void{ this.addChild(this.btnStart); this.bg.pause(); this.removeEventListener(egret.Event.ENTER_FRAME,this.gameViewUpdate,this); this.removeEventListener(egret.TouchEvent.TOUCH_MOVE,this.touchHandler,this); this.myFighter.stopFire(); this.myFighter.removeEventListener("createBullet",this.createBulletHandler,this); this.enemyFightersTimer.removeEventListener(egret.TimerEvent.TIMER,this.createEnemyFighter,this); this.enemyFightersTimer.stop(); //清理子弹 var i:number = 0; var bullet:fighter.Bullet; while(this.myBullets.length>0) { bullet = this.myBullets.pop(); this.removeChild(bullet); fighter.Bullet.reclaim(bullet); } while(this.enemyBullets.length>0) { bullet = this.enemyBullets.pop(); this.removeChild(bullet); fighter.Bullet.reclaim(bullet); } //清理飞机 var theFighter:fighter.Airplane; while(this.enemyFighters.length>0) { theFighter = this.enemyFighters.pop(); theFighter.stopFire(); theFighter.removeEventListener("createBullet",this.createBulletHandler,this); this.removeChild(theFighter); fighter.Airplane.reclaim(theFighter); } //显示成绩 this.scorePanel.showScore(this.myScore); this.scorePanel.x = (this.stageW-this.scorePanel.width)/2; this.scorePanel.y = 100; this.addChild(this.scorePanel); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论