θυοιβ

ActionScript3
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Breakout

Posted on 2011-05-27 00:45  ichow  阅读(245)  评论(0)    收藏  举报
Program: Flash Language: AS3 Software Used: Flash Professional CS5, FlashDevelop 3.3.4

Demo!

Source

package
{
	import flash.display.MovieClip;
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	/**
	 * ...
	 * @author iChow
	 */
	public class Breakout extends MovieClip
	{
		private static const ADDSCORE:int = 100;
		private static const BWIDTH:int = 320;
		private static const BHEIGHT:int = 480;

		private var currLevel:int;
		private var currScore:int;
		private var isPlaying:Boolean;

		private var tileAry:Array;
		private var mapAry:Array;
		private var mapIndex:int;

		private var ball:Ball;
		private var breaker:Breaker;
		private var pauseSpt:Pause;
		private var __breakerTitleSpt:Sprite;
		private var __startBtn:SimpleButton;
		private var __sllSpt:Sprite;
		private var __scText:TextField;
		private var __liText:TextField;
		private var __leText:TextField;
		private var __tip:Sprite;
		private var __tText:TextField;
		private var __iText:TextField;

		private var speed:Number = 1;
		private var lives:int = 3;

		public function Breakout()
		{
			if (stage) Init();
			else addEventListener(Event.ADDED_TO_STAGE, Init);
		}

		private function Init(e:Event=null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, Init);
			//get obj
			__breakerTitleSpt = this.getChildByName("breaker_mc") as Sprite;
			__startBtn = this.getChildByName("start_btn") as SimpleButton;
			__sllSpt = this.getChildByName("sll_mc") as Sprite;
			__scText = __sllSpt.getChildByName("scText") as TextField;
			__liText = __sllSpt.getChildByName("liText") as TextField;
			__leText = __sllSpt.getChildByName("leText") as TextField;
			mapAry = Map.getMap();

			ball = new Ball();
			breaker = new Breaker();
			pauseSpt = new Pause();
			__tip = pauseSpt.getChildByName("tip") as Sprite;
			__tText = __tip.getChildByName("tText") as TextField;
			__iText = __tip.getChildByName("iText") as TextField;

			tileAry = new Array();
			addChild(ball);
			addChild(breaker);
			ball.visible = false;
			breaker.visible = false;

			//add event
			__startBtn.addEventListener(MouseEvent.CLICK, startClickHandler);
			__tip.addEventListener(MouseEvent.CLICK, reStartGame);
			__tip.buttonMode = true;
			__tip.mouseChildren = false;
		}

		private function updateText():void
		{
			__scText.text = "score:"+currScore;
			__liText.text = "lives:"+lives;
			__leText.text = "level:"+currLevel;
		}

		private function startClickHandler(e:MouseEvent):void
		{
			__startBtn.visible = false;
			__breakerTitleSpt.visible = false;
			__sllSpt.y = 0;
			startGame();
		}
		private function startGame():void {
			//
			currLevel = 1;
			currScore = 0;
			mapIndex = 0;
			lives = 3;
			speed = 1;
			updateText();

			addEventListener(Event.ENTER_FRAME, ballEnterFrameHandler);
			//removeTiles();
			createTiles();
			reSetBall();
		}

		private function createTiles():void
		{
			tileAry = [];
			for (var i:int = 0; i < mapAry[mapIndex].length; i++) {
				for (var j:int = 0; j < mapAry[mapIndex][i].length; j++) {
					if (mapAry[mapIndex][i][j] != 0) {
						var _tile:Tile = new Tile();
						_tile.x = (_tile.width+2) * j;
						_tile.y = (_tile.height+2) * i + 40;
						addChild(_tile);
						tileAry.push(_tile);
					}
				}
			}
			ball.visible = true;
			breaker.visible = true;
		}

		private function removeTiles():void
		{
			for (var i in tileAry) {
				removeChild(tileAry[i]);
			}
		}

		private function ballEnterFrameHandler(e:Event):void
		{
			if (this.mouseX >= BWIDTH - breaker.width / 2) {
				breaker.x = BWIDTH - breaker.width / 2;
			}else if (this.mouseX > breaker.width / 2 ) {
				breaker.x = this.mouseX;
			}else {
				breaker.x = breaker.width / 2;
			}
			if (isPlaying) {
				if (ball.x <= ball.width / 2) {
					ball.dx = 1;
					ball.x = ball.width / 2;
				}else if (ball.x >= BWIDTH - ball.width / 2) {
					ball.dx = -1;
					ball.x = BWIDTH - ball.width / 2;
				}
				if (ball.y <= 25) {
					ball.dy = 1;
					ball.y = 25;
				}else if (ball.y > (breaker.y + breaker.height)) {
					lostGame();
				}

				if (breaker.hitTestObject(ball)) {
					ball.dy = -1;
					if (ball.x < breaker.x) {
						if (ball.dx > 0) ball.dx = -1;
					}else {
						ball.dx = 1;
					}
				}
				for (var i in tileAry) {
					if (ball.hitTestObject(tileAry[i])) {
						currScore += ADDSCORE;
						updateText();
						ball.dy *= -1;
						removeChild(tileAry[i]);
						tileAry.splice(i, 1);
					}
				}
				if (tileAry.length == 0) {
					winGame();
				}

				ball.x += ball.vx * ball.dx * speed;
				ball.y += (ball.vy + ball.dv) * ball.dy * speed;
			}else {
				ball.x = breaker.x;
				ball.y = breaker.y - ball.height / 2;
			}
		}

		private function winGame():void
		{
			currLevel++;
			mapIndex++;
			speed = 1 + currLevel*0.2;
			updateText();
			isPlaying = false;
			removeEventListener(Event.ENTER_FRAME, ballEnterFrameHandler);
			addChild(pauseSpt);
			if (mapIndex == mapAry.length) {
				__tText.text = "CREAT!!";
				__iText.text = "PLAY AGAIN?";
			}else {
				__tText.text = "YOU WIN";
				__iText.text = "CONTINUE..";
			}
		}

		private function lostGame():void
		{
			lives--;
			updateText();
			isPlaying = false;
			removeEventListener(Event.ENTER_FRAME, ballEnterFrameHandler);
			addChild(pauseSpt);
			if (lives == 0) {
				//end;
				__tText.text = "GAME OVER";
				__iText.text = "TRY AGAIN.";
			}else {
				//continue
				__tText.text = "YOU LOSE";
				__iText.text = "CONTINUE..";
			}
		}

		private function reStartGame(e:MouseEvent):void
		{
			removeChild(pauseSpt);
			if (lives == 0||mapIndex == mapAry.length) {
				//clear all and re start
				removeTiles();
				__sllSpt.y = -20;
				ball.visible = false;
				breaker.visible = false;
				__breakerTitleSpt.visible = true;
				__startBtn.visible = true;
				trace("restart");
			}else {
				//re start
				addEventListener(Event.ENTER_FRAME, ballEnterFrameHandler);
				removeTiles();
				createTiles();
				reSetBall();
				trace("continue");
			}
		}

		private function reSetBall():void
		{
			breaker.x = 160;
			breaker.y = 450;
			ball.x = breaker.x;
			ball.y = breaker.y - ball.height / 2;
			isPlaying = false;
			addEventListener(MouseEvent.CLICK, ballClickHandler);
		}

		private function ballClickHandler(e:MouseEvent):void
		{
			if (e.target.name!="breakout") return;
			trace("click!");
			isPlaying = true;
			removeEventListener(MouseEvent.CLICK, ballClickHandler);
		}
	}

}
胆大心细脸皮厚