root/Scripts/Amoeba.as

User picture

Author: Ying

Revision: 7 («Previous)


File Size: 4.59 KB

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


  

 
Show/hide line numbers
package Scripts
{
 
	import flash.display.MovieClip;
	import com.senocular.utils.KeyObject;
	import flash.ui.Keyboard;
	import flash.display.Stage;
	import flash.events.Event;
 
	public class Amoeba extends MovieClip
	{
		private var stageRef:Stage;
		private var key:KeyObject;
		private var GameMap:Array = new Array();
		private var bAmoebaLoaded: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;
 
 		public function Amoeba()
		{
			bAmoebaLoaded = false;
			bActive = false;
		}
		
		public function IsReady():Boolean
	   { return bAmoebaLoaded;}
	   
	   public function Activate():void
	   {bActive = true;}
 		
		public function CreateAmoeba(stageRef:Stage)
		{
			trace("Amoeba: Constructor");
			this.stageRef = stageRef;
			
			bMoving = false;
			//bBrake = false;
			iDir= mNone;
			
			key = new KeyObject(stageRef);
			this.name="nAmoeba";
			
			addEventListener(Event.ENTER_FRAME, loop, false, 0, true);			
			//addEventListener(Event.EXIT_FRAME, removeSelf, false, 0, true);			
			bAmoebaLoaded = true;
 
		}
		
		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 Amoeba 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 Amoeba dir: " + iDir); break;
					}
					iDir=mNone;
					
				}
				
			}
		}
		
		private function MoveInput():void
		{
			// Getting Directions
			if(!bMoving)
			{
				bMoving = true;
				if 		(key.isDown(Keyboard.LEFT)) 	iDir = mLeft;
				else if (key.isDown(Keyboard.RIGHT))	iDir = mRight;	 
				else if (key.isDown(Keyboard.UP))		iDir = mUp;
				else if (key.isDown(Keyboard.DOWN))		iDir = mDown;
				else bMoving = false;
			}
		}
		
		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 Amoeba dir: " + iDir); break;
				}
			} 
		}

		
		
		public function removeSelf() : void
		{
			trace("Amoeba: 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);
		}
 
	}
 
}