Profile
Experience

2018.12.17

GML 차근차근 배워보기. [ 2 ] 변수 (1)

조회 수 11 추천 수 0
애드블럭을 꺼주시면 서버 운영에 도움이 됩니다.
부탁드립니다.

GML 차근차근 배워보기

 

* 게임메이커 8.0을 기준으로 작성된 강좌입니다.

[ 2 ] 변수

 

 

1. 변수의 정의

 

 변수는 용어를 그대로 해석하자면 '변하는 값' 이다. 하지만 프로그램에서 변수가 가리키는 말은 그것보다 훨씬 넓다. 간단하게 이야기하자면 변수는 프로그램이 사용하고자 하는 '데이터', '자료' 라고 할 수 있다. 숫자만 가리키는 말도 아니며, 온갖 종류의 정보들이 모두 변수라는 이름으로 불린다.

 

 간단하게 예를 들자면 플레이어의 체력 값, 몬스터의 숫자, 플레이어의 위치 같은 간단한 데이터부터 시작해서 '플레이어'라는 오브젝트 그 자체에 이르기까지 모두가 다 변수에 속한다. 

 

 이러한 변수의 반대 개념으로는 상수가 있다. 상수는 고정된 값으로 프로그램 실행 중간에 그 값을 바꿀 수 없는 수치들을 이야기한다. 간단히 말해서 3 = 4 라고  써봤자 3이 4가 되는 건 아니다. 3,4라는 숫자들은 고정된 값이며 거기에 다른 값을 대입해서 수정하는 것은 논리적으로 합당하지 않기 때문이다.

 

2. 변수의 사용

 

변수가 무엇인지 알았으니 이제 GML에서 변수를 사용하는 방법에 대해서 배워볼 차례일 것이다.

 

GML에서 변수를 사용하는 방법은 아주 간단하다. 변수의 이름과, 그 변수가 가질 초기값을 지정해주면 된다. 형식은 다음과 같다.

 

(변수의 이름)  = (초기값) ;

 

변수를 처음 사용할 때 초기값을 지정해주어야 하는 이유는 아주 간단하다. 아무리 변수가 실행 도중에 변할 수 있는 가변적인 자료라고 하더라도, 어쨌든 일단 값을 가져야한다. 수학으로 예를 들자면, 다짜고짜 x+5는 몇이냐 이렇게 물어봤자 그 답을 알 수는 없다. x=3일때 x+5는 몇이냐 이렇게 물어야지 답을 알 수 있는 것이다.

 

 그런데 이 변수의 이름을 작성하는 데에는 기본적인 규칙이 있다. 이 규칙을 지키지 않은 이름은 제대로 변수로 인식되지 않으며, 게임의 오동작이나 프로그램의 예기치않은 종료 등의 부작용을 낳을 수 있다.

 

 1. 변수 명에는 영문자와 언더바(_), 숫자만을 사용할 수 있다. 한글을 사용할 수 없으며 중간에 공백이 오는 것도 안 된다. 위에도 이야기했듯이 오브젝트들도 변수로 취급되며, 이와 같은 규칙을 적용받는다. 따라서 코드에서 오브젝트를 써야 한다면 오브젝트의 이름을 한글로 지정하지 않는 것이 유리하다.

 

 2. 변수의 이름 제일 앞에 숫자를 쓸 수 없다. 즉, 2jumps = 1; 이런 식의 사용은 잘못된 것이다.

 

 3. 최대 길이는 64글자이다. 아무래도 이 길이를 넘을 만큼 긴 이름의 변수를 사용할 일은 없을 것이다. 크게 신경 안 써도 된다.

 

 4. 내장 변수와 같은 이름을 사용해서는 안된다. 처음 강좌에서도 이야기 했듯이 GML은 게임과 관련된 다양한 종류의 내장 변수를 갖고 있다. 변수의 이름은 각각의 변수를 구분하는 수단이므로, 정확히 말하자면 내장 변수와 같은 이름을 사용할 경우 의도하지 않은 결과가 나타날 확률이 높다.

 

 하지만 처음 배우는 입장에서는 내가 지정한 이름이 이미 정의되어있는 내장 변수인지 알기 힘들 것이다. 그러나 게임메이커 코드 편집기에서 이미 지정되어 있는 내장 변수는 갈색으로, 정의되어있지 않은 변수는 검은색으로 표시되므로 이 점을 유의하면 쉽게 구분할 수 있을 것이다.

 

 

