하나의 변수를 여러 구간으로 나눠 변수를 절약해보자

※예제맵 다운로드
1. noname23-1
2. noname23-2




안녕하세요? noname01입니다.
이번에는 변수를 절약하는 방법을 알아 봅시다. 물론 간단한 구조의 트리거를
사용하는 맵에서는 일부러 변수를 절약할 필요가 없지만, 어느정도 복잡한
트리거를 사용하는 맵을 만들 때는 변수가 부족해지는 상황이 발생할 수 있기
때문에 변수를 절약하는 것이 필요합니다. 변수를 절약하는 방법은 여러가지가
있겠지만 여기서는 그러한 방법 중에 변수의 구간을 나눠서 각 구간을 서로다른
용도로 사용하는 방법을 알아 봅시다. 변수의 구간을 나눈다는 기본원리는
동일하지만 응용하기에 따라 조금씩 달라질 수 있는데 여기서는 두가지 응용법을
소개해 드립니다.




1. 첫번째 응용법은 단순히 하나의 변수를 여러 구간으로 나누어 각 구간마다
동시에 일어날 가능성이 없는 서로다른 의미를 부여하여 사용하는 것입니다.
예를 들어 0~9까지의 수 중 하나를 랜덤(임의)으로 선택한 후 약 3초만큼
기다린 후 랜덤으로 선택한 수 만큼의 마린을 생성하는 트리거를 만든다고
가정 해 봅시다. (이 경우를 만들어본 예제맵은 noname23-1 입니다.)
먼저 선택하는 과정을 제어하는 제어변수 1개(Mineral Field (Type 1)의 셋데스)와
임의로 선택한 수를 저장하는 변수 1개(Mineral Field (Type 2)의 셋데스),
그리고 타이머로 사용될 변수 1개(Mineral Field (Type 3)의 셋데스)
까지 총 3개의 변수가 필요합니다. (괄호안은 예제맵의 경우)
이 변수들로 트리거를 만들면 아래와 같이 될 것입니다.

23-1

여기서 변수를 절약하기 위해 제어변수와 타이머에 사용된 변수를 하나로
합쳐버립시다. 즉 타이머에 사용된 변수를 없애고 제어변수에 타이머의 기능을
추가해 봅시다. 우선 제어변수를 3구간으로 나눕니다. 첫번째 구간의 역할은
0~9의 수 중 하나의 수를 임의로 골라 임의로 선택한 수를 저장하는 변수에다
대입하는 것입니다. 그리고 두번째 구간의 역할은 타이머 입니다. 말그대로
일정한 시간(여기서는 약 3초)을 기다리는 동작을 합니다. 마지막 세번째 구간의
역할은 임의의 수를 저장하고 있는 변수의 값만큼 마린을 생성(Create)
하는 것입니다. 제어변수를 3구간으로 나누었다면 이번엔 구체적으로 각 구간의
범위를 지정해 줍니다. 예제맵의 경우
첫번째 구간은 0 ~ 6,
두번째 구간은 7 ~ 43,
세번째 구간은 44 ~ (+∞)    ←사실은 무한대까지는 아니고
                  unsigned int 의 최대값인
                  2^32-1(=4294967295)
                  까지 저장할 수 있습니다.(중요X)
이렇게 정하면 되지만 만일 나중에 임의로 선택하는 수의 범위가 늘어나거나
대기 시간이 3초보다 길게 수정될 때와 같은 상황을 대비해 충분히 큰 간격을
두고 구간을 나눕니다. (물론 차후에 변경되지 않는다는 확신이 있으면 여분을
두지 않고 만들어도 상관없습니다.)여기서는 아주 넉넉하게(?!)
첫번째 구간은 0 ~ 999,
두번째 구간은 1000 ~ 1999,
세번째 구간은 2000 ~ (+∞)    ←여기도 마찬가지로 unsigned int 의
                  최댓값까지 저장 가능합니다.(중요X)
이렇게 구간을 정하고 만들어 보겠습니다.

