![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i16579335483.jpg?MW=800)
1. 변수 선언
2. 로컬변수 선언
3. 전역변수 선언
4. 내장 변수
5. 다른 오브젝트의 변수 불러오기
앞서 우리는 화면에 Hello World를 표시해보았습니다. 하지만 그것은 게임이 아니라 그냥 글자에 불과합니다. 조금 더 복잡한 프로그램을 만들어내기 위해 우리는 '변수'라는 것을 다룰 필요가 있습니다. 변수란 프로그램이 사용할 숫자나 문자 등을 저장하는 일종의 공간이고, 사용자는 그것을 필요에 따라 수정하거나 변경할 수 있습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14356560476.png?MW=800)
앞서 첫번째 시간에 Hello World를 출력하는데 사용하였던 objText 을 활용할 것입니다. 이 오브젝트에 Create 이벤트를 만들어보겠습니다. Create 이벤트는 오브젝트가 처음 만들어졌을 때 초기 행동을 설정하는 이벤트입니다. 만약 이전의 내용을 저장하지 않고 종료하셨다면, 그냥 새로운 오브젝트를 만드시고 그대로 따라하시면 됩니다!
1. 변수 선언
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14315527142.png?MW=800)
Create 이벤트를 추가했습니다. 코드 에디터가 나오면 다음과 같이 입력해보겠습니다.
name = "Kim"; age = 10; point = 1.2;
|
이렇게 이름과 등호, 그리고 값을 써서 표시하는 것을 우리는 '변수를 선언한다' 라고 합니다. 변수는 '변수이름 = 값' 으로 선언할 수 있습니다. 이렇게 선언된 변수의 색상은 연한 보라색으로 표시됩니다. 변수의 이름은 영어, 숫자, _를 사용하여 작성하고, 변수의 맨 앞에는 숫자가 올 수는 없습니다. 또한 영어는 대소문자를 구분합니다.
그런데 C언어와 같은 프로그래밍 언어를 이미 사용해보신 분이라면 궁금해하실 수 있습니다. 어째서 int나 float같은 자료형을 따로 선언하지 않는 것이지? GML에서의 변수는 처음 선언시에 저장한 값에 따라 묵시적으로 변수의 형이 지정됩니다. 변수에 문자를 넣으면 그 변수는 문자열 변수가 되고, 정수를 넣으면 정수형 변수, 소수를 넣으면 실수형 변수가 됩니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14343235357.png?MW=800)
이제 Draw 이벤트에 코드를 입력하여 직접 선언한 변수를 화면에 출력해 볼 것입니다.
draw_text(0,0,name); draw_text(0,24,"AGE : " + string(age)); draw_text(0,48,"POINT : " + string(point));
|
앞서 우리는 숫자의 형태로 age와 point 라는 변수를 선언하였기 때문에 이것을 문자로 출력하기 위해서는 string(변수) 의 형식으로 변환하여야 합니다. 또한 문자와 문자를 잇기 위해서 + 연산을 사용합니다. 연산자에 대한 설명은 차후 설명하도록 하겠습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14372961480.png?MW=800)
오브젝트가 room0에 삽입되어있는 것을 확인하시고 게임을 실행해봅시다. 룸에 오브젝트를 넣으시는 방법을 잊으셨다면 이전 게시물에 적어놓은 내용을 확인해주세요.
실행결과, 아까 우리가 입력했던 변수가 그대로 출력되었습니다.
2. 로컬변수 선언
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14301819466.png?MW=800)
그러면 이번에는 방금 전의 Draw 이벤트에 하나의 변수를 선언해보겠습니다.
var agepoint = age+point;
|
age와 point를 더한 값을 agepoint라는 변수의 값으로 지정할 것입니다. 그런데 agepoint 라는 변수의 앞에 var 라는 것이 쓰여져있지요. 이것은 무엇을 의미할까요?
변수는 사용할 수 있는 영역 (scope)라는 것이 있습니다. 앞서 우리가 선언한 연보라색의 변수의 게임메이커 상에서의 정확한 이름은 '인스턴스 변수 (흔히 그냥 '변수'라고 부릅니다)' 입니다. 이 변수는 오브젝트의 Create 이벤트에서 처음으로 선언한 후 오브젝트 내의 어떠한 이벤트에서라도 사용할 수가 있습니다. 그러나 var를 붙여서 선언한 변수, 이름하여 '로컬변수 (혹은 임시변수)' 는 선언된 이벤트 내에서 한번 사용된 후 더 이상 사용하지 않고 버려지며, 다른 이벤트에서는 사용할 수 없습니다. 이러한 변수는 코드 에디터 상에서 연노랑색으로 표시됩니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14357628947.png?MW=800)
위의 내용을 실행하면, age 변수과 point 변수의 값을 더해 만든 값 agepoint를 확인해보실 수 있습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14330475813.png?MW=800)
여기서 하나의 테스트를 해보도록 하겠습니다. 만약 Create 이벤트에서 선언한 로컬변수를 다른 이벤트에서 사용하려 한다면 어떤 일이 발생할까요? 우리는 ageplusone 이라는 이름으로 age 변수에 1을 더한 값을 가진 로컬변수를 만들어보겠습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14386659055.png?MW=800)
그리고 Draw 이벤트에서 ageplusone 값을 출력해보겠습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14314611928.png?MW=800)
실행해보았더니, 이럴수가! 에러가 나는군요. 에러의 내용을 보니 objText.ageplusone은 선언되지 않은 변수라고 합니다. 이렇게 로컬변수의 사용영역을 직접 눈으로 확인해보았습니다.
전역변수 선언
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14345450948.png?MW=800)
다음으로 우리는 또다른 변수를 objText의 Create 이벤트에 선언해보겠습니다.
global.day = 10; globalvar month; month = 5;
|
이 변수는 '전역변수'라 부릅니다. 전역변수는 선언한 이후에는 게임이 종료되기 전까지 어떠한 오브젝트에서나 어떠한 룸에서라도 계속 사용할 수 있는 변수입니다. 그렇기 때문에 전역변수는 게임의 첫 시작 부분에서 선언한 후에 다시 선언되는 것을 방지하는 것이 좋습니다. 전역변수를 선언하는 방법은 두가지인데, 하나는 ' global.변수이름 = 변수값' 이고, 또 하나는 globalvar 변수이름; 입니다. 전자는 변수 이름에 global.변수이름 과 같은 식으로 입력해서 다른 일반 변수와 구분하며, 후자는 한번 선언하면 global. 같은 것을 입력할 필요 없이 일반 변수와 같은 모양으로 전역변수의 역할을 수행합니다. 그러나 globalvar 같은 경우 남용하게 될 시 추후 코드를 해석하기가 상당히 난해해집니다. global. 변수의 경우 에디터상에서 분홍색으로 표시되어 다른 변수와 구분하기 편리하기 때문에 global.변수 를 사용하는 것을 적극 권장합니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14375407271.png?MW=800)
전역변수가 제대로 선언되었는지 확인해보기 위해 objText2 라는 오브젝트를 또 하나 만들어보기로 합니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14302419411.png?MW=800)
생성된 objText2에 Add Event - Draw를 클릭하여 Draw 이벤트를 추가하고 다음과 같은 코드를 입력해보겠습니다.
draw_text(0,0,"TEXT from objText2 : " + string(global.day));
draw_text(0,24,"TEXT from objText2 : " + string(month));
|
앞서 우리는 global.day와 month 변수를 모두 objText에서 선언하였습니다. 만약 이것이 일반 변수나 로컬 변수라면 objText2에서 선언되지 않은 변수이므로 해당 코드가 에러가 나겠지만, 전역변수인 경우 정상적으로 출력될 것입니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14331813035.png?MW=800)
room0에는 objText와 objText2를 각각 하나씩 넣습니다. 이제 게임을 실행해보도록 합니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14360346691.png?MW=800)
방금 입력하였던 변수가 정상적으로 출력되었습니다.
내장 변수
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14339510427.png?MW=800)
이렇게 3가지 다른 영역의 변수를 직접 사용해보았습니다. 이번에는 '내장 변수'를 사용해볼 것입니다. 이 변수는 선언하지는 않았으나 기본적으로 내장되어있는 변수입니다. 인스턴스의 좌표나 속도, 인스턴스의 스프라이트의 알파값, 게임의 프레임 등 다양한 내장 변수가 있습니다. 색상은 연두색입니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14368660620.png?MW=800)
각 내장 변수들의 값을 직접 확인해봅니다.
다른 오브젝트의 변수를 불러오기
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14315527142.png?MW=800)
만약에 룸에 오브젝트가 존재한다면, 다른 오브젝트가 그 오브젝트의 변수값을 가져올 수도 있습니다. 그러나 해당 오브젝트가 룸에 존재하지 않는다면 에러가 발생할 수 있으므로 주의하셔야 합니다. 또한 같은 오브젝트에서 파생된 인스턴스가 룸에 여러개 있다면 가장 마지막으로 생성된 인스턴스의 변수를 불러오게 됩니다.
objText의 Create 이벤트에 이렇게 세가지의 변수를 선언하였습니다.
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14382111959.png?MW=800)
이제 objText의 age라는 변수와 point라는 변수를 다른 오브젝트 objText2 를 통해서 출력해보고자 합니다. objText2 의 Draw 이벤트에 이와 같은 문자 출력 함수를 입력합니다.
draw_text(0,0,"TEXT from objText2 : " + string(objText.age));
draw_text(0,24,"TEXT from objText2 : " + string(objText.point));
|
![](https://upload2.inven.co.kr/upload/2017/07/03/bbs/i14312580922.png?MW=800)
룸에 objText와 objText2가 모두 들어있는지 확인하시고 실행해봅니다. 정상적으로 출력되는 것을 확인하실 수 있습니다.