맥스스크립트 심화

RolloutCreator Functions(5)

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

안녕하세요.

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

오늘은 이전에 만든 버튼을 조금 더 꾸며 보겠습니다.

 

이전 시간까지 작업된 스크립트는 다음과 같습니다.

 

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

 

 

지금은 위 이미지로 실행될 것입니다.

어떤 버튼이 어느 박스와 연결이 되어 있는지 한눈에 볼 수가 없네요.

우선 버튼 UI의 표시명(캡션)을 "박스"가 아닌 박스 오브젝트의 이름으로 바꿔 보겠습니다.

14번 라인의 "박스"대신 상황에 따라(어떤 박스 오브젝트 차례인가) 바뀐 값이 들어오면 되겠네요.

그러기 위해서는 박스 오브젝트의 이름을 저장하는 변수가 필요하겠습니다.

 

14번 라인과 위에 한 줄을 더 추가하여 다음과 같이 바꿔 보겠습니다.

 

1
2
boxName = totalObj[i].name
rci.addControl #button btnName boxName
cs

 

1번 라인은 읽어 들인 박스의 이름을 변수 boxName에 저장합니다.

2번 라인은 버튼 UI를 생성하면서 boxName를 버튼의 표시명(캡션)으로 사용합니다.

 

직관적으로 바뀌었네요.

 

이번에는 버튼 UI의 크기와 위치를 바꿔서 1열로 정렬하겠습니다.

우리는 동적 UI를 작업하기 때문에 버튼은 무한정 생성될 수 있습니다. (진짜 무한정할 수는 없겠지만 말이 그렇다고요.)

그렇기 때문에 'pos:[45, 5]'와 같이 위치를 직접 입력할 수 없습니다.

기준이 되는 값을 변수에 저장한 후 for문으로 돌 때마다 값을 일정하게 늘이겠습니다.

먼저 버튼 UI크기를 정하겠습니다.

이름 수정 후 15번 라인을 다음과 같이 수정해 줍니다.

 

1
rci.addControl #button btnName boxName paramStr:"width:45 height:20"
cs

 

'paramStr'이 추가됩니다.

여기서 유의점은 이전의 정적 UI에서 사용됐던 옵션 값들이 문자열로 사용된다는 것입니다.

 

이제 위치를 수정하겠습니다.

위치 X값을 저장하는 변수와 Y값을 저장하는 변수 두 개가 필요하거나 2개의 값을 가질 수 있는 배열형의 변수가 하나 필요합니다.

조금이라도 더 이해하기 쉬운 두 개의 변수를 택하겠습니다. (ㅎㅎㅎㅎ)

다음과 같이 입력해서 실행해 보겠습니다. (굵은 글씨가 수정 부분입니다.)

 

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

 

11, 12번 라인은 버튼 UI의 위치 값 X, Y를 저장하는 변수입니다.

값을 보니 시작 위치가 X축으로 '5', Y축으로 '5' 만큼 떨어져 있네요.

17번 라인은 'paramStr'에 위치 값에 대한 부분이 추가되어 있습니다.

문자열만 사용할 수 있기 때문에 'as string'를 사용하여 숫자를 문자열로 변경했습니다.

 

 

결과는 1열로 잘 나왔습니다.

그런데 여기서 박스의 수가 5개가 된다면 어떻게 될까요?

해보면 알겠죠? 해보겠습니다.

 

ㅎㅎㅎㅎㅎ

 

네~~ 잘렸습니다.

자동으로 대화창이 늘어난다고 해도 문제는 박스의 수만큼 늘어나서 화면을 넘어가 버릴 수도 있겠습니다.

다음 시간에는 이 부분을 수정하는 방법에 대해서 이야기하겠습니다.

오늘 마무리 지으려고 했는데 욕심이 조금 더 생기네요.

수고하셨습니다.

728x90
반응형

'맥스스크립트 심화' 카테고리의 다른 글

actionMan을 이용한 대화상자(3)  (0) 2021.04.16
actionMan을 이용한 대화상자(2)  (0) 2021.04.15
actionMan을 이용한 대화상자(1)  (0) 2021.04.14
RolloutCreator Functions(6)  (0) 2021.04.12
RolloutCreator Functions(4)  (0) 2021.04.08
RolloutCreator Functions(3)  (0) 2021.04.07
RolloutCreator Functions(2)  (0) 2021.04.06
RolloutCreator Functions(1)  (2) 2021.04.05