DFdou's Blog Life is short,Be yourself.

2007/090

AS3-子弹躲避游戏(下)

接上一篇《AS3-子弹躲避游戏(上)》
有了Enemy和Role之后,自然就是游戏的主体控制部分了,这里是Game类:
这个类负责生成多少个Enemy,Role如何移动,游戏如何开始和如何结束,以及控制其他事务,比如记时类。

package{
	import flash.display.Sprite;
	import flash.events.*;
	import flash.utils.Timer;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import fl.controls.Button;
	import Config;
	import Role;
	import Enemy;
	import TimeCount;

	public class Game extends Sprite{
		private var _role:Role;
		private var _enemy:Sprite;
		private var _time:TimeCount;
		private var _enemyTotal:uint;
		private var _gameFlag:Boolean;

		private var startBtn:Button;
		private var gameInfo:TextField;

		//存储四个方向键是否按下的变量
		private var leftArrow:Boolean=false;
		private var rightArrow:Boolean=false;
		private var upArrow:Boolean=false;
		private var downArrow:Boolean=false;

		public function Game():void{
			startBtn = new Button();
			startBtn.label = "StartGame";
			startBtn.x=(Config.STAGE_W-startBtn.width)/2;
			startBtn.y=(Config.STAGE_H-startBtn.height)/2;
			addChild(startBtn);
			startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);
			gameInfo = new TextField();
			gameInfo.autoSize = TextFieldAutoSize.LEFT;
			gameInfo.selectable = false;
			gameInfo.text = "上下左右方向键控制方块移动,被黑球击中就挂了。";
			gameInfo.x = (Config.STAGE_W-gameInfo.width)/2;
			gameInfo.y = startBtn.y-30;
			addChild(gameInfo);
		}
		private function gameStart(_evt:MouseEvent):void{
			startBtn.removeEventListener(MouseEvent.MOUSE_DOWN,gameStart);
			startBtn.visible = false;
			gameInfo.visible = false;
			init();
		}
		private function init():void{
			initTime();
			initRole();
			initEnemy();
		}
		private function initTime():void{
			_time = new TimeCount();
			addChild(_time);
		}
		private function initRole():void{
			_role = new Role();
			addChild(_role);
			_role.x=(Config.STAGE_W-_role.width)/2;
			_role.y=(Config.STAGE_H-_role.height)/2;
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
			_role.addEventListener(Event.ENTER_FRAME, roleMove);
			stage.addEventListener(Event.DEACTIVATE, missingStage);//Flash处于非活动状态时调用
		}

		private function initEnemy():void{
			_enemyTotal = Config.ENEMY_TOTAL;
			var t:Timer=new Timer(2000,1);
			t.addEventListener(TimerEvent.TIMER, timeToCreateEnemy);
            t.start();
		}

		private function createEnemy():void{
			var enemy=new Enemy();
			enemy.setRole(_role);
			_enemy.addChild(enemy);
		}
		private function getEnemyNum():uint{
			return this.numChildren;
		}

		private function timeToCreateEnemy(_evt:TimerEvent):void{
			_enemy = new Sprite();
			addChild(_enemy);
			for (var i:uint=0; i<_enemytotal ; i++) {
				createEnemy();
			}
			addEventListener(Event.ENTER_FRAME,checkFlag);
		}

		//按键时的检测,左上右下分别是37,38,39,40
		private function keyPressedDown(_evt:KeyboardEvent) {
			if (_evt.keyCode==37) {
				leftArrow=true;
			} else if (_evt.keyCode == 39) {
				rightArrow=true;
			} else if (_evt.keyCode == 38) {
				upArrow=true;
			} else if (_evt.keyCode == 40) {
				downArrow=true;
			}
		}

		//松开按键时
		private function keyPressedUp(_evt:KeyboardEvent) {
			if (_evt.keyCode==37) {
				leftArrow=false;
			} else if (_evt.keyCode == 39) {
				rightArrow=false;
			} else if (_evt.keyCode == 38) {
				upArrow=false;
			} else if (_evt.keyCode == 40) {
				downArrow=false;
			}
		}
		private function roleMove(_evt:Event) {
			//移动的速度
			var speed:Number=Config.ROLE_SPEED;
			if (leftArrow) {
				//MC的位置检测,下边相同
				if (0<=_role.x) {
					_role.x-=speed;
				}
			}
			if (rightArrow) {
				if (_role.x<=Config.STAGE_W-_role.width) {
					_role.x+=speed;
				}
			}
			if (upArrow) {
				if (0<=_role.y) {
					_role.y-=speed;
				}
			}
			if (downArrow) {
				if (_role.y<=Config.STAGE_H-_role.height*2) {
					_role.y+=speed;
				}
			}
		}

		//Flash处于非激活状态时
		private function missingStage(_evt:Event) {
			leftArrow=false;
			rightArrow=false;
			upArrow=false;
			downArrow=false;
		}
		private function checkFlag(_evt:Event):void{
			//trace(_gameFlag);
			if(_gameFlag){
				_gameFlag = false;
				gameOver();
			}
		}
		private function gameOver(){

			removeEventListener(Event.ENTER_FRAME,checkFlag);
			_time.stopTime();

			gameInfo.text = "You Failed At " + _time.getTime() + " Second!";
			var format:TextFormat = new TextFormat();
			format.font = "Arial";
            format.color = 0xFF0000;
            format.size = 30;
            gameInfo.setTextFormat(format);
			gameInfo.x=(Config.STAGE_W-gameInfo.textWidth)/2;
			gameInfo.y=(Config.STAGE_H-gameInfo.textHeight)/2;
			gameInfo.visible = true;

			startBtn.visible = true;
			startBtn.y = gameInfo.y + 40;
			startBtn.addEventListener(MouseEvent.MOUSE_DOWN,gameStart);

			//_role.roleClear();
			_role.removeEventListener(Event.ENTER_FRAME, roleMove);
			removeChild(_role);

			while(_enemy.numChildren>0){
				Enemy(_enemy.getChildAt(0)).enemyClear();
				_enemy.removeChildAt(0);
			}
			removeChild(_enemy);
		}
		public function setGameFlag(_value:Boolean):void{
			_gameFlag = _value;
		}
	}
}


