scaleform.minarto.com

Window hit 감지 in AS2 1 본문

Scaleform

Window hit 감지 in AS2 1

미나토 2012. 4. 23. 11:24

http://www.minarto.com/346 에서 이어집니다


뭐 당연히 컨테이너가 될 MovieClip 가 있을 것이고 그 안에 MoiveClip 들을 만들어 로드를 하겠지요... 그 컨테이너가 _root 가 됐건 아니건 말이죠.


as3 용 mmokit 과 비슷한 방식으로 만들어본다면


WindowManager.init($canvas:MovieClip);


이런 식으로 초기화를 하도록 static 메소드를 하나 만들면 될겁니다.


싱글턴으로 하던지 아니던지는 알아서 하시고, 중요한건 마우스 이벤트겠죠?

Mouse.addListener(this);

마우스 이벤트를 연결합니다.


그럼 당연히 onMouseDown 을 구현해야 하고요... 그런데 과거 포스팅에서도 언급한 적이 있는데, 스케일폼에서는 플래시와는 다른 확장 api를 제공합니다

윈도우 히트와 관련된 api는 두가지가 있습니다. onMouseDown 또는 onMouseUp 시에 받는 target 인자와 Mouse.getTopMostEntity(false); 라는 Mouse static 메소드입니다.


 onMouseDown 또는 onMouseUp 시의 인자는 다음과 같습니다.

onMouseDown($button, $target),  onMouseUp ($button, $target)

첫번째 인자는 마우스의 어떤 버튼을 클릭했는지이고, 두번째 인자는 마우스 밑에 있는 오브젝트의 경로를 String으로 리턴해 줍니다.


그럼 해당 오브젝트의 포인터를 다음과 같이 구할 수 있습니다.


if ($target) {

var a = $target.split(".");

var t = _root[a[1]];

if (t == $canvas) {

t = $target[a[2]];

}

}


저는 _root 에 바로 컨테이너를 만들었기 때문에 이런식으로 디스플레이 객체인 t 를 구할 수 있는 겁니다. t는 바로 불러온 window 가 되는거죠...


getTopMostEntity 를 쓸 경우는 앞선 포스팅에서 말한대로 Window 클래스 안에 있던 코드와 거의 같습니다. 그걸 컨테이너 기준으로 바꾸면 되죠.


var targetObj:Object = Mouse.getTopMostEntity(false);

while (targetObj != null && targetObj != _root) {

if (targetObj == this) {

return;

}

if(targetObj._parent == $canvas){

return;

}

else{

targetObj = targetObj._parent;

}

}


이정도가 되겠네요...


저는 반복문 쓰기가 싫어서 앞선 전자를 썼습니다만... 전자는 문자열을 나눠 배열객체를 생성해야 한다는걸 고려해야 합니다.

모든 것이 비용이죠...



뭐 마음에 드는 방법을 쓰시면 됩니다만 어느쪽이든 Window 내에 들어있는 방법보다 장점이 확실합니다.


Window 에 있는 방법은 Mouse 의 이벤트를 모든 Window 에서 각각 처리합니다. 각각 반복문과 조건문이 돌아가겠죠...

Window 의 갯수가 많으면 많을 수록 그 비용은 비례하게 될겁니다.

게다가 렌더링이 아닌 코어는 싱글 스레드입니다. 과연 시간이 얼마나 걸릴까요...


그리고 각각의 Window 안에는 프레임에 해당하는 hit 무비클립과 타이틀 쪽에 마우스 이벤트까지 처리합니다. 이 역시 비용이죠.



하지만 제가 말씀드린 방법은 Mouse 이벤트를 한 곳에서 처리합니다. 각각의 hit 무비클립과 타이틀 버튼에 이벤트를 걸지 않아도 됩니다.



뭐 정확한 벤치마크를 보여드린 건 아니지만 충분히 차이를 짐작할 수 있지 않을까요??