우선 첫번째 구간은 변수를 절약하는 방법을 쓰기 전 3개의 변수로 만들었을 때와
거의 차이가 없습니다. 두가지 차이점은 임의로 숫자선택을 완료한 뒤 제어변수의
값을 7이 아닌 1000으로 바꾸고 타이머 변수값을 변경하지 않는다는 점입니다.

23-2

두번째 구간은 타이머입니다. 따라서 제어변수의 값이 1000 ~ 1999일 때는
무조건 제어 변수에다가 1을 더합니다. 여기서 우리는 약 3초의 시간만
기다리기를 원하므로 제어변수의 값이 1036(이 값은 오차를 포함하고 있을 수
있습니다.)이 되면 제어변수의 값을 바로 2000으로 만들어 세번째 구간에
들어가게 합니다.

23-3

마지막인 세번째 구간에서 역시 첫번째 구간처럼 절약하기 전과 크게 다른건
없고 절약하기 전과 비교해 제어변수값들이 모두 큰 값으로 되어 있고, 타이머
변수를 사용하지 않은점만 다르다는 것을 알 수 있습니다.

23-4

예제맵을 실행시켜 보면 비컨이 두개 있고 테란 시민이 하나 있는데 왼쪽 비컨에
들어가면 변수 3개를 이용한 경우의 트리거가 동작하고 오른쪽 비컨에 들어가면
변수 2개를 이용한 경우의 트리거가 동작을 하는데 각각 실행하여 결과를 비교해
보면 차이가 없다는 것을 알 수 있습니다. 게다가 더 보완하면 랜덤으로 정해지는
값을 저장하는 변수(여기서는 Mineral Field (Type 2)의 셋데스)까지 제어변수 하나에
합쳐버릴 수 있습니다.




2. 두번째 응용법은 변수의 각 자릿수를 기준으로 구간을 나눠 각 구간에
서로다른 의미를 부여하는 것입니다. 사실 첫번째 응용법도 각 자릿수를
기준으로 구간을 나누긴 하였지만 첫번째 응용과 같은 경우에는 자릿수에
상관없이 마음대로 구간을 나눠도 됩니다. 즉 아래와 같이 나눠도 무방합니다.


첫번째 범위를 0 ~ 33,
두번째 범위를 34 ~ 100,
세번째 범위를 101 ~ 120

(구간을 나누는 기준을 마음대로 정해도 되지만 사실 숫자의 자릿수를 기준으로
구간을 나누는것이 보기에도 좋고 생각하기도 편하므로 가능하면 숫자의 자릿수를
기준으로 구간을 나누는 것이 좋습니다.)


왜그런가 하면 첫번째 응용에서 각 구간이 가진 의미들 끼리는 서로 호환될
필요가 없기 때문입니다. 하지만 지금부터 알아볼 두번째 응용법은
각 구간의 의미가 호환성을 가져야 하는 경우이기 때문에 아무렇게나 여분을
만들거나 제거할 수는 없습니다. 말로만 들으면 어려우니 예제맵(noname23-2)
을 자세히 뜯어 봅시다.(예제맵에는 테란 마린의 셋데스만 사용되었습니다.)

예제맵에서는 디스플레이 텍스트 메시지가 4페이지로 나뉘어 있고 화면에 보여줄
페이지의 번호를 저장하는 변수의 값에 따라 4개의 페이지 중 하나가 화면에
출력됩니다. 여기서 페이지의 수에 따라 기수법을 정해쓰면 되는데 사람에게는
십진수가 가장 익숙한 기수법이기 때문에 십진수를 사용하여 설명하겠습니다.

먼저 구간을 나눠 봅시다. 페이지의 종류는 총 4개인데 10진법을 이용할 것이므로
1의 자리를 페이지의 종류를 저장하는 용도로 사용하겠습니다. 그러면 사용하지
않은 페이지 6개가 남는데 이것은 차후에 페이지를 늘릴 필요가 있을 때
사용하면 됩니다. 만일 페이지가 10개보다 많다면 1의자리뿐만 아니라 10의
자리까지를 페이지로 삼으면 최대 100개의 페이지를 만들 수 있게 됩니다.

