2009년 06월 18일
[워3 에디터 강좌] 논리값 변수의 이해

지난 강좌에서는 정수형(integer) 변수를 활용하는 방법에 대해서 알아보았었다. 이번에는 그에 이어서 논리값을 변수로 선언해서 활용하는 방법을 살펴보도록 하자.
논리값이란 프로그래밍에서 말하는 부울(boolean) 타입의 변수를 의미한다. 이것은 참(true) 또는 거짓(false)의 두 가지 정보만을 저장할 수 있는 변수 타입이다.
▶예제맵 다운로드: TriggerEX_09.w3x
워3 에디터에서 예제맵을 열어보면 플레이어의 영웅 유닛 아서스가 있고 그 앞에 돌 문이 닫혀져 있다. 그리고 문 안쪽과 문 너머에 레버(지렛대)가 하나씩 있을 것이다. 그러면 트리거를 통해서 플레이어가 레버를 당겨서 문을 열고 닫을 수 있게 설정해보도록 하자. 일단 아래와 같이 이벤트/조건/액션을 짜본다. 이 트리거는 레버가 작동할 때 벌어질 일들에 대해서 설정하는 것이므로 트리거 이름은 Lever Activated로 해두자. 단, 워크래프트3에서는 장치가 따로 작동하는 기능이 없기 때문에 실제로는 레버가 있어도 밀거나 당기는 개념이 아니라 공격해서 파괴시키면 레버를 작동한 것으로 판정한다. 그래서 이벤트에서는 '장치 파괴'를 써야 한다. 구르는 돌 문을 열고 닫는 것도 마찬가지로 파괴시키면 문이 열린다.
- 이벤트
장치 - 지렛대 0001 <생성>이 장치가 파괴되면 작동합니다
▷ 이벤트 종류 - 장치 항목에서 '장치가 파괴되면 작동' 선택
▷ 장치 클릭 후 [나무/파괴 가능 물체 선택] 버튼을 누른 다음, 맵 상에서 문 앞의 지렛대 클릭 - 조건
없음 - 액션
장치 - 구르는 돌 문 (수평4) 0000 <생성>을 파괴합니다
▷ 액션 종류 - 장치 항목에서 '장치 파괴' 선택
▷ (마지막으로 생성된 장치) 클릭 후 [나무/파괴 가능 물체 선택] 버튼을 누른 다음, 맵 상에서 '구르는 돌 문' 클릭
게임시간으로 대기 액션은 액션 카테고리에서 일반 항목에 있으며 사운드 삽입은 사운드 카테고리에서 사운드 재생에 보면 나온다. 삽입할 사운드는 예제맵 상에 미리 넣어두었으니까 단축키 F5를 눌러서 사운드 에디터를 열고 미리 들어보면 된다. 트리거에 사운드를 삽입하는 방법을 잊었다면 강좌 4편을 참고하라. http://sstorm.egloos.com/4944934
자, 여기까지는 별로 어렵지 않다. 에디터 강좌를 1편부터 쭉 보고 따라해봤다면 충분히 이해할 수 있는 수준이다. 하지만 문제는 지금부터다. 레버를 당겼을 때(파괴 했을때) 문이 닫혀있는 경우에는 열게 하고, 열려 있는 경우에는 닫히게 하려면 어떻게 설정해야 할까?
구르는 돌 문이 열려 있냐 닫혀 있냐 상태의 구분을 위해서 논리값으로 변수를 선언해야 한다. 여기서는 문이 닫혀있는 경우를 FALSE, 열려 있는 경우를 TRUE로 설정하도록 한다.
변수를 만들기 위해서는 트리거 에디터 상에서 Ctrl + B를 눌러서 변수 편집창을 연 다음 새로운 변수 만들기(Ctrl + N)에서 변수 이름을 짓고 변수 종류를 골라야 한다. 여기서는 변수 이름을 GateOpened로 하고 변수 종류는 논리값 (boolean)으로 설정한다. 그런데 초기값은 무엇으로 해야 할까? 처음에 문이 닫혀 있는 상태이므로 초기값은 FALSE로 해야 맞다. 반대로 만약 처음에 문이 열려 있는 상태로 시작한다면 초기값이 TRUE여야 한다.

그러면 위에서 만든 Lever Activated 트리거에서 새로운 액션 만들기(Ctrl + R)를 한 다음, 일반 항목에서 If / Then / Else (다중 함수)를 하나 만든다.

