일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- watch
- 애드온
- scaleform4
- DataBinding
- 샌프란시스코
- flash cs3
- 집합의 연산
- 태그클라우드
- autodesk
- 플래시
- 클릭
- Chart
- ApplicationDomain
- flash
- 강좌
- Document Class
- flash player 10
- GDC
- 형변환
- as2
- as3.0
- 스케일폼
- addChild
- 수학정석
- MMOKit
- as3
- scaleform
- CLIK
- scaleform3
- KGC 2013
- Today
- Total
scaleform.minarto.com
Window hit 감지 in AS2 1 본문
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 무비클립과 타이틀 버튼에 이벤트를 걸지 않아도 됩니다.
뭐 정확한 벤치마크를 보여드린 건 아니지만 충분히 차이를 짐작할 수 있지 않을까요??