인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

[게임메이커] 처음 만나는 GMS2 // 2. GML - 변수

Zpink
조회: 2998
추천: 2
2017-07-03 18:19:02






1. 변수 선언

2. 로컬변수 선언

3. 전역변수 선언

4. 내장 변수

5. 다른 오브젝트의 변수 불러오기



 앞서 우리는 화면에 Hello World를 표시해보았습니다. 하지만 그것은 게임이 아니라 그냥 글자에 불과합니다. 조금 더 복잡한 프로그램을 만들어내기 위해 우리는 '변수'라는 것을 다룰 필요가 있습니다. 변수란 프로그램이 사용할 숫자나 문자 등을 저장하는 일종의 공간이고, 사용자는 그것을 필요에 따라 수정하거나 변경할 수 있습니다.





앞서 첫번째 시간에 Hello World를 출력하는데 사용하였던 objText 을 활용할 것입니다. 이 오브젝트에 Create 이벤트를 만들어보겠습니다. Create 이벤트는 오브젝트가 처음 만들어졌을 때 초기 행동을 설정하는 이벤트입니다. 만약 이전의 내용을 저장하지 않고 종료하셨다면, 그냥 새로운 오브젝트를 만드시고 그대로 따라하시면 됩니다! 



1. 변수 선언





Create 이벤트를 추가했습니다. 코드 에디터가 나오면 다음과 같이 입력해보겠습니다.


 

name = "Kim";

age = 10;

point = 1.2;




 이렇게 이름과 등호, 그리고 값을 써서 표시하는 것을 우리는 '변수를 선언한다' 라고 합니다. 변수는 '변수이름 = 값' 으로 선언할 수 있습니다. 이렇게 선언된 변수의 색상은 연한 보라색으로 표시됩니다. 변수의 이름은 영어, 숫자, _를 사용하여 작성하고, 변수의 맨 앞에는 숫자가 올 수는 없습니다. 또한 영어는 대소문자를 구분합니다.



  그런데 C언어와 같은 프로그래밍 언어를 이미 사용해보신 분이라면 궁금해하실 수 있습니다. 어째서 int나 float같은 자료형을 따로 선언하지 않는 것이지? GML에서의 변수는 처음 선언시에 저장한 값에 따라 묵시적으로 변수의 형이 지정됩니다. 변수에 문자를 넣으면 그 변수는 문자열 변수가 되고, 정수를 넣으면 정수형 변수, 소수를 넣으면 실수형 변수가 됩니다.  





이제 Draw 이벤트에 코드를 입력하여 직접 선언한 변수를 화면에 출력해 볼 것입니다.


 

draw_text(0,0,name);

draw_text(0,24,"AGE : " + string(age));

draw_text(0,48,"POINT : " + string(point));




앞서 우리는 숫자의 형태로 age와 point 라는 변수를 선언하였기 때문에 이것을 문자로 출력하기 위해서는 string(변수) 의 형식으로 변환하여야 합니다. 또한 문자와 문자를 잇기 위해서 + 연산을 사용합니다. 연산자에 대한 설명은 차후 설명하도록 하겠습니다.






오브젝트가 room0에 삽입되어있는 것을 확인하시고 게임을 실행해봅시다. 룸에 오브젝트를 넣으시는 방법을 잊으셨다면 이전 게시물에 적어놓은 내용을 확인해주세요.


실행결과, 아까 우리가 입력했던 변수가 그대로 출력되었습니다.




2. 로컬변수 선언



그러면 이번에는 방금 전의 Draw 이벤트에 하나의 변수를 선언해보겠습니다.


 

var agepoint = age+point;



age와 point를 더한 값을 agepoint라는 변수의 값으로 지정할 것입니다. 그런데 agepoint 라는 변수의 앞에 var 라는 것이 쓰여져있지요. 이것은 무엇을 의미할까요? 


변수는 사용할 수 있는 영역 (scope)라는 것이 있습니다. 앞서 우리가 선언한 연보라색의 변수의 게임메이커 상에서의 정확한 이름은 '인스턴스 변수 (흔히 그냥 '변수'라고 부릅니다)' 입니다. 이 변수는 오브젝트의 Create 이벤트에서 처음으로 선언한 후 오브젝트 내의 어떠한 이벤트에서라도 사용할 수가 있습니다. 그러나 var를 붙여서 선언한 변수, 이름하여 '로컬변수 (혹은 임시변수)' 는 선언된 이벤트 내에서 한번 사용된 후 더 이상 사용하지 않고 버려지며, 다른 이벤트에서는 사용할 수 없습니다. 이러한 변수는 코드 에디터 상에서 연노랑색으로 표시됩니다. 