이제 여기에서 If - 조건에 들어갈 조건을 설정해야 한다. 조건은 무엇일까? 레버를 작동시키면(파괴하면) 문이 열려 있는지 닫혀있는지를 체크해서 문이 열려 있는 상태면 닫아야 하고, 닫혀 있으면 열어야 하므로, 좀전에 설정했던 논리값 변수 GateOpened 가 TRUE인지 FALSE인지를 따져봐야 한다. 그래서 이 값이 TRUE 이면 문이 열려 있다는 얘기므로 닫아줘야 하고, FALSE이면 문이 닫혀 있다는 얘기므로 열어주면 된다.
If - 조건 항목을 클릭한 상태에서 새로운 조건 만들기(Ctrl + D)를 하면 기본값인 논리값 비교 항목이 선택되어 있을 것이다. 그러면 여기서 ((트리거를 작동시킨 유닛)(은)는 건물임) 을 클릭한 다음 변수 항목에 있는 GateOpened 를 선택하자. 그러면 조건 텍스트가 GateOpened == (서로 같다) TRUE 로 바뀔 것이다.

그러면, 이 트리거는 레버가 작동할 때(파괴될 때) GateOpened라는 변수의 값을 체크해서 그 값이 TRUE면 Then에 있는 액션을, FALSE면 Else에 있는 액션을 실행하게 된다. 즉 이 트리거의 경우 GateOpened의 값이 TRUE면 문이 열려있다는 얘기므로 Then 항목에서는 문을 닫는 액션이 들어가야 한다. 반면에 Else는 GateOpened의 값이 FALSE, 즉 문이 닫혀있는 상태에 해당하므로, 문을 여는 액션들이 들어가야 한다. 문을 여는 액션은 이미 만들어놓았으므로 아래 그림과 같이 그 액션들을 Else 항목에 옮겨놓는다.



따라서 새로운 액션 만들기(Ctrl + R)를 해서 일반 카테고리에 있는 전역변수 설정에 간 다음 변수 GateOpened를 바꿔서 선언해줘야 한다. 즉 Then - 액션에서는 문을 닫는 것이므로 GateOpened의 값을 FALSE로 선언해야 하고, Else - 액션에서는 GateOpened를 TRUE로 선언해야 한다.

여기까지 트리거를 설정한 다음 테스트 플레이를 해보자. 그러면 레버를 작동시킬 때 구르는 돌문이 열릴 것이다. 그런데 문제가 있다. 레버를 한 번 작동하면 더 이상 작동시킬 수 없기 때문이다. 앞서도 언급했듯이 워크래프트3에서는 장치를 파괴하면 작동시키는 것으로 간주하기 때문에 따로 장치를 부활시키지 않으면 단 한 번만 작동하고 만다. 그러므로 이 트리거의 경우 레버를 부활시키는 액션을 따로 넣어줘야만 한다.
이 액션은 장치 카테고리에서 장치 부활을 선택한 다음 (마지막으로 생성된 장치)(을)를 ((마지막으로 생성된 장치)의 최대 체력)의 체력으로 부활시킵니다 에서 (마지막으로 생성된 장치)를 클릭한 다음 함수(F): 항목에서 이벤트 응답 - 죽은 장치로 설정하고, ((마지막으로 생성된 장치)의 최대 체력)을 클릭한 다음 함수(F): 장치 - 장치의 최대 체력 아래에 있는 (마지막으로 생성된 장치)의 최대 체력을 클릭한 다음, 새로 뜬 창에서 함수(F): 이벤트 응답 - 죽은 장치로 설정한다. 여기서 말하는 이벤트 응답 - 죽은 장치란 장치 죽음(파괴)을 이벤트로 하는 트리거에서 죽은(파괴된) 장치를 지정하는 것을 뜻한다. 그러므로 이 트리거에서 이벤트 응답 - 죽은 장치란, 작동된(파괴된) 레버를 지칭하는 셈이다. 그리고 장치 부활 액션 위에 약간의 대기 시간을 주는 것이 좀 더 그럴듯해 보이므로 참고하라.

자 그러면 이제 마지막 한 가지만 남았다. 돌 문 너머에 있는 레버를 작동시킬 때에도 문 앞의 레버와 똑같은 기능을 하도록 만들어야 한다. 가장 무식한(?) 방법은 트리거를 통째로 복사해서 이벤트만 바꿔주는 것이다. 하지만 굳이 그렇게 할 필요가 없다. 지금 이 트리거에서 이벤트를 하나 더 추가한 다음, 돌 문 너머에 있는 레버로 바꿔주면 그만이다. 왜냐하면 트리거에서 이벤트가 여러 개인 경우, 그 중 하나의 이벤트만 발생해도 트리거가 작동하기 때문이다. 하지만 조건이 여러 개인 경우에는 모든 조건에 다 맞아야 만 액션이 실행되므로 주의해야 한다.

지금까지 설명한대로 트리거를 잘 설정했다면, 어떤 레버를 작동시키든 돌 문이 정상적으로 열고 닫힐 것이다. 만약 잘 안 된다면 완성된 예제맵을 보고 참고하도록 하라.
▶완성된 예제맵 다운로드: TriggerEX_09_done.w3x
# by | 2009/06/18 17:18 | ▶ War3 Editor 강좌 | 트랙백 | 덧글(3)
◀ 이전 페이지 다음 페이지 ▶





