AS3 자체 충돌 탐지 방법 3가지

5187 단어
AS3에는 다음과 같은 세 가지 충돌 감지 방법이 있습니다.
DisplayObject의 hitTestObject()//두 디스플레이 객체가 충돌했는지 체크(투박하게)
DisplayObject의 hitTestPoint()//점 하나가 디스플레이 객체와 충돌하는지 확인
BitmapData의 hitTest()//픽셀급 충돌 탐지
1. DisplayObject의 hitTestObject():
두 디스플레이 객체가 충돌했는지 체크합니다.
이것은 가장 거친 충돌이다. 두 개의 가시 대상 (DisplayObject) 의 테두리가 겹치면 두 개의 충돌로 간주된다
package
{
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.text.TextField;
	
	/**
	 *  : (DisplayObject) , 
	 * 
	 */
	public class HitTestObject_test extends MovieClip
	{
		private var circle1:Shape;
		private var circle2:Shape;
		private var msg:TextField;
		
		public function HitTestObject_test()
		{
			circle1 = new Shape();
			circle1.graphics.beginFill(0xFF0000);
			circle1.graphics.drawCircle(0, 0, 40);
			circle1.x = 100;
			circle1.y = 100;
			addChild(circle1);
			
			circle2 = new Shape();
			circle2.graphics.beginFill(0x00FF00);
			circle2.graphics.drawCircle(0, 0, 40);
			circle2.x = 50;
			addChild(circle2);
			
			msg = new TextField();
			msg.selectable = false;
			addChild(msg);
			
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private function enterFrameHandler(e:Event):void
		{
			circle2.x = mouseX;
			circle2.y = mouseY;
			
			if(circle1.hitTestObject(circle2))
				msg.text = "hit";
			else
				msg.text = "no hit";
			
			msg.x = mouseX + 20;
			msg.y = mouseY;
		}
	}
}

2. DisplayObject의 hitTestPoint()
점이 표시된 객체와 충돌하는지 체크합니다.
package
{
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.text.TextField;
	
	/**
	 *   x   y  
	 * 
	 */
	public class HitTestPoint_Test extends MovieClip
	{
		private var circle:Shape;
		private var msg:TextField;
		
		public function HitTestPoint_Test()
		{
			circle = new Shape();
			circle.graphics.beginFill(0x0000FF, 0.5);
			circle.graphics.drawCircle(0, 0, 40);
			circle.x = 100;
			circle.y = 100;
			this.addChild(circle);
			
			msg = new TextField();
			msg.multiline = true;
			msg.height = 50;
			msg.selectable = false;
			addChild(msg);
			
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private function enterFrameHandler(e:Event):void
		{
			if(circle.hitTestPoint(mouseX, mouseY, true))		// ( true)
				msg.text = "hit";
			else
				msg.text = "no hit";
			
			if(circle.hitTestPoint(mouseX, mouseY, false))		// ( true)
				msg.text += "
hit"; else msg.text += "
no hit"; msg.x = mouseX + 20; msg.y = mouseY; } } }
flash.display.DisplayObject.hitTestPoint(x:Number, y:Number, shapeFlag:Boolean=false):Boolean
참고 사항:
1. 검측점의 좌표(첫 번째, 두 개 파라미터)는 전체 무대를 좌표계로 해야 하며 이 가시적인 대상의 부모 용기를 좌표계로 할 수 없다.
2. 세 번째 파라미터가true일 때는 실제 이미지를 기준으로 하고(실제 이미지를 만났을 때 충돌이 발생했다고 생각하며)false일 때는 테두리를 기준으로 한다(테두리를 만났을 때 충돌이 발생했다고 생각한다).
3. BitmapData의 hitTest()
픽셀급의 충돌 검측
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.text.TextField;
	
	public class HitTest_Test extends MovieClip
	{
		private var bm1:Bitmap;
		private var bm2:Bitmap;
		private var msg:TextField;
		
		public function HitTest_Test()
		{
			var sp1:Sprite = new Sprite();
			sp1.graphics.beginFill(0xff0000, 0.5);
			sp1.graphics.drawCircle(50, 50, 50);
			sp1.graphics.endFill();
			var bmd1:BitmapData = new BitmapData(sp1.width, sp1.height, true, 0);
			bmd1.draw(sp1);
			bm1 = new Bitmap(bmd1);
			bm1.x = 150;
			bm1.y = 150;
			this.addChild(bm1);
			
			var sp2:Sprite = new Sprite();
			sp2.graphics.beginFill(0, 0.8);
			sp2.graphics.drawCircle(10, 10, 10);
			var bmd2:BitmapData = new BitmapData(sp2.width, sp2.height, true, 0);
			bmd2.draw(sp2);
			bm2 = new Bitmap(bmd2);
			this.addChild(bm2);
			
			msg = new TextField();
			msg.selectable = false;
			addChild(msg);
			
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private function enterFrameHandler(e:Event):void
		{
			bm2.x = mouseX-0.5*bm2.width;
			bm2.y = mouseY-0.5*bm2.height;
			
			msg.x = mouseX+20;
			msg.y = mouseY;
			
			if (bm1.bitmapData.hitTest(new Point(bm1.x, bm1.y), 127, bm2.bitmapData, new Point(bm2.x, bm2.y), 128))
			{
				msg.text ="hit";
			}
			else
			{
				msg.text ="no hit";
			}
		}
	}
}
flash.display.BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point=null, secondAlphaThreshold:uint=1):Boolean    
참고 사항:
1.firstPoint는 일반적으로 첫 번째bitmap의 왼쪽 상단점,secondBitmapDataPoint는 일반적으로 두 번째bitmap의 왼쪽 상단점으로 두 번째는 반드시 같은 좌표계를 참조해야 한다.
2. firstAlphaThreshold는 첫 번째bitmap에서 충돌 검측에 참여하는 픽셀의 최소 알파값을 나타낸다. 즉, 첫 번째bitmap의 픽셀점은 그 알파값이 firstAlphaThreshold보다 크면 충돌 검측에 참여할 수 있다.
3. secondAlphaThreshold는 두 번째bitmap에서 충돌 검측에 참여하는 픽셀의 최소 알파값을 나타낸다. 즉, 두 번째bitmap의 픽셀점은 알파값이 firstAlphaThreshold보다 클 때만 충돌 검측에 참여할 수 있다.
4. secondObject는 BitmapData 외에도 Rectangle, Point 또는 Bitmap일 수 있다.

좋은 웹페이지 즐겨찾기