게임제작/강좌

[GML]변수 어디까지 알고있는가? 게임메이커의 변수선언들

게임코드프리 2019. 2. 3. 09:00
반응형

#변수 #변수의 종류 #변수의 개념 #게임메이커 스튜디오 강좌



게임메이커의 많은 변수 선언들에 대해 알아보자




(이미지에서는 var v =1 같은 임시변수를 빼먹었지만 아래쪽에서 계속 설명)



게임메이커스튜디오에서는 다양한 변수 선언문이 존재하며 각각의 변수선언문의 의미를 


알지 못하면 게임제작이 불가능할정도로 기초적이면서도 가장 중요한 부분입니다.


이 변수부분이 어떻게 보면 쉽고 초보자들에게는 알다가도 모를 부분들이 있기 때문에 개념에 대해서도


설명하려고 하며 절대로 이 강좌는 쉬운 초보자 용이 아니지만 초보자가 극복하지 못하면


안되는 부분이기도 합니다.




  • 1. 지역변수


게임프로그래밍 강좌같은 곳에서 지역변수라는 말은 한번쯤은 들어본적 있을거라 생각합니다.


지역변수란 무엇인가하면,





게임메이커 스튜디오에서 오브젝트를 생성하였을때 각각의 객체(오브젝트)들이 바로 각각 따로 


지역변수를 가지고 있을 수 있습니다.


obj_player 라는 이름을 가진 오브젝트와 obj_monster 라는 이름을 가진 오브젝트에서 선언된 지역변수는


서로 간섭하지 않고 진행됩니다.



게임을 만드는것처럼 예를 들자면,





obj_player 오브젝트에서 크리에이트 이벤트 코드에 처음 변수를 선언합니다.


이제 obj_player에는 hp라는 변수와 mp 변수가 존재합니다. 


RPG라고 상상하고 만든다면, 공격력이나 방어력도 필요할테니 atk = 3; def =3 이런식으로 변수가 추가되겠죠?


그리고 obj_monster 에도 똑같이 그런 것들을 만들어둡시다.




만약 여기서 제대로 변수에 대해서 이해하지 않고 넘어가서 게임을 만들경우 이런 문제가 생깁니다.



obj_battle_system 이라는 오브젝트를 만들어서 


배틀시스템에 관련된 코딩을 하고 여기서 


몬스터피해량 = 플레이어 공격력 / 몬스터 방어력이라는 공식(엄청 간단하게 한다면 이런식)이 성립되고



코딩을 했지만 에러가 발생할 것입니다.



왜냐하면 obj_battle_system에서 각각 만들어 놓은 지역변수들에 대한 제어를 할 수 없기 때문입니다.



다른 오브젝트가 또 다른 오브젝트에서 선언된 변수를 사용하는 것이 불가능 한 것은 아니지만 꽤나 복잡해집니다.


 final_demage = obj_player.hp - obj_monster.atk 


이런식으로 각 객체이름.그리고 하위에 있는 변수를 써주면 접근은 가능.



각각 자신이 처리해야될 변수를 우리는 지역변수라 부르며 선언하는 방법은 간단합니다.



[지역변수의 선언]


변수이름 = 초기값 숫자;


변수이름 = "문자열";


숫자는 그냥 숫자를 적으면 되지만 문자열의 경우에는 " " 따옴표를 써야합니다.



요약 각 객체(오브젝트)에서만 선언하고 쓸 수 있는 변수를 지역변수라 합니다.




  • 2.전역변수



앞서 이야기한대로 지역변수들의 문제점(?)이 있기때문에 값을 계산해야 하거나 여기저기서 함께 써야 하는 변수들이


존재하기에 전역변수가 필요하기도 합니다.





게임에서 돈의 경우에는 사실상 개발자가 유저에게 선물로 줄수도 있고, 혹은 몬스터에게서 얻을 수 있고


어쩌면 보물상자에서 얻을 수도 있기때문에 온갖 장소에서 호출과 계산을 해줄 가능성이 높은 변수입니다.



그렇기 때문에 필요한것이 전지역에서 쓸수 있는 전역변수가 필요하고


선언 방법은 간단합니다.



[전역변수의 선언]


globalvar 변수이름;


변수이름 = 원하는 숫자 혹은 문자열



이제 플레이어 오브젝트에서 호출을 하던, 몬스터 오브젝트에서 호출을 하던 변수이름을 쓰면 어디서든


사용이 가능합니다.



  • 글로벌 변수



사실상 전역변수와 기능은 동일하지만 한가지 차이점이 있습니다.



바로 매번 사용할때마다 변수의 이름 앞에 global. 을 붙여서 변수이름을 사용해야 합니다.