위의 내용을 실행하면, age 변수과 point 변수의 값을 더해 만든 값 agepoint를 확인해보실 수 있습니다. 





여기서 하나의 테스트를 해보도록 하겠습니다. 만약 Create 이벤트에서 선언한 로컬변수를 다른 이벤트에서 사용하려 한다면 어떤 일이 발생할까요? 우리는 ageplusone 이라는 이름으로 age 변수에 1을 더한 값을 가진 로컬변수를 만들어보겠습니다.





그리고 Draw 이벤트에서 ageplusone 값을 출력해보겠습니다. 



실행해보았더니, 이럴수가! 에러가 나는군요. 에러의 내용을 보니 objText.ageplusone은 선언되지 않은 변수라고 합니다. 이렇게 로컬변수의 사용영역을 직접 눈으로 확인해보았습니다. 



전역변수 선언



다음으로 우리는 또다른 변수를 objText의 Create 이벤트에 선언해보겠습니다. 


 

global.day = 10;

globalvar month;

month = 5;




이 변수는 '전역변수'라 부릅니다. 전역변수는 선언한 이후에는 게임이 종료되기 전까지 어떠한 오브젝트에서나 어떠한 룸에서라도 계속 사용할 수 있는 변수입니다. 그렇기 때문에 전역변수는 게임의 첫 시작 부분에서 선언한 후에 다시 선언되는 것을 방지하는 것이 좋습니다. 전역변수를 선언하는 방법은 두가지인데, 하나는 ' global.변수이름 = 변수값' 이고, 또 하나는 globalvar 변수이름; 입니다. 전자는 변수 이름에 global.변수이름 과 같은 식으로 입력해서 다른 일반 변수와 구분하며, 후자는 한번 선언하면 global. 같은 것을 입력할 필요 없이 일반 변수와 같은 모양으로 전역변수의 역할을 수행합니다. 그러나 globalvar 같은 경우 남용하게 될 시 추후 코드를 해석하기가 상당히 난해해집니다. global. 변수의 경우 에디터상에서 분홍색으로 표시되어 다른 변수와 구분하기 편리하기 때문에 global.변수 를 사용하는 것을 적극 권장합니다. 





전역변수가 제대로 선언되었는지 확인해보기 위해 objText2 라는 오브젝트를 또 하나 만들어보기로 합니다.





생성된 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에서 선언되지 않은 변수이므로 해당 코드가 에러가 나겠지만, 전역변수인 경우 정상적으로 출력될 것입니다.




room0에는 objText와 objText2를 각각 하나씩 넣습니다. 이제 게임을 실행해보도록 합니다.





방금 입력하였던 변수가 정상적으로 출력되었습니다.




내장 변수 




이렇게 3가지 다른 영역의 변수를 직접 사용해보았습니다. 이번에는 '내장 변수'를 사용해볼 것입니다. 이 변수는 선언하지는 않았으나 기본적으로 내장되어있는 변수입니다. 인스턴스의 좌표나 속도, 인스턴스의 스프라이트의 알파값, 게임의 프레임 등 다양한 내장 변수가 있습니다. 색상은 연두색입니다. 






각 내장 변수들의 값을 직접 확인해봅니다. 







다른 오브젝트의 변수를 불러오기 


 



만약에 룸에 오브젝트가 존재한다면, 다른 오브젝트가 그 오브젝트의 변수값을 가져올 수도 있습니다. 그러나 해당 오브젝트가 룸에 존재하지 않는다면 에러가 발생할 수 있으므로 주의하셔야 합니다. 또한 같은 오브젝트에서 파생된 인스턴스가 룸에 여러개 있다면 가장 마지막으로 생성된 인스턴스의 변수를 불러오게 됩니다. 


objText의 Create 이벤트에 이렇게 세가지의 변수를 선언하였습니다.





이제 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));









룸에 objText와 objText2가 모두 들어있는지 확인하시고 실행해봅니다. 정상적으로 출력되는 것을 확인하실 수 있습니다.


Lv1 Zpink

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징