然后是一个不是很重要的类,记时类:

package{
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFieldAutoSize;
	import flash.utils.Timer;
    import flash.events.TimerEvent;

	public class TimeCount extends TextField{
		private var _timeCount:uint;
		private var t:Timer;
		var format:TextFormat;

		public function TimeCount():void{
			init();
		}
		private function init(){
			format = new TextFormat();
			format.font = "Arial";
			format.color = 0x666666;
            format.size = 15;
			format.bold = true;
			_timeCount=0;
			autoSize = TextFieldAutoSize.LEFT;
			selectable = false;
			t = new Timer(1000);
			t.addEventListener(TimerEvent.TIMER,showTimeCount);
			t.start();
		}
		private function showTimeCount(_evt:TimerEvent):void{
			_timeCount++;
			showTime(_timeCount);
		}
		private function showTime(timeCount:uint):void{
			var _count = String(timeCount);
			text = "Time: " + _count + " Second";
			setTextFormat(format);
		}
		public function stopTime():void{
			t.start();
			t.removeEventListener(TimerEvent.TIMER,showTimeCount);
			text = "";
		}
		public function getTime():uint{
			return _timeCount;
		}
	}
}

当然了,你可以加入声音类,Enemy子类,Role子类,以及其他的OOXX的OOX之类的。
或者加入开始动画,结束动画,甚至是和《特训!99》一样加入一个巧妙度的计算类?

Some Related Posts

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

:zhuang :xizao :wuwu :wenhao :wc :touxiang :shuaya :shuajian :shengtian :paopao :no :meinv :maonv :loveu :leilei :kua :jrjr :dahan :chi :chaocai :byebye


CommentLuv Enabled

No trackbacks yet.