맥스스크립트 심화

RolloutCreator Functions(6)

스크립팅하는애님 2021. 4. 12. 21:35
728x90
반응형

안녕하세요.

애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.

이전에 박스의 수가 늘어났을 때에 대한 수정을 이야기하도록 하겠습니다.

 

다음의 내용이 이전 시간까지 이야기했던 내용입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fn fn_action objNm =
(
    format "% 오브젝트와 연결되어 있습니다.\n" objNm
)
 
 
rci = rolloutCreator "BoxButton_Rollout" "Box Button"
rci.begin()
 
totalObj = $* as array
btnPosX = 5
btnPosY = 5
for i = 1 to totalObj.count do
(
    btnName = execute("#boxButton_btn" + (i as string))
    boxName = totalObj[i].name        
    rci.addControl #button btnName boxName paramStr:("width:45 height:20 pos:[" + (btnPosX as string) + "," + (btnPosY as string) + "]")
    objectName = totalObj[i].name
    rci.addHandler btnName #pressed codeStr: ("fn_action " +"@" + objectName + "@") filter:on
    btnPosX = btnPosX + 50
)
createDialog (rci.end())
cs

 

 

그리고 그 결과가 위 이미지 입니다.

 

박스의 수가 늘어났을 때를 대비해서 3번째 버튼 이후엔 다음 줄에 표에 표시되도록 수정이 하고 싶습니다.

두 가지 방법을 생각할 수 있는데 하나는 새로 만들어질 버튼 UI의 X축 위치가 특정값을 넘어가면 X축 값을 초기화하고 Y축을 증가하는 방법이 있고,

다른 하나는 새로 만들어질 버튼 UI의 순번이 3을 넘었을 때 새로 만들어질 버튼의 X축 값을 초기화하고 Y축을 증가하는 방법이 있습니다.

처음 방법은 버튼 UI의 크기가 정해지지 않아 캡션 길이에 따라 변경될 경우 유용할 것 같고 두 번째 방법은 버튼 UI의 크기가 정해져 있을 때 쓰면 편할 것 같습니다.

편한 길이 있다면 돌아갈 필요는 없으니 두 번째 방법을 쓰겠습니다.

 

우선 버튼 UI를 카운트할 수 있는 변수가 필요하겠네요.

변수를 생성하고 카운트도 할 수 있게 수정하겠습니다.

 

1
2
3
4
btnCount = 0
for i = 1 to totalObj.count do
(
    btnCount = btnCount + 1
cs

 

이전 시간에 배운 내용의 13번 라인인 for문의 시작 부분 위아래 위와 같이 적어 넣습니다.

이렇게 한다면 for 문이 돌 때마다 변수 'btnCount'는 계속 '1'씩 증가합니다.

그리고 변수 'btnCount'가 '3'을 넘으면 다시 '1'로 변경하고,

버튼 UI의X축으 값을 초기화하고 Y축의 값은 버튼의 높이보다 약간 더 크게(그래야 새로 생기는 버튼의 높잇값 위치가 이전 위치와 알맞게 떨어집니다.)  증가시킵니다.

말이 좀 길지만 다음의 결과 값을 보며 설명하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i = 1 to totalObj.count do
(
    btnCount = btnCount + 1
    if(btnCount > 3) do 
    (
        btnCount = 1
        btnPosX = 5
        btnPosY = btnPosY + 25
    )
    btnName = execute("#boxButton_btn" + (i as string))
    boxName = totalObj[i].name        
    rci.addControl #button btnName boxName paramStr:("width:45 height:20 pos:[" + (btnPosX as string) + "," + (btnPosY as string) + "]")
    objectName = totalObj[i].name
    rci.addHandler btnName #pressed codeStr: ("fn_action " +"@" + objectName + "@") filter:on
    btnPosX = btnPosX + 50
)
cs

 

호오~~ 생각대로입니다.

 

새로 추가된 부분은 굵은 글씨 부분으로 해석해 보겠습니다.

4번 라인은 버튼 UI를 만들 때마다 1씩 값이 증가되는데 이 값이 3을 넘을 경우(즉 4가 되면) 아래의 내용을 실행하라입니다.

4라고 생각하고 다음 라인을 보겠습니다.

6번 라인은 우선 버튼 UI 카운트를 1로 초기화합니다.(다음 줄의 1번째라고 인식해도 무방하겠네요.)

7번 라인은 생성될 버튼 UI의 X축 값을 5로 초기화했습니다.

8번 라인은 생성될 버튼 UI의 X축 값이 초기화되면 'Box001'버튼과 겹치기 때문에 Y축의 값을 버튼 UI의 높이보다 '5'값 크게 떨어 뜨리도록 했습니다.(보기 좋으니까요.)

결과는 만족스럽습니다.

 

박스가 10개가 되어도 잘 작동합니다.

 

완전 무한정 만들어지지는 않겠지만(메모리 문제로) 어느 정도는 여유롭습니다.

 

지금은 버튼 UI를 클릭해도 'format "% 오브젝트와 연결되어 있습니다.\n" objNm'으로 간단한 결과가 나오지만 해당 오브젝트를 선택한다던가 숨기거나 프리즈 하는 등등의 복잡한 씬 구성에서 요긴하게 써먹을 수 있는 스크립트로 응용할 수 있습니다.

 

물론 맥스에는

 

 

이런 좋은 기능이 있지만 특별히 자기가 쓰기 편한 형태로 만들 수 있기 때문에 스크립트를 배우는 거겠지요.

 

오늘은 여기서 동적 UI에 대한 설명을 마치겠습니다.

수고하셨습니다.

728x90
반응형