반응형
마우스를 향하는 화살표 예제입니다. 간단하니 일단 보시죠~


그럼 이제부터 제작 해보겠습니다~
일단 화살표를 그려야겠죠? 아주 간단히 하나 그립니다.
package shape
{
	import flash.display.Sprite;
	
	/**
	 * 화살표 클래스, 오른쪽을 향하는 상태로 그려진다.
	 */
	public class DArrow extends Sprite
	{
		private var m_nWidth:Number;
		private var m_nHeight:Number;
		private var m_uColor:uint;
		
		/**
		 * 생성자
		 * @param p_nWidth 화살표 가로크기(길이)
		 * @param p_nHeight 화살표 세로크기(두께)
		 * @param p_uColor 화살표 색상
		 * @param 
		 */
		public function DArrow( p_nWidth:Number = 50, p_nHeight:Number = 50, p_uColor:uint = 0xffff00  )
		{
			super();
			
			m_nWidth = p_nWidth;
			m_nHeight = p_nHeight;
			m_uColor = p_uColor;
			
			init();
		}
		
		private function init():void
		{
			graphics.clear();
			
			var nWidthHalf:Number = m_nWidth / 2;
			var nHeightHalf:Number = m_nHeight / 2;
			var nHeightQuarter:Number = m_nHeight / 4;
			
			graphics.lineStyle( 1, 0, 1 );
			graphics.beginFill( m_uColor );
			graphics.moveTo( -nWidthHalf , -nHeightQuarter );
			graphics.lineTo( 0, -nHeightQuarter );
			graphics.lineTo( 0, -nHeightHalf );
			graphics.lineTo( nWidthHalf, 0 );
			graphics.lineTo( 0, nHeightHalf );
			graphics.lineTo( 0, nHeightQuarter );
			graphics.lineTo( -nWidthHalf, nHeightQuarter );
			graphics.lineTo( -nWidthHalf, -nHeightQuarter );
			graphics.endFill();
		}
	}
}

이제 위에 만들어진 화살표를 담아서 실행항 메인 클래스를 작성합니다.
package sample.ex_03_trigonometric
{
	import flash.display.Sprite;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	
	import kr.uod.util.CCopyRightPosition;
	import kr.uod.util.FDrawCopyRight;
	import kr.uod.util.FDrawOutLine;
	
	import org.osmf.display.ScaleMode;
	
	import shape.DArrow;
	
	/**
	 * 마우스를 향하는 화살표 예제
	 */
	[SWF(backgroundColor="0xffffff", width="600", height="400", frameRate="30")]
	public class ArrowTowardMouse extends Sprite
	{
		private var m_dArrow:DArrow = new DArrow( 100, 50, 0xff0000 );
		
		public function ArrowTowardMouse()
		{
			super();
			
			stage.scaleMode = StageScaleMode.NO_SCALE;
			 
			init();
		}
		
		private function init():void
		{
			// 스테이지 외곽선 그리기
			FDrawOutLine( this );
			// 카피라이트
			FDrawCopyRight( this, "By LazyArtist" );
			
			// 화살표
			m_dArrow.x = stage.stageWidth / 2;
			m_dArrow.y = stage.stageHeight / 2;
			addChild( m_dArrow );
			
			this.addEventListener( Event.ENTER_FRAME, onEnterFrame );
		}
		
		private function onEnterFrame( e:Event ):void
		{
			var nPosX:int = mouseX - m_dArrow.x;
			var nPosY:int = mouseY - m_dArrow.y;

			// 화살표가 마우스를 향하게 하는 공식
			m_dArrow.rotation = Math.atan2( nPosY, nPosX ) * 180 / Math.PI;
		}
	}
}

여기서 가장 중요한 것은 53라인의 공식입니다. 
Math.atan() 처럼 비율을 파라미터로 전달하면 각도를 반환하는 것이 아니라
Math.atan2()는 y, x 파라미터를 받아서 각도(라디안)를 반환합니다. 플래시 좌표체계에 특화된 함수죠...
Math.atan2()를 사용하실때 주의할점은 Math.atan2( y, x ), 이렇게 y 값을 먼저 넣어준다는 점입니다. 
그렇지 않으면 플래시무비가 이상한 동작을 하게됩니다...

참~ 쉽죠잉~ ^^;

반응형

+ Recent posts