맥스스크립트 심화

actionMan을 이용한 대화상자(3)

스크립팅하는애님 2021. 4. 16. 19:43
728x90
반응형

안녕하세요.

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

오늘은 지난번에 작업했던 'ActionMan'을 마무리 짓도록 하겠습니다.

 

오늘의 내용은 좌우, 상하, 회전, 잠금 버튼을 실제 맥스에서 사용하는 것과 비슷한 형태로 수정하도록 하겠습니다.

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
rollout actionMan_Rollout "ActionMan"
(
    checkbutton fig_chb "피규어"
    checkbutton comHori_chb "좌우"
    checkbutton comVert_chb "상하"
    checkbutton conRot_chb "회전"
    checkbutton conLock_chb "잠금"
    checkbutton tra_chb "점선"
    button addKey_btn "키"
    
    on fig_chb changed state do
    (        
        if(((actionMan.getActionTable 79).getActionItem 1).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40144"
        )
    )
    
    on comHori_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 21).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40019"
        )
    )
    
    on comVert_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 23).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40020"
        )
    )
    
    on conRot_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 22).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40021"
        )
    )
    
    on conLock_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 26).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40185"
        )
    )
    
    on tra_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 20).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40160"
        )
    )
    
    on addKey_btn pressed do
    (        
            actionMan.executeAction 972555510 "40015"
    )
)
createdialog actionMan_Rollout 
cs

 

 

위 내용이 이전 시간까지 작업했던 스크립트와 그 결과 입니다.

 

UI 간에 영향을 주는 방법을 생각해 보겠습니다.

우선은 '잠금'은 빼고 '좌우', '상하', '회전' 버튼 중 하나가 눌리면 다른 하나는 강제로 해제가 돼야 할 것 같습니다.

 

위 내용을 다음과 같이 수정하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
on comHori_chb changed state do
(
    if(state == true) do
    (
        comVert_chb.checked = false
        conRot_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 21).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40019"
    )
)
cs

 

이전 스크립트의 20번 라인 다음에 지금의 3~6번 라인이 추가됩니다.

해당 내용을 보면 '좌우' 버튼이 눌렸을 때 '상하', '회전' 버튼의 체크 상태를 비활성화로 강제로 변경한다는 내용입니다.

잘 작동하는지 확인해 볼까요?

 

좋네요!

 

잘 작동하는 것을 봤으니 나머지 '상하'와 '회전' 버튼도 같은 기능을 추가해 주겠습니다.

 

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
on comVert_chb changed state do
(
    if(state == true) do
    (
        comHori_chb.checked = false
        conRot_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 23).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40020"
    )
)
    
on conRot_chb changed state do
(
    if(state == true) do
    (
        comHori_chb.checked = false
        comVert_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 22).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40021"
    )
)
cs

 

 

나머지 버튼들도 잘 작동하고 있습니다.

 

이제 잠금 버튼에 대한 것도 신경 써 볼까요?

잠금 버튼의 기능은 지금과 반대로 '좌우', '상하', '회전' 버튼이 동시에 눌리도록 하는 역할을 합니다.

방금 작업했던 if문에 약간의 수정을 하도록 하겠습니다.

 

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
31
32
33
34
35
36
37
38
on comHori_chb changed state do
(
    if((state == true)and(conLock_chb.checked != true)) do
    (
        comVert_chb.checked = false
        conRot_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 21).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40019"
    )
)
 
on comVert_chb changed state do
(
    if((state == true)and(conLock_chb.checked != true)) do
    (
        comHori_chb.checked = false
        conRot_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 23).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40020"
    )
)
 
on conRot_chb changed state do
(
    if((state == true)and(conLock_chb.checked != true)) do
    (
        comHori_chb.checked = false
        comVert_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 22).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40021"
    )
)
cs

 

조건식에 작동을 하기 위해서는 ''잠금' 버튼이 눌리지 않았을 때'라는 조건이 하나 더 붙습니다.

 

 

생각한 대로 작동하네요.

그런데 이렇게 하면 되는 걸까요?

실제 맥스의 버튼과 비교해 보겠습니다.

 

 

위 이미지를 보면 잘 작동하다가 '좌우', '상하', '회전', '잠금'이 다 눌린 상태에서 '잠금'을 끄면 맥스와는 다른 결과를 나타냅니다.(맥스에서는 '좌우', '상하'만 켜졌지만 스크립트에서는 '좌우', '상하', '회전'이 다 켜져 있습니다.)

이 부분을 수정해 줘야겠네요.

'회전' 버튼에서 자신이 꺼지면 회전도 끄도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
on conLock_chb changed state do
(
    if(state == false) do
    (
        conRot_chb.checked = false
    )
    if(((actionMan.getActionTable 79).getActionItem 26).isChecked != state) do
    (
        actionMan.executeAction 972555510 "40185"
    )
)
cs

 

잘 작동하나 볼까요?

 

원하는 대로 됐습니다.

그런데 정말 맥스랑 동일하게 작동하나 또 확인해 봐야겠습니다.

 

 

자 이번에는 '잠금'버튼이 꺼진 상태에서 정상 작동하는 것을 보고 '상하'버튼을 눌렀습니다.

그랬더니 결과가 맥스와는 다르게 나옵니다.

'좌우', '상하' 버튼이 동시에 켜진 상태에서 둘 중 하나를 선택하면 토글이 되어 꺼지는 것이 아니라 선택되지 못한 버튼이 꺼져 버렸습니다. (크으~~~ 왜 이렇게 예외 상황이 생기는지....)

이 문제는 체크 박스가 정상적으로 토글 기능이 적용되기 전에 '좌우', '상하' 버튼이 동시에 눌렸으면 어느 하나를 클릭했을때 토글기능이 작동하지 않고 선택이 되도록 하는 것이기 때문에 정상 작동하는 명령 이전에 if문으로 분기를 만들어야 합니다.

