学习记录

整理,收藏及分享

flash as3.0气球游戏

我们需要一个大炮和一个底座,大炮可以旋转,而底座固定不动。通过键盘控制射击五颜六色的气球,击中气球显示爆炸的效果,气球消失。

时间轴上共三帧,intro、play和gameover,需要多个级别的排布。level1气球排练成简单的长方形,2级的时候排列成圆形,3级排列成两组圆形。

 

package {
	import flash.display.*;
	import flash.events.*;
	import flash.text.TextField;
	
	public class BalloonPop extends MovieClip {
		
		// 显示对象
		private var balloons:Array;
		private var cannonball:Cannonball;
		private var cannonballDX, cannonballDY:Number;
		
		// 按键
		private var leftArrow, rightArrow:Boolean;
		
		// 游戏属性
		private var shotsUsed:int;//跟踪炮弹的数量
		private var speed:Number;//速度
		private var gameLevel:int;//级别
		private const gravity:Number = .05;//重力
		
		public function startBalloonPop() {
			gameLevel = 1;
			shotsUsed = 0;
			speed = 6;
			gotoAndStop("level1");
		}
		
		public function startLevel() {
			showGameScore();
			
			// 创建对象数组
			findBalloons();
			
			// 侦听键盘
			stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
			stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
			
			// 检测碰撞
			addEventListener(Event.ENTER_FRAME,gameEvents);

		}
		
		public function findBalloons() {
			balloons = new Array();
			
			// 遍历所有的显示对象
			for(var i:int=0;i<numChildren;i++) {
				
				// 判断当前显示对象是否是气球
				if (getChildAt(i) is Balloon) {
					
					// 如果是,得到随机的气球颜色
					MovieClip(getChildAt(i)).gotoAndStop(Math.floor(Math.random()*5)+1);
					
					// 添加到气球列表
					balloons.push(getChildAt(i));
				}
			}
		}
		
		public function gameEvents(event:Event) {
			moveCannon();
			moveCannonball();
			checkForHits();
		}
		
		public function moveCannon() {
			var newRotation = cannon.rotation;
			
			if (leftArrow) {
				newRotation -= 1;
			}
			
			if (rightArrow) {
				newRotation += 1;
			}
			
			//判断边界  约定在-90°和-20°  -90°是朝上的
			if (newRotation < -90) newRotation = -90;
			if (newRotation > -20) newRotation = -20;
			
			//重定位
			cannon.rotation = newRotation;
		}

		public function moveCannonball() {
			
			// 只有当炮弹存在时才移动
			if (cannonball != null) {
				
				// 改变位置
				cannonball.x += cannonballDX;
				cannonball.y += cannonballDY;
				
				// 增加重力
				cannonballDY += gravity;
				
				// 判断炮弹是否落到地面
				if (cannonball.y > 340) {
					removeChild(cannonball);
					cannonball = null;
				}
			}
		}
		
		// 碰撞检测
		public function checkForHits() {
			if (cannonball != null) {
				
				// 遍历所有的气球
				for (var i:int=balloons.length-1;i>=0;i--) {
					
					// 判断他是否与炮弹接触
					if (cannonball.hitTestObject(balloons[i])) {
						balloons[i].gotoAndPlay("explode");
						break;
					}
				}
			}
		}
		
		// 按下键
		public function keyDownFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
				leftArrow = true;
			} else if (event.keyCode == 39) {
				rightArrow = true;
			} else if (event.keyCode == 32) {
				fireCannon();
			}
		}
		
		// 释放键
		public function keyUpFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
				leftArrow = false;
			} else if (event.keyCode == 39) {
				rightArrow = false;
			}
		}

		// 发射炮弹
		public function fireCannon() {
			if (cannonball != null) return;
			
			shotsUsed++;
			showGameScore();
			
			// 创建炮弹
			cannonball = new Cannonball();
			cannonball.x = cannon.x;
			cannonball.y = cannon.y;
			addChild(cannonball);
			
			// 将大炮和底座移到上面
			addChild(cannon);
			addChild(cannonbase);
			
			// 设置炮弹的方向
			cannonballDX = speed*Math.cos(2*Math.PI*cannon.rotation/360);
			cannonballDY = speed*Math.sin(2*Math.PI*cannon.rotation/360);
		}
		
		// 气球回调函数,将自己移除
		public function balloonDone(thisBalloon:MovieClip) {
			
			// 从屏幕中移除
			removeChild(thisBalloon);
			
			// 从数组中查找和移除
			for(var i:int=0;i<balloons.length;i++) {
				if (balloons[i] == thisBalloon) {
					balloons.splice(i,1);
					break;
				}
			}
			
			// 查看气球是否被消灭
			if (balloons.length == 0) {
				cleanUp();
				if (gameLevel == 3) {
					endGame();
				} else {
					endLevel();
				}
			}
		}
		
		// 停止游戏
		public function cleanUp() {
			
			// 停止所有的事件
			stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
			stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
			removeEventListener(Event.ENTER_FRAME,gameEvents);
			
			// 移除炮弹
			if (cannonball != null) {
				removeChild(cannonball);
				cannonball = null;
			}
			
			// 移除大炮
			removeChild(cannon);
			removeChild(cannonbase);
		}

		public function endLevel() {
			gotoAndStop("levelover");
		}
		
		public function endGame() {
			gotoAndStop("gameover");
		}
         //一个分布级别结束后,游戏停在leveover帧上,这一帧将玩家带到下一级别,并开始游戏
		public function clickNextLevel(e:MouseEvent) {
			gameLevel++;
			gotoAndStop("level"+gameLevel);
		}
		
		public function showGameScore() {
			showScore.text = String("Shots: "+shotsUsed);
		}
		
	}
}



时间轴脚本:

气球需要在自身的时间轴的最后一帧调用balloonDone。(爆炸后气球消失)

3个级别都需要调用startLevel函数:

startLevel();

同时,intro帧需要设置一个按钮用于开始游戏:

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

同样的,leveover帧上需要设置自身的按钮,用来调用主类中的clickNextLevel函数:

nextLevelButton.addEventListener(MouseEvent.CLICK,clickNextLevel);
最后,gameover帧也需要为按钮添加脚本:

playAgainButton.addEventListener(MouseEvent.CLICK,playAgainClick);
function playAgainClick(e:MouseEvent) {
 gotoAndStop("intro");
}

阅读更多
上一篇as3.0太空岩石
下一篇Starling 框架帮助手册中文版《一》
想对作者说点什么? 我来说一句

Flash as3.0制作的16个小游戏源码。

2013年09月09日 23.38MB 下载

AS3.0游戏18例源码包

2012年07月18日 36.06MB 下载

flash as3.0 空战游戏源码

2011年09月09日 10.31MB 下载

没有更多推荐了,返回首页

关闭
关闭