DFdou's Blog Life is short,Be yourself.

502/100

AS3-aSpaceEscape 迷宫脱离游戏(三)角色部分

刚我们讲了地图,看起来还是挺简单的,只要输入一个数组,或者说是一个地图矩阵块,一个地图就被生成了。
那下边我们无敌的主角就要上场了,就是那个看起来在大笑,那个很嚣张的东东,我们就起个类名叫Role好了,当然你也可以把这个类叫JJ,GG,MM,DD,etc~

跟角色有关的逻辑应该尽量都放在这个类内部,为啥说应该尽量呢,有些时候有变态的特殊需求嘛。
好,来看Role.as:

package org.nwhy.aSpaceEscape{
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.geom.Rectangle;
	import flash.events.*;

	public class Role extends Sprite {
		private var mStage:Stage;//根场景的stage;
		private var level:uint;
		private var mSpeed:int = Config.TILE_SIZE;//移动速度
		private var xSpeed:int;
		private var ySpeed:int;
		private var mDown:Array = [0,0,0,0];//按键组合,只需要上下左右不需要45度角,so...
		private var isKeyDown:Boolean;

		public function Role(stage:Stage):void {
			level = Controller.level;
			mStage = stage;
			reset();
			//添加事件监听
			addEventListeners();
		}
		private function addEventListeners():void{
			mStage.addEventListener(KeyboardEvent.KEY_DOWN, mKeyDownHandler);//Keyboard事件
			mStage.addEventListener(KeyboardEvent.KEY_UP, mKeyUpHandler);
			addEventListener(Event.ENTER_FRAME, mUpdate);
		}
		private function mKeyDownHandler(e:KeyboardEvent):void{
			if(!isKeyDown){
				switch (e.keyCode) {
					case 37 :
						mDown[0]=1;
						break;
					case 38 :
						mDown[1]=1;
						break;
					case 39 :
						mDown[2]=1;
						break;
					case 40 :
						mDown[3]=1;
					break;
				}
				isKeyDown = true;
			}
			checkKeyDown(mDown.join(""));
		}
		private function mKeyUpHandler(e:KeyboardEvent):void {
			switch (e.keyCode) {
				case 37 :
					mDown[0]=0;
					break;
				case 38 :
					mDown[1]=0;
					break;
				case 39 :
					mDown[2]=0;
					break;
				case 40 :
					mDown[3]=0;
					break;
			}
		}
		private function checkKeyDown(k:String){
			switch(k){
				case "1000" :
					//trace("left");
					xSpeed = - mSpeed;
					ySpeed = 0;
					break;
				case "0100" :
					//trace("top");
					xSpeed = 0;
					ySpeed = - mSpeed;
					break;
				case "0010" :
					//trace("right");
					xSpeed = mSpeed;
					ySpeed = 0;
					break;
				case "0001" :
					//trace("down");
					xSpeed = 0;
					ySpeed = mSpeed;
					break;
			}
		}
		private function mUpdate(e:Event){
			var posX:int = (x+xSpeed)/mSpeed;
			var posY:int = (y+ySpeed)/mSpeed;

			if(posX>=Config.TILE_PERLINE || posY>=Config.TILE_PERLINE || posX< =-1 || posY<=-1){
				trace("out of stage");
				xSpeed = 0;
				ySpeed = 0;
				reset();
				isKeyDown = false;
			}else if(Config.MAP[level][posY][posX] > 1 && Config.MAP[level][posY][posX] !=5){
				xSpeed = 0;
				ySpeed = 0;
				isKeyDown = false;
				//trace(posX,posY,Config.MAP[level][posY][posX]);
			}else if(Config.MAP[level][posY][posX] == 5){
				trace("succ");
				x += xSpeed;
				y += ySpeed;
				xSpeed = 0;
				ySpeed = 0;
			}

			x += xSpeed;
			y += ySpeed;
		}
		private function reset(){
			x = Config.ROLE_POSITION[Controller.level][0] * Config.TILE_SIZE;
			y = Config.ROLE_POSITION[Controller.level][1] * Config.TILE_SIZE;
		}
	}
}


啊呀呀,看起来有点长,不过别怕,很简单,来,哥哥教你@。@
关注下mStage这个变量,为什么会需要这个变量呢?

假设,直接在Role上加KeyboardEvent,那问题很明显,这个事件只有在Role的stage上次才会触发,这不会触发的…至于为啥不会触发,听我的就是了,就是不会触发~(PS:因为不可能在Role上发生KeyboardEvent)

所以呢,这个Role就需要外部传过来的一个stage变量,来让自己知道自己属于哪个舞台,或者说哪个车间,哪个厂也可以…然后就可以侦听到该stage(车间,厂)里的KeyboardEvent了。
当然,也可以直接在stage下给Role绑定KeyboardEvent,不过这样不好,不面向对象嘛~

接下去我们看mKeyDownHandler方法:

private function mKeyDownHandler(e:KeyboardEvent):void{
			if(!isKeyDown){
				switch (e.keyCode) {
					case 37 :
						mDown[0]=1;
						break;
					case 38 :
						mDown[1]=1;
						break;
					case 39 :
						mDown[2]=1;
						break;
					case 40 :
						mDown[3]=1;
					break;
				}
				isKeyDown = true;
			}
			checkKeyDown(mDown.join(""));
		}

checkKeyDown这个方法:

private function checkKeyDown(k:String){
			switch(k){
				case "1000" :
					//trace("left");
					xSpeed = - mSpeed;
					ySpeed = 0;
					break;
				case "0100" :
					//trace("top");
					xSpeed = 0;
					ySpeed = - mSpeed;
					break;
				case "0010" :
					//trace("right");
					xSpeed = mSpeed;
					ySpeed = 0;
					break;
				case "0001" :
					//trace("down");
					xSpeed = 0;
					ySpeed = mSpeed;
					break;
			}
		}

为何会有mDown这个数组的原因很简单,因为Role的移动是被限制的,它不能走斜线。如果直接根据KeyboardEvent.keyCode赋值的话,可能会出现用户同时按下多个按键的状况,那Role的移动就有问题了不是么。

mUpdate方法,负责控制Role运动的:

private function mUpdate(e:Event){
			var posX:int = (x+xSpeed)/mSpeed;
			var posY:int = (y+ySpeed)/mSpeed;

			if(posX>=Config.TILE_PERLINE || posY>=Config.TILE_PERLINE || posX< =-1 || posY<=-1){
				trace("out of stage");
				xSpeed = 0;
				ySpeed = 0;
				reset();
				isKeyDown = false;
			}else if(Config.MAP[level][posY][posX] > 1 && Config.MAP[level][posY][posX] !=5){
				xSpeed = 0;
				ySpeed = 0;
				isKeyDown = false;
				//trace(posX,posY,Config.MAP[level][posY][posX]);
			}else if(Config.MAP[level][posY][posX] == 5){
				trace("succ");
				x += xSpeed;
				y += ySpeed;
				xSpeed = 0;
				ySpeed = 0;
			}

			x += xSpeed;
			y += ySpeed;
		}

先是预估下Role按照目前行动下一步会达到的地方,然后对这个值进行判断,是不是出界,是的话就搬回原点去。
然后判断下是不是不可移动的Tile,是的话就停下。
接着是判断是不是出口,是的话就success了~

Some Random 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.