뭔 소리인지는 아래 스크립트를 보면 됩니다. ㅎㅎ

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
on comHori_chb changed state do
(
    if((state == false)and(comVert_chb.checked == true)and(conLock_chb.checked == false))then
    (
        comHori_chb.checked = true
        comVert_chb.checked = false
        actionMan.executeAction 972555510 "40019"
    )
    else
    (
        if((state == true)and(conLock_chb.checked != true)) do
        (
            comVert_chb.checked = false
            conRot_chb.checked = false
        )
        if(((actionMan.getActionTable 79).getActionItem 21).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40019"
        )
    )
)
 
on comVert_chb changed state do
(
    if((state == false)and(comHori_chb.checked == true)and(conLock_chb.checked == false))then
    (
        comVert_chb.checked = true
        comHori_chb.checked = false
        actionMan.executeAction 972555510 "40020"
    )
    else
    (
        if((state == true)and(conLock_chb.checked != true)) do
        (
            comHori_chb.checked = false
            conRot_chb.checked = false
        )
        if(((actionMan.getActionTable 79).getActionItem 23).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40020"
        )
    )
)
cs

 

기존의 내용을 if문으로 감싸서 분기를 만들었습니다.

'좌우', '상하' 버튼이 동시에 눌린 상태에서 '좌우' 버튼을 누른다고 가정했을 때

수정된 스크립트의 3번 라인의 if문을 보면 '좌우' 버튼이 'true'인 상태에서 한 번 더 클릭했기 때문에 이벤트 핸들러에서는  상태가 'false'가 됩니다.

그래서 'state == false'이면서 '좌우' 버튼의 상태가 'true'이며, '잠금' 버튼은 'false'여야 합니다.(잠금이 켜져 있으면 정상적으로 토글이 되어야 합니다.)

if문의 조건이 맞다면

'좌우' 버튼이 토글 되어 'false'가 되었지만, 다시 강제로 'true'가 되어야 하고, (5번 라인)

'상하' 버튼은 'false'가 되며, (6번 라인)

맥스 상에서 '좌우' 버튼이 선택된 상태가 되어야 합니다. (7번 라인)

이후 '상하' 버튼에서도 동일한 작동을 해야 합니다.

 

이제 실행을 하면 정상 작동하는 것을 볼 수 있습니다.

 

 

예외 사항 때문에 길어졌지만 잘 작동해서 좋습니다.

여기에 다늘 노드를 선택했을 때 클릭된 버튼이 해제되어야 하는데 이 부분은 'ActionMan'의 영역이 아니라 'Callback'의 오브젝트 선택과 관련된 부분이라 생략하겠습니다.

 

마지막으로 지금까지 작업한 스크립트를 약간 정리하면 다음과 같이 할 수 있습니다.

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
try(destroydialog actionMan_Rollout) catch()
 
rollout actionMan_Rollout "ActionMan"
(
    checkbutton fig_chb "피규어" pos:[5, 5]
    checkbutton tra_chb "점선" pos:[95, 5]
    button addKey_btn "키" pos:[135, 5]
    checkbutton comHori_chb "좌우" pos:[5, 35]
    checkbutton comVert_chb "상하" pos:[45, 35]
    checkbutton conRot_chb "회전" pos:[85, 35]
    checkbutton conLock_chb "잠금" pos:[125, 35]
    
    
    on fig_chb changed state do
    (        
        if(((actionMan.getActionTable 79).getActionItem 1).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40144"
        )
    )
    
    on comHori_chb changed state do
    (
        if((state == false)and(comVert_chb.checked == true)and(conLock_chb.checked == false))then
        (
            comHori_chb.checked = true
            comVert_chb.checked = false
            actionMan.executeAction 972555510 "40019"
        )
        else
        (
            if((state == true)and(conLock_chb.checked != true)) do
            (
                comVert_chb.checked = false
                conRot_chb.checked = false
            )
            if(((actionMan.getActionTable 79).getActionItem 21).isChecked != state) do
            (
                actionMan.executeAction 972555510 "40019"
            )
        )
    )
    
    on comVert_chb changed state do
    (
        if((state == false)and(comHori_chb.checked == true)and(conLock_chb.checked == false))then
        (
            comVert_chb.checked = true
            comHori_chb.checked = false
            actionMan.executeAction 972555510 "40020"
        )
        else
        (
            if((state == true)and(conLock_chb.checked != true)) do
            (
                comHori_chb.checked = false
                conRot_chb.checked = false
            )
            if(((actionMan.getActionTable 79).getActionItem 23).isChecked != state) do
            (
                actionMan.executeAction 972555510 "40020"
            )
        )
    )
    
    on conRot_chb changed state do
    (
        if((state == true)and(conLock_chb.checked != true)) do
        (
            comHori_chb.checked = false
            comVert_chb.checked = false
        )
        if(((actionMan.getActionTable 79).getActionItem 22).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40021"
        )
    )
    
    on conLock_chb changed state do
    (
        if(state == false) do
        (
            conRot_chb.checked = false
        )
        if(((actionMan.getActionTable 79).getActionItem 26).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40185"
        )
    )
    
    on tra_chb changed state do
    (
        if(((actionMan.getActionTable 79).getActionItem 20).isChecked != state) do
        (
            actionMan.executeAction 972555510 "40160"
        )
    )
    
    on addKey_btn pressed do
    (        
            actionMan.executeAction 972555510 "40015"
    )
)
createdialog actionMan_Rollout 170 60
cs

 

 

조금 길어졌네요.

수고하셨습니다.

728x90
반응형