장단점은 이게 전역변수인지 지역변수였는지 확실하게 시간이 흐른뒤에 코드를 보면 이해하기 쉽지만


전역변수에서는 어디에서 선언을 했었는지 또한 이게 지역변수인지 전역변수인지 순간 헷갈리기 쉽기에


글로벌 변수를 더 선호하는 사람들도 종종 있습니다.




  • 열거형 변수





개인적으로는 열거형을 별로 쓰지 않는 편이지만 상당히 코드를 깔끔하게 해주기도 하고


정리정돈을 매우 좋아하는 프로그래머에게는 유용한 전역변수이기도 합니다.



어떤때에 사용하는가하면 ... 스위치를 켜고 끄는 형태의 변수로 사용될수도 있고 위 이미지처럼


캐릭터의 스프라이트를 매번 상태에 따라서 변경해줄경우에도 쓰입니다.



[열거형 변수의 선언]


enum 주제가 될 변수이름

{

변수1,

변수2

}


변수의 이름을 선언만 해두어도 되며 어떤 값을 갖고 있게 한다면 위의 이미지처럼 선언을 해도 됩니다.



이 열거형 변수 역시도 전역에서 사용이 가능하며 , 예를 들어 


플레이어가 아무런 입력을 하지 않을 경우에는 스탠드 이미지로 바꿔야 한다면 


enum PlayerState 

{

stand = img_sprite_name;

}




이런식으로 사용이 가능하다는 의미가 되겠습니다.



  • 임시변수



임시변수가 생겨난 이유는 변수를 계속 선언하거나 선언된 변수들이 너무나 많을 경우 


이것 역시도 메모리를 잡아먹고 용량을 늘려가게 하는 요인이 되므로 잠깐만 쓰고 버릴 변수도


필요하게 된 것이 바로 임시변수입니다.



var 변수이름 = 선언;



앞에 var라는 이름을 붙이면 임시변수라는 표시이고 이것은 사용할때만 잠깐 쓰고 삭제됩니다.


다른사람들의 코드를 구경하다보면 쉽게 볼 수 있는 예제가 바로 for문에서 주로 보게되는데,


for (var i=0; i < 10; i++)

{

반복행동 코드

}


다양한 형태에서 임시 변수가 필요한 경우 사용되고 편리하여 많은 코드 안에서 자주 보게 될 임시 변수입니다.




with문을 활용한 지역변수 접근법



위에서 설명한대로 각각 서로 지역변수에서 선언된 변수에 대한 접근이 어렵지만,


with문을 사용하면 이야기가 달라집니다.


예를들어 플레이어가 몬스터에 대한 행동을 제어하고 변수를 사용하기 위해서는



[obj_player] // 오브젝트 플레이어라는 객체에서 실행

- step event - 

with (obj_monster)

{

//내용

}



위와 같은 코드를 작성하게 되면 플레이어라는 객체에서도 몬스터라는 객체에 접근해서


몬스터의 행동이나 변수를 활용하여 실행할 수 있게 됩니다.


예를들어 몬스터에서 선언한 변수가 hp가 있다고 가정하면 with문을 쓰지 않았을 경우


obj_monster.hp 라고 써야만 몬스터가 가진 hp 라는 변수에 접근이 가능하지만


with문에서 with(obj_monster) {hp -= 3} 이라고 쓴다면 몬스터의 hp가 3만큼 줄어들게 되는것이


가능하다는 의미입니다.



이해가 어려운 사람들을 위해



프로그래밍 강좌는 쓰는 사람도 읽는 사람도 지루합니다(....)


한번에 이해가 되고 바로 코드를 글쓰듯 써내려가는 사람이 있는가 하면 몇년이 걸려도 자유롭게 코드를 짜지 못하는


사람도 있습니다.(내 얘기)



다만 중요한것은 계속해서 보려고 하는 시도 및 익숙해지는 것이 중요합니다.


코드를 분석하거나 다른 사람이 짠 예제의 코드를 보다보면 이게 뭐였지? 하는 상황들이 보이는데,


그럴때마다 이런 강좌들을 다시 찾아서 보고 잊어버리면 다시 찾아서 보면서 


반복행동으로 기억하는 것이 좋습니다.



프로그래밍은 직접 코드를 작성해보고 왜 안되는지를 설명해둔 문서들을 찾아보고 이해를 하면서


경험을 쌓는것이 가장 좋기때문에 지금 당장 이해가 가지 않아도 너무 상심하지 않기를 바랍니다.

반응형
facebook twitter kakaoTalk kakaostory naver band shareLink
人気ブログランキングでフォロー