2010년 3월 25일 목요일

(3) 충돌 감지 _ hitTestPoint()

hitTestPoint()

 

hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean 메서드는 영역대 포인트를 감지해서 hit를 발생시킨다. 여기서 말하는 영역이란 Flash에서 무비클립을 하나 만들면 그 무비클립 외각에 생기는 사각형 영역을 말한다. point는 객체를 말하는 것이다.

즉, 객체만을 인식하겠다는 것이다.

 

hitTestPoint()는 DisplayObject클래스의 메서드로 3개의 매개변수를 갖는다.

 

hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean

 

x는 x좌표, y는 y좌표, shapeFlag는 객체(true)의 실제 픽셀을 검사할 것인지 아니면 경계 상자(false)를 검사할 것인지를 나타낸다.

 

여기서 shapeFlag = true로 하면 영역을 인식하는 것이 아니라 객체만 인식하겠다는 것이다.

 

[code as3]
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

public class Main extends Sprite
{
 public function Main()
 {
  super();

  setTimer();
 }

 private function setTimer():void
 {
  var timer:Timer = new Timer(200, 50);

  timer.addEventListener(TimerEvent.TIMER, timerEventHandler);

  timer.start();
 }

 private function timerEventHandler(event:TimerEvent):void
 {
  var temp:Star = new Star();
  temp.tx = Math.random()* 3 + 1;
  temp.ty = Math.random()* 3 + 1;

  addChild(temp);

  temp.addEventListener(Event.ENTER_FRAME, tempEnterFrameHandler);
 }

 private function tempEnterFrameHandler(event:Event):void
 {
  var mc:MovieClip = MovieClip(event.target);

  if(mc.x < 0 || mc.x > stage.stageWidth)
  {
   mc.tx = -mc.tx; // swiching해줌
  }

  if(mc.y < 0 || mc.y > stage.stageHeight)
  {
   mc.ty = -mc.ty;
  }

  if( bg.hitTestPoint(mc.x, mc.y, true))
  {
   mc.gotoAndStop(2);

   mc.rotate = -5; //  dynamic 변수
  }
  else
  {
   mc.gotoAndStop(1);
   mc.rotate = 5;
  }

  mc.x += mc.tx;
  mc.y += mc.ty;
  mc.rotation += mc.rotate;
 }
}
}
[/code]

 

 

30~31번째 라인에서 정의 되지 않는 속성 tx, ty를 사용하였는데 이렇게 정의 되지 않는 속성을 사용할 수 있는 것은 MovieClip이 다이나믹으로 정의되어 있어서이다.

 

 

 

MovieClip이 다이나믹으로 되어있어서 변수명을 아무렇게나 지정해 주어도 생성한다.

대표적인 예로 object가 있다.

 

[code as3]
var o:Object = new Object();

o.a = 1; // 속성에는 a, b 가 없지만 a,b를 생성해준다.
o.b = 2

trace(a); // 1 출력
trace(b); // 2 출력
[/code]

 

댓글 없음:

댓글 쓰기