root/Scripts/Enemy.as

User picture

Author: Ying

Revision: 7 («Previous)


File Size: 4.99 KB

(March 22, 2009 15:43 UTC) About 3 years ago


  

 
Show/hide line numbers
package Scripts
{
 
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;
 
	public class Enemy extends MovieClip
	{
		private var stageRef:Stage;
		private var GameMap:Array = new Array();
		private var bEnemyLoaded:Boolean;
		private var bActive:Boolean;
		
		// Movement vars
		public var bMoving:Boolean;
		public var iDir:int;
		//private var bBrake:Boolean;
		private  var mUp:int  = 1;
		private  var mDown:int = 2;
		private  var mRight:int = 3;
		private  var mLeft:int = 4;
		private  var mNone:int = 0;
		
		// Amoeba pos
		public var iAmPosX;
		public var iAmPosY;		
 
 		public function Enemy()
		{
			bEnemyLoaded = false;
			bActive = false;
		}
		
		public function IsReady():Boolean
	   { return bEnemyLoaded;}
	   
	   public function Activate():void
	   {bActive = true;}
 		
		public function CreateEnemy(stageRef:Stage)
		{
			trace("Enemy: Constructor");
			this.stageRef = stageRef;
			
			bMoving = false;
			iDir= mNone;
			
			iAmPosX = 0;
			iAmPosY = 0;
			
			this.name="nEnemy";
			
			addEventListener(Event.ENTER_FRAME, loop, false, 0, true);			
			bEnemyLoaded = true;
 
		}
		
		public function ScoutAmoebaAt(ax:int, ay:int)
		{ 
			iAmPosX = ax;
			iAmPosY = ay;
		}
		
		public function SetMap(gamemap:Array)
		{
			this.GameMap = gamemap;
		}
		
		public function loop(e:Event) : void
		{
			if(bActive)
			{
				MoveInput();
				ColisionDetection();
				Move();
			}
		}
		private function ColisionDetection()
		{
			if(bMoving)
			{
				//  the next cell 
				var nextCell:int 
				var nextX:int;
				var nextY:int;
				//trace("----:)---:(----")
//				trace("- Pos: x: "+ x + " y: "+ y );
				// in the direction i'm going
				switch(iDir)
				{
					case mLeft: 	nextX=(x-5)/25; nextY = y/25; 	/*trace("- Est: x: "+ (x-5) + " y: "+ y );	*/break;
					case mRight: 	nextX=(x+5+25)/25; nextY = y/25; 	/*trace("- Est: x: "+ (x+5+25) + " y: "+ y );		*/break;
					case mUp: 		nextX= x/25; 	nextY = (y-5)/25;  /*trace("- Est: x: "+ x + " y: "+ (y-5) );		*/break;
					case mDown: 	nextX= x/25; 	nextY = (y+5+25)/25; /*trace("- Est: x: "+ x + " y: "+ (y+5+25) );		*/break;
					default: trace("Error: ColDec wrong Enemy dir: " + iDir); break;
				}
				//trace("- Dir: "+ GetDir() +" at: " + nextX + ", " + nextY);
				
				// Safety correction:
				if(nextX < 0) {trace("Error: ColDect trying to go, x:" + nextX); nextX=0;}
				if(nextX > 21) {trace("Error: ColDect trying to go, x:" + nextX); nextX=21;}
				if(nextY < 0) {trace("Error: ColDect trying to go, y:" + nextY); nextY=0;}
				if(nextY > 15) {trace("Error: ColDect trying to go, y:" + nextY); nextY=21;}
				
				nextCell= GameMap[nextY][nextX];
				//trace("- Next Cell Val: " + nextCell );
				
				// is not passable
				if(nextCell == 0 || nextCell == 1 ||nextCell == 2 ||nextCell == 3 ||nextCell == 4 )
				{
					//trace("Stop");
					// stop when i reach it
					bMoving = false;
					// Fix the extra pixels
					switch(iDir)
					{
						case mLeft: 	x=(nextX+1)*25; break;
						case mRight: 	x=(nextX-1)*25; break;
						case mUp: 		y=(nextY+1)*25; break;
						case mDown: 	y=(nextY-1)*25; break;
						default: trace("Error: ColDec wrong Enemy dir: " + iDir); break;
					}
					iDir=mNone;
					
				}
				
			}
		}
		
		private function MoveInput():void
		{
			// Getting Directions
			if(!bMoving)
			{
				var tdirH:int;
				var tdirV:int;
				var tdirHH:int;
				var tdirVV:int;
				
				bMoving = true;
				var newup:int =Math.random()*10+1;
				var newdo:int =Math.random()*10+1;
				var newri:int =Math.random()*10+1;
				var newle:int =Math.random()*10+1;
				
				if( iAmPosX < x ) newle+=4;
				else if( iAmPosX > x ) newri+=4;
				
				if( iAmPosY < y ) newdo+=4;
				else if( iAmPosY > y ) newup+=4;
				
				if(newdo > newup){ tdirV = newdo; tdirVV = mDown;}
					else  { tdirV = newup; tdirVV = mUp;}
				if(newri > newle){ tdirH = newri; tdirHH =mRight;}
					else { tdirH = newle; tdirHH=mLeft;}
					
				if( tdirH > tdirV ) iDir = tdirHH; else iDir = tdirVV;
				//trace(GetDir());
			}
		}
		
		private function Move():void
		{		
			// Locomotor action!
			if(bMoving)
			{
				switch(iDir)
				{
					case mLeft: 	x -= 5; break;
					case mRight: 	x += 5; break;
					case mUp: 		y -= 5; break;
					case mDown: 	y += 5; break;
					default: trace("Error: wrong Enemy dir: " + iDir); break;
				}
			} 
		}

		
		
		public function removeSelf() : void
		{
			trace("Enemy: Destructor");
			
			removeEventListener(Event.ENTER_FRAME, loop);
			//removeEventListener(Event.EXIT_FRAME, removeSelf);
 
			if (stageRef.contains(this)) stageRef.removeChild(this);
		}
		
		public function GetDir():String
		{
			if(iDir==mUp) return "Up";
			else if(iDir==mDown) return "Down";
			else if(iDir==mRight) return "Right";
			else if(iDir==mLeft) return "Left";
			else if(iDir==mNone) return "Stopped";
			else return ("Unknown: "+ iDir);
		}
 
	}
 
}