만약 내 편집기는 아무 색깔 안 나타나는데요. 하는 사람 있다면 게임메이커 툴 상단의 메뉴에서 파일 -> 설정 -> 스크립트 -> 우측 중단의 '색 입히기 적용' 을 체크해주자.

 

 

3. 변수의 통용 범위

 

 변수에는 그 변수가 통용될 수 있는 범위가 있다. 게임메이커에서는 크게 봐서 세 가지의 통용 범위가 있다.

 

 1. 인스턴스 범위

 

 가장 일반적인 범위이다. 아무런 지정 없이 변수를 선언한 경우 인스턴스 범위로 지정이 된다. 인스턴스 범위란 말 그대로 해당 인스턴스 내에서만 그 변수를 이용할 수 있다는 것이다. 다른 인스턴스에서는 같은 이름이라 할지라도 서로 다른 값을 가질 수 있으며, 애초부터 같은 변수로 취급되지 않는다.

 

 예제를 통해 알아보자. 우선 하나의 오브젝트를 만들고 그 오브젝트에 적당한 스프라이트를 붙여준다.

 

 

 

여기에서 이벤트 생성될 때/ 마우스 왼쪽, 오른쪽 클릭의 세 개의 이벤트를  추가하고, 생성될 때의 이벤트에서 아래와 같은 코드를 기입하자.

 

n = 0;

 

 

그리고 왼쪽 버튼 클릭시의 이벤트에서 n=n+1;이라는 코드 내용을, 오른쪽 버튼 클릭시의 이벤트에서 show_message(n);이라는 코드 내용을 기입해주자.

 

 

 

이제 이 오브젝트를 룸에 두 개 배치한 다음 실행하고, 각각의 오브젝트를 서로 다른 횟수만큼 왼쪽 클릭한 다음 오른쪽 클릭해보자. 아마 화면에 나타나는 숫자가 서로 다를 것이다.

 

 

위에서 우리가 만든 프로그램을 설명하자면 다음과 같다.

 

 생성할 때 : 변수 n을 0으로 초기화한다.

 왼쪽클릭할 때 : 변수 n의 값을 1 추가한다. 

 오른쪽클릭할 때 : 변수 n의 값을 출력한다.

 

 하나의 오브젝트에 n이라는 변수 하나만을 정의했음에도 불구하고, 실제 프로그램을 실행하고 양 오브젝트를 무작위로 클릭한 다음 오른쪽 클릭해보면 숫자가 서로 다르게 나타난다. n이라는 변수 하나만 정의했지만, 이 n이라는 변수가 통용되는 범위가 오브젝트 범위가 아닌 하나의 인스턴스 범위이기 때문에 일어나는 일이다. 즉, 화면에 존재하는 두 인스턴스의 n은 이름만 같지 서로 다른 변수라는 것이다.

 

2. 글로벌 범위

 

 글로벌 범위는 게임 내 모든 영역에서 사용가능한 범위를 말한다. 이것도 실험해보자. 아주 간단하다. 위의 예제에서 n이 들어가는 부분을 전부 global.n 으로 바꿔주자. 그리고 실행해보면, 왼쪽 클릭 몇 번하고 오른쪽 클릭을 하면 어느 인스턴스를 오른쪽 클릭했든지간에 상관없이 같은 숫자가 나타난다.

 

 global.n은 하나의 인스턴스에서만 통용되는 것이 아니라, 게임 내 전체에서 통용되기 때문에 이렇게 동작하는 것이다.

 

 global. 을 일일히 붙이기가 귀찮다면, globalvar n; 구문을 사용해도 된다. 처음 선언할 때 맨 위에 globalvar n;이라는 구문을 덧붙이면 global. 이 없어도 변수의 통용 범위를 글로벌 범위로 인식한다.

 

3. 코드 범위

 

 이번엔 처음의 예제에서 생성될 때의 코드 제일 위에 var n; 이라는 구문을 추가하고 실행해보자.

 

 아마 왼쪽 클릭을 하든 오른쪽 클릭을 하든 다음과 같은 에러가 나타날 것이다.

 

 

 

ERROR in

action number 1

of Mouse Event for Left Button

for object object0:

 

Error in code at line 1:

   n=n+1;

    ^

at position 3: Unknown variable n

 

 

