微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flash as3空袭游戏

游戏玩法:

 这个游戏当中,飞机会不断的从屏幕左边或右边飞过来,通过键盘左右移动防空炮,并按空格键发出炮弹,玩家的炮弹数是有限 的,当弹尽则表示游戏结束。

游戏的主要思路:

1、随机创建飞机,并让飞机移动;

2、如何实现键盘控制防空炮;

3、判断击中情况,并处理;

准备工作:

元件:会有三个MovieClip。一个叫AAGun,是防空炮,一个是Bullet,是子弹。

还有一个最重要的Airplane,它有10个帧组成,1到5帧分别为5种不同类型的飞机,第6帧为explode,第10帧有帧代码,parent.removeChild(this);

stop;

作用是播到此帧时父容器将此MovieClip移除。(以上3个MovieClip都有链接,注意加上

除此之外还有一个常规按钮;

舞台设置:

一共有三帧。

第一帧,有个开始按钮,实例名为startButton,帧代码

stop();
startButton.addEventListener(MouseEvent.CLICK,clickStart);
function clickStart(event:MouseEvent) {
 gotoAndStop("play");
}

很容易理解,单击跳到第2帧,即游戏开始帧。

第二帧,为startAirRaid();调用游戏主函数,开始游戏。

舞台下方有个"shotsLeft"文本框,它的作用是显示剩余可用的球数。舞台中央有个”gameMessage“,是用来显示游戏信息的。

第三帧,有个重玩按钮,实例名为playAgainButton,帧代码为:

playAgainButton.addEventListener(MouseEvent.CLICK,clickPlayAgain);
function clickPlayAgain(event:MouseEvent) {
 gotoAndStop("play");
}

点击重新开始游戏。

舞台上有两个动态文本框,实例名分别为showscore和showShots,分别用来显示分数和剩余子弹数。

游戏代码

此游戏有4个类,即AAGun,Bullet,AirPlane,AirRaid.

—————————————————我是优美的长分割线—————————————————————

AAGun是防空炮类:

package {
	import flash.display.*;
	import flash.events.*;
	import flash.utils.getTimer;
	
	public class AAGun extends MovieClip {
		static const speed:Number = 150.0;//设置速度
		private var lastTime:int; //用来实现运动的时间变量 
		
		public function AAGun() {
			// 炮的初始位置
			this.x = 275;
			this.y = 340;
			this.rotation = -90;
			
			// 事件侦听来实现运动
			addEventListener(Event.ENTER_FRAME,moveGun);
		}

		public function moveGun(event:Event) {
			// 获取时间差
			var timePassed:int = getTimer()-lastTime;
			lastTime += timePassed;
			
			// 当前位置
			var newRotation = this.rotation;
			
			// 移到左边
			if (MovieClip(parent).leftArrow) {
				newRotation -= speed*timePassed/1000;
			}
			
			// 移到右边
			if (MovieClip(parent).rightArrow) {
				newRotation += speed*timePassed/1000;
			}
			// 检查边界
			if (newRotation < -170) newRotation = -170;
			if (newRotation > -20) newRotation = -20;
			
			// 重定位
			this.rotation = newRotation;
		}
		
		// 从屏幕移除,同时移除事件侦听器
		public function deleteGun() {
			parent.removeChild(this);
			removeEventListener(Event.ENTER_FRAME,moveGun);
		}
	}
}

—————————————————我是优美的长分割线—————————————————————

一个类是Bullet,即子弹类:

 

package {
	import flash.display.*;
	import flash.events.*;
	import flash.utils.getTimer;
	
	public class Bullet extends MovieClip {
		private var dx,dy:Number; //速度
		private var lastTime:int;
		//rot 度
		public function Bullet(x,y:Number,rot: Number,speed: Number) {
			// 设置开始位置
			var initialMove:Number = 35.0;
			this.x = x + initialMove*Math.cos(2*Math.PI*rot/360);
			this.y = y + initialMove*Math.sin(2*Math.PI*rot/360);
			this.rotation = rot;
			
			// 获得速度
			dx = speed*Math.cos(2*Math.PI*rot/360);
			dy = speed*Math.sin(2*Math.PI*rot/360);
			
			// 设置动画
			lastTime = getTimer();
			addEventListener(Event.ENTER_FRAME,moveBullet);
		}
		
		public function moveBullet(event:Event) {
			// 获取经过的时间
			var timePassed:int = getTimer()-lastTime;
			lastTime += timePassed;
			
			// 移动炮弹
			this.x += dx*timePassed/1000;
			this.y += dy*timePassed/1000;
			
			//炮弹在屏幕顶部飞离
			if (this.y < 0) {
				deleteBullet();
			}
			
		}

		// 将炮弹从舞台和列表中删除
		public function deleteBullet() {
			MovieClip(parent).removeBullet(this);
			parent.removeChild(this);
			removeEventListener(Event.ENTER_FRAME,moveBullet);
		}

	}
}


—————————————————我是优美的长分割线—————————————————————

最后一个为主类:

package {
	import flash.display.*;
	import flash.events.*;
	import flash.utils.Timer;
	import flash.text.TextField;
	
	public class AirRaid2 extends MovieClip {
		private var aagun:AAGun;//声明防空炮对象
		private var aagunbase:AAGunBase;
		private var airplanes:Array;//飞机对象
		private var bullets:Array;//子弹对象
		public var leftArrow,rightArrow:Boolean;//代表当前玩家的按键状
		private var nextPlane:Timer;//产生飞机的计时器
		private var shotsLeft:int;//剩余子弹数
		private var shotsHit:int;//击中目标数
		
		public function startAirRaid() {
			// 初始化数据
			shotsLeft = 20;
			shotsHit = 0;
			showGamescore();//更新舞台上的文本框
			
			// 创建防空炮
			aagun = new AAGun();
			addChild(aagun);
			aagunbase = new AAGunBase();
			addChild(aagunbase);
			aagunbase.x = aagun.x;
			aagunbase.y = aagun.y;
			
			// 创建子弹的数组和飞机的数组
			airplanes = new Array();
			bullets = new Array();
			
			// 键盘侦听
			stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
			stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
			
			// 检测碰撞
			addEventListener(Event.ENTER_FRAME,checkForHits);

			// 执行产生飞机的函数
			setNextPlane();
		}
		
		public function setNextPlane() {
			nextPlane = new Timer(1000+Math.random()*1000,1);//设定计时器
			//时间间隔1--2秒的函数
			nextPlane.addEventListener(TimerEvent.TIMER_COMPLETE,newPlane);
			nextPlane.start();
		}
		
		public function newPlane(event:TimerEvent) {
			//随机飞机的高度、速度和方向
			if (Math.random() > .5) {
				var side:String = "left";
			} else {
				side = "right";
			}
			var altitude:Number = Math.random()*50+20;//这里的高度并不是飞机相对地面的高度,因为顶部y=0,这里的高度是相对于顶部来说的。
			var speed:Number = Math.random()*150+150;
			
			// 创建的飞机,加入到舞台并加入到数组
			var p:Airplane = new Airplane(side,speed,altitude);
			addChild(p);
			airplanes.push(p);
			
			// 自动函数设置下一架飞机的生成
			setNextPlane();
		}
		
		// 检测碰撞
		public function checkForHits(event:Event) {
			for(var bulletNum:int=bullets.length-1;bulletNum>=0;bulletNum--){ //遍历所有的子弹
				for (var airplaneNum:int=airplanes.length-1;airplaneNum>=0;airplaneNum--) {//遍历所有的飞机
					if (bullets[bulletNum].hitTestObject(airplanes[airplaneNum])) {
						airplanes[airplaneNum].planeHit();//执行飞机被击中的函数
						bullets[bulletNum].deleteBullet();//删除子弹
						shotsHit++;//分数加1
						showGamescore();//更新文本框
						break;//跳出循环
					}
				}
			}
			
			if ((shotsLeft == 0) && (bullets.length == 0)) {
				endGame();//检测子弹剩余是否为0,如果是则游戏结束
			}
		}
		
		// 监听按键
		public function keyDownFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
				leftArrow = true;
			} else if (event.keyCode == 39) {
				rightArrow = true;
			} else if (event.keyCode == 32) {
				fireBullet();
			}
		}
		
		// 监听按键弹起
		public function keyUpFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
				leftArrow = false;
			} else if (event.keyCode == 39) {
				rightArrow = false;
			}
		}

		// 开火,创建子弹
		public function fireBullet() {
			if (shotsLeft <= 0) return;//子弹小于0,跳出函数
			var b:Bullet = new Bullet(aagun.x,aagun.y,aagun.rotation,300);//创建子弹对象
			addChild(b);//加入到舞台和数组
			bullets.push(b);
			shotsLeft--;//子弹数减一
			showGamescore();//更新文本
		}
		//更新文本,将分数和子弹显示在文本框中
		public function showGamescore() {
			showscore.text = String("score: "+shotsHit);
			showShots.text = String("Shots Left: "+shotsLeft);
		}
		
		// 执行函数执行将指定的飞机移除
		public function removePlane(plane:Airplane) {
			for(var i in airplanes) {
				if (airplanes[i] == plane) {
					airplanes.splice(i,1);
					break;
				}
			}
		}
		
		// 同上,将子弹移除数组
		public function removeBullet(bullet:Bullet) {
			for(var i in bullets) {
				if (bullets[i] == bullet) {
					bullets.splice(i,1);
					break;
				}
			}
		}
		
		// 游戏结束函数
		public function endGame() {
			// 移除飞机
			for(var i:int=airplanes.length-1;i>=0;i--) {
				airplanes[i].deletePlane();
			}
			airplanes = null;//将数值置空
			
			aagun.deleteGun();//移除防空炮
			aagun = null;
			removeChild(aagunbase);
			aagunbase = null;
			
			//移除各种侦听
			stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
			stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
			removeEventListener(Event.ENTER_FRAME,checkForHits);
			
			//停止计时器,将其置空
			nextPlane.stop();
			nextPlane = null;
			
			//跳到游戏结束帧
			gotoAndStop("gameover");
		}

	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