덧붙이자면 가능한한 각 구간의 크기는 일정하게 정하는 것이 좋습니다. 관리
하기도 편하고 서로 호환성도 높아지기 때문인데 예제맵을 기준으로 예를 들면
1의 자리와 10의 자리, 즉 두자릿수를 페이지의 번호로 사용한다면 다른 모든
구간의 크기도 인접한 두자릿수(10^2n의 자리와 10^(2n+1)의 자리 ←이런
식으로 말이죠.)로 정해주는 것이 좋습니다. 그러한 이유는 잘 생각해 보시면
알 수 있으실 겁니다.

페이지의 갯수를 정했다면 이번엔 각 페이지의 상태를 정해 봅시다. 여기서는
간단하게 "페이지를 화면에 보여줌(=1)" 상태와
"(페이지를 화면에 보여줌=0)" 상태의 두가지 상태를 갖도록 합니다.
페이지의 종류가 4개이고 상태는 2가지이므로 두 구간 모두를 하나의 자리만
차지하게 합니다. 10의 자릿수를 기준으로 페이지를 보여줌과 보여주지 않음으로
나누는 것이죠. 나머지 사용하지 않는 자릿수는 그냥 그대로 둡니다.

23-5

자 이제 직접 페이지(디스플레이 텍스트 메시지)를 출력하는 트리거를 만들면
됩니다. 텍스트를 보여주는 상태일때 즉 10의자리가 1일때 페이지를 출력하면
되므로
10일때는 1페이지 출력
11일때는 2페이지 출력
12일때는 3페이지 출력
13일때는 4페이지 출력
이렇게 만들어 주면 되겠죠?

23-6

그리고 출력하고 싶지 않다면 10의자리를 0으로 만들면 되겠죠?
이 때 그냥 단순히 변수를 0으로 만들어 버린다면? 아마도 페이지를 출력하지
않도록 설정했다가 다시 출력하도록 할 때마다 처음 뜨는 페이지는 항상
고정되어야 될 것입니다. 그런데 출력하지 않도록 10의자리를 0으로 만들때
10을 빼낸다면? 이럴 경우 1의자리에 있는 수는 건드리지 않고 10의자리만을
0으로 만들었으므로 아까 띄워져 있던 페이지의 번호가 그대로 살아있게 됩니다.
다시 페이지를 출력할때는 반대로 10을 더하면 페이지 출력을 끄기 전에 보고
있던 페이지가 그대로 다시 뜹니다. 구간을 일정하게 정한 이유는 바로 화면이
꺼져있든 켜져있던 보고있던 페이지에 관한 정보를 그대로 보존하기 위해서 입니다.
그리고 이러한 트리거를 만드는데 사용된 변수는 딱 하나이며 예제맵에는
테란 마린의 셋데스를 사용했습니다.

23-7

예제맵(noname23-2)을 실행시키면 테란 시민이 있고 테란 시민의 좌, 우, 아래에
비컨이 있습니다. 여기서 오른쪽 비컨은 다음페이지, 왼쪽 비컨은 이전페이지,
아래쪽 비컨은 페이지 표시 on/off 의 기능을 가지고 있습니다.




이 두가지 응용법 이외에도 수많은 응용법이 존재하므로 필요한 상황에
맞게 응용하여 사용하시면 됩니다. 또 꼭 할 필요는 없지만 각 변수의 구간과
그 구간이 맡은 일을 간단하게 메모해두는 것을 추천합니다. 메모가 없으면
나중에 자신이 만든것이라도 해석하기가 힘들 수 있기 때문이죠.
(이런말하는 본인도 사실 메모를 잘 안해둡니다. 고쳐야되는데 습관이란게 참...)
아무튼 이것으로 끝내도록 하겠습니다. 그럼 저는 이만 물러갑니다.




다른 맵 제작 팁을 보려면 이 이미지를 클릭해 주세요.