n이라는 변수가 선언되지 않았다고 징징대는 것이다. 분명 생성될 때 n이라는 변수를 초기화해줬는데 왜 이러는 걸까? 문제는 var n;이라는 구문에 있다.

 

 var n;이라는 구문을 덧붙일 경우 n이라는 변수를 사용할 수 있는 범위를 해당 코드로 한정시킨다. 즉, 그 코드가 끝나면 n이라는 변수도 사라지며 다른 코드에서 n을 써봤자 그 코드의 n은 이전 코드의 n과는 다르다는 것이다.

 

 

 

왼쪽 클릭할 때 n=n+1;이라는 코드를 지정해놨지만 var n; 구문 때문에 n이 생성될 때의 코드 범위로 통용 범위가 한정되면서, n=n+1; 구문에서 n의 값이 몇인지 알 수 없기 때문에 에러가 나타나는 것이다.

 

 이렇듯 변수의 통용 범위는 상당히 중요한 문제이며, 이 범위를 잘 지켜서 코드를 만든다면 훨씬 효율적으로 코드를 작성할 수 있다.

 

요약하자면 다음과 같다.

 

1. 인스턴스 범위 : 인스턴스 내에서만 같은 변수로 인식되며 아무런 지정자 없을 경우 인스턴스 범위로 지정된다.

 

2. 글로벌 범위 : 변수 이름 앞에 global. 을 붙이거나 globalvar (변수이름); 의 형태로 사용가능하다. 게임 내 모든 장소에서 같은 변수로 인식된다.

 

3. 코드 범위: var (변수이름); 의 형태로 사용된다. 해당 코드에서만 같은 변수로 인식되며 그 코드 범위만 빠져나가도 인식되지 않는다.

 

범위의 크기로 따지면 코드 범위 < 인스턴스 범위 < 글로벌 범위 가 될 것이다.

 

 

 통용 범위의 경우 상당히 복잡하기 때문에 말로 이해하기 힘든 부분이 많다. 모든 예제 파일을 첨부해놓았으니 직접 파일을 열어 코드를 보면서 이해하면 훨씬 이해하기 쉬울 것이다.



Profile
2
Lv

0개의 댓글

번호 제목 글쓴이 날짜 조회 수
공지 게임메이커 구체적인 설명과 알면 매우 좋은 팁 30개 [장문] 7 profile 도개걸윷모 2018.11.03 186
64 [팁] <댓글 스티커>, <쿠키 마켓>의 쿠키 반환 비율 (수수료, 이익 비율) 2 profile 며르치 2019.01.21 33
63 [팁] 쿠키 얻기/쓰기 조건 정리 4 profile 며르치 2019.01.17 60
62 [쿠키 API] ini처럼 온라인 데이터 저장/불러오기 구현하기 3 profile 주인장수표 2018.12.26 65
61 [쿠키 API] 구글, 네이버, 카카오톡 로그인 구현하기 profile 주인장수표 2018.12.26 52
60 인벤토리 만들기 - 1 profile Experience 2018.12.18 36
59 간단한 도트 찍는 방법! profile Experience 2018.12.17 23
58 [자료] 스팀 게임 플레이어의 통상적 컴퓨터 사양 1 profile 주인장수표 2018.12.17 21
57 [변수의 활용] VAR (if) 액션과 컨트롤액션 profile Experience 2018.12.17 6
56 윈도우를 컨트롤하자! profile Experience 2018.12.17 16
55 GML 차근차근 배워보기. [ 4 ] 조건문 profile Experience 2018.12.17 7
54 GML 차근차근 배워보기. [ 3 ] 연산자 (2) profile Experience 2018.12.17 5
53 GML 차근차근 배워보기. [ 3 ] 연산자 (1) profile Experience 2018.12.17 10
52 GML 차근차근 배워보기. [ 2 ] 변수 (2) profile Experience 2018.12.17 8
GML 차근차근 배워보기. [ 2 ] 변수 (1) profile Experience 2018.12.17 11
50 GML 차근차근 배워보기. [ 1 ] 강좌 진행 환경 조성 2 profile Experience 2018.12.17 8
49 리얼리티 '뷰' 노이즈 강좌 profile Experience 2018.11.29 14
48 [윈도우] 게임을 실행할 때 다른 윈도우를 모두 최소화시키기 profile Experience 2018.11.29 13
47 간단한 8방향 이동 코드 profile Experience 2018.11.29 9
46 겜스 간단한 페이드인/페이드아웃 profile Experience 2018.11.29 11
45 게임메이커 8 강좌 5화 -룸- END profile Experience 2018.11.29 13
서버에 요청 중입니다. 잠시만 기다려 주십시오...