scaleform.minarto.com

Window hit 감지 in AS2 0 본문

Scaleform

Window hit 감지 in AS2 0

미나토 2012. 4. 19. 12:32


mmorpg 를 만들다 보면 캐릭터 정보창, 인벤토리, 상점 등등등... 수많은 윈도우를 만들게 됩니다.

fps에서는 로비가 아닌 인게임에서 나오는 조작 가능한 UI는 많아봤자 10개 정도 될까요??? 아예 없을 수도 있죠...

어쨌든 mmorpg는 fps 와는 비교도 할 수 없이 창 UI 가 많죠...



우린 그 많은 윈도우 중에서 어느 윈도우가 마우스와 인터랙션이 일어났는지 알아내야 합니다.

해당 윈도우를 가장 상위 z뎁스로 올려야 할 수도 있고, 드래그가 되도록 해야할 수도 있기 때문입니다.


그런데 as2용으로는 MMOKit 이 없다보니, CLIK 중에는 Window 클래스 또한 없습니다. 정확히 말하면 없는게 아니라 숨겨져 있습니다. (as3용으로는 공식 CLIK 으로 승진합니다만...)

UDK 기준으로 Development\Flash\AS2\CLIK\demos\com\scaleform 이 폴더를 열어보시면 Window.as 파일이 있습니다. 해당 데모는 Development\Flash\AS2\CLIK\demos 폴더에 WindowDemo 라는 파일로 들어있고요...


어쨌든 Window.as 소스를 열어보면 onMouseDown 이라는 MovieClip 이벤트 함수가 실행되도록 되어있습니다. 여기서 해당 윈도우를 MouseDown 시에 가장 상위 Depth로 올리는 일을 합니다.


다음과 같은 코드로 짜여져 있습니다


private function onMouseDown() {

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

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

if (targetObj == this) {

swapDepths(_parent.getNextHighestDepth());

return;

}

targetObj = targetObj._parent;

}

}


참고로 Mouse.getTopMostEntity 는 스케일폼만의 api 로 호출 시점의 마우스 위치 밑에 있는 최하위 계층의(하위 뎁스가 아니고요) 디스플레이된 오브젝트를 리턴합니다.

마우스 다운시에 윈도우 속의 버튼이나 오브젝트든 어떠한 것이 마우스 밑에 있다면 그 부모를 찾아찾아 while 문을 타고 올라와서 해당 윈도우임을 확인했을 때, 윈도우를 최상위 뎁스로 올려놓지요...



네, 뭐 어쨌든 이렇게 작동 잘 합니다... 라고 말하고 끝내고 싶지만 이 방식에는 문제점이 꽤 있습니다.



as2 의 onMouseDown 이벤트as3 의 InteractiveObject 의 mouseDown 이벤트와 달리 해당 오브젝트가 아닌 stage 아무데나 마우스를 눌러도 일어나는 이벤트입니다.


화면상에 수십개의 윈도우가 불러 띄워져 있다면, 모든 윈도우 객체에서 저 함수를 실행하는겁니다.


뭔가 굉장히 비효율적이지 않나요?



그래서 저는 윈도우가 불러져서 붙게되는 컨테이너에서 저 부분을 대신 처리해줄 것을 제안합니다.



이걸 처리하기 위한 WindowManager 클래스를 한번 만들어보죠...


http://www.minarto.com/348 으로 이어집니다