사실 이름을 보면 알 수 있듯이 플렉스의 Button Component 와 크게 다를 것은 없습니다. 다른게 있다면...
1. 라이브프리뷰를 제공하지 않습니다
2. Sprite 가 아닌 MovieClip 을 상속받습니다.
3. 몇몇 속성과 메소드가 없습니다.
4. 몇몇
속성과 메소드 이름이 다릅니다
5. 게임 UI에 활용하기 위한 몇몇 속성과 메소드가 추가되어있습니다
6. 몇몇 속성과 메소드는 이름은 같지만 사용되는 방법이 다릅니다.
Inspectable 메타태그로서 Flash IDE 에 노출되는 속성값만 살펴보겠습니다.
Flash IDE 에는 component parameters 라고 쓰여져있는 판넬에 있습니다.
데이터 저장소라고 보시면 됩니다. 예를 들어 툴팁에 관한 내용을 저장해뒀다가 롤오버시 해당데이터를 불러서 툴팁을 뿌린다던가 하면 되겠죠. (Flex 와 달리 툴팁 속성이 따로 업습니다)
오브젝트 형태이기 때문에 뭐든 받을 수 있으나, IDE 상으로는 String 만 넣을 수 있겠죠??
예를 들어서 숫자를 늘리는 버튼을 클릭한다고 했을 때, 1에서 10까지 늘리기 위해 10번을 클릭할게 아니라 누르고 있으면 자동으로 디스패치가 발생합니다.
참고로 이때 발생하는 이벤트는 scaleform.clik.events.ButtonEvent.CLICK 이벤트("buttonClick")입니다.
저도 사실 CLIK 을 안썼습니다.
정확히는 제가 플렉스는 경험이 없는데다가, 컴포넌트는 느려...라는 생각에 멀리하다보니 컴포넌트는 거의(한번도) 써보지를 않았습니다.
하지만 게임 업계에서 UI를 만들다보니 좀 생각이 바꼈습니다. 계속해서 UI를 엎어야 하거든요...ㅡ.,ㅡ;;;
이런 상황에서 빨리 잘(정확히는 나쁘지 않게) 만들 수 있는데 왜 안쓰나입니다.
그래서 클릭에 관한 글도 조금씩 올려보려 합니다.
클릭은 (click 이 아니랍니다) 스케일폼에서 제공하는 UI component 들을 말합니다. 3.0 대의 클릭은 gs스키너 그룹에서 만들어 제공했는데, 4.0 대도 그런지는 잘 모르겠습니다.
일단 시작하기에 앞서 해둬야 할 것들이 있습니다.
4.0 버전대의 클릭은 이녀석들이 만들다 말았어요. FDT같이 강력한 문법체크를 하는 에디터에서 열어보면 오류 메세지를 마구마구 뿜어냅니다.
일단 플젝을 하나 만들고선 소스에 UDK (현재 1월 버전) 에 있는 클릭관련 소스들(제 컴 기준으로는 C:\UDK\UDK-2012-01\Development\Flash\AS3\CLIK 이 폴더입니다) 중 scaleform.clik.* 패키지와 scaleform.gfx.* 패키지를 넣어보면요... 크게 3군데의 오타가 있습니다
시작위치($x:Number, $y:Number)는 이론에 굳이 필요치 않으니 생략하였습니다. $width, $height 는 당연히 사각영역의 크기이고, $rate는 현재 시간의 비율값입니다. 0~1 까지를 인자로 받습니다.
왜 각도나 시간을 받지 않느냐 하시면... 제 취향입니다. 궁금하시면 이 글을 참고해 주세요.
그 다음에는 넓이와 높이의 절반을 구해야 합니다. 이유는 다음의 그림을 보시면 됩니다.
쿨타임이란게 결국 위와 같은 그림을 그려내는 과정입니다. 사각형을 그려내는건 일도 아니죠... 문제는 저 삼각형이 빠지는 영역의 드로잉입니다.
좌측 그림의 빠진 삼각형의 밑변(그림으로는 윗변이라고 해야겠군요)의 넓이를 알아야 하고, 우측 그림에서는 채워진 삼각형의 높이를 알아내야 합니다.
결국 사각영역 내에서 각도에 따른 x, y 값을 알아내는게 핵심입니다.
-90 에서부터 시계바늘이 돌다가(이렇게 표현해두죠) 사각형의 우측 상단의 꼭지점을 넘지 않은 지점이라면 좌측 그림에 해당하는 것이고, 꼭지점을 넘었다면 우측 그림에 해당하는 것이죠.
그럼 꼭지점을 넘은 여부는 그 시계바늘의 길이가 일정하다고 했을 때, 끝이 넓이의 절반을 넘느냐 안넘느냐입니다. 그림을 잘 보시면 알겠지만, 절대 45도가 아닙니다.
삼각형의 높이를 모릅니다만, 우리는 넓이를 알고 있습니다. 넓이의 절반이죠... 그리고 각도도 알고 있습니다.
각도와 넓이를 알고 있다? 바로 tan 입니다. tan(Θ) * hw 하면 높이를 알아낼 수 있습니다.
좌측을 볼까요?
우측과는 반대로 넓이를 모릅니다만, 높이를 알고 있습니다. 이번에는 tan 의 역수입니다. 1 / (
tan(Θ) * hh ) 하면 넓이를 알아낼 수 있습니다.
와~ 다 그렸다!!!~~~
여러분은 이제 기쁘게 이 as 파일을 가지고선 팀장님에게 자랑하러 가시면 됩니다.
"제가 해냈습니다. 팀장님!!!"
하지만 만약 제가 팀장이라면 이렇게 말할 겁니다.
"그냥 타임라인에 그려"
4. 브루스 윌리스가 귀신
아... 이건 완전 씩스쎈스 이후로 충격적인 반전입니다. 도대체 어쩌라는거냐...
위와 같은 방법을 이용해서 드로우 함수를 실행시키면 말이죠... 프레임 당 엄청난 실수 연산을 반복해야 합니다. 그것도 하나의 슬롯에서만 도는게 아니라 여러 군데서 동시에 제각각 돌고 있겠죠...
게다가 2번에서 언급했 듯이 scaleform4 에서는 렌더링을 최적화 시킬 10용 api도 지원하지 않습니다. (copyFrom 만 지원해도 좀 꽁수가 있는데 말이죠...)
실수연산 부하 + 렌더링 부하.... 가 매 프레임당 무수하게 일어날 겁니다.
하지만 프레임에다가 미리 그려놓고선 프레임 이동으로 쿨타임을 그린다면, 메모리는 좀 늘지 몰라도...
1. 실수연산을 하지 않는다
2. 한번에 렌더링을 해낸다. (이걸 설명하려고 scaleform4 에서 지원하지도 않는 2번을 저렇게 써댔습니다...)
이런 이득이 생깁니다...
5. 그러나 모두 사랑합시다.
무조건 런타임 드로우를 쓰지 말라는 얘기는 아닙니다. 개발 상황에 따라 런타임 드로잉이 꼭 필요할 수도 있겠죠... 당연한 얘기잖아요
그럴 때는 다음과 같은 방법을 고려하시기 바랍니다.
1. 짝수 렌더링과 같이 렌더링 주기를 조절하여 그린다.
2. visible = false 로 해두었다가 드로잉이 완료되면 true로 바꾼다.
3. 동시에 같은 모양을 여러군데 그리는 거라면, 드로잉 인스턴스를 하나로 사용하여 실수연산이라도 한번만 하게 만든다.
4. etc... (지금으로선 다른 방법은 떠오르질 않네요...)
적절한 상황에 맞게 적절한 방법을 사용하시는 것이 일을 잘하는 방법이겠죠...
p.s. 그냥 일정한 반지름으로 쭉 돌리고 마스크를 사각형으로 씌우는 방법이 있을 겁니다.
이러면 시각적으로는 원한대로 그려지겠지만, 실제로는 크기가 변경될겁니다.(원만큼의...)
이럴때, 혹시 scale9grid 를 사용했다면, 디스플레이 객체가 마구 변신하는 모습을 보시게 될겁니다...