GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커 강좌-기초][GMS2] 배열

타락카얀 2023. 12. 31. 10:26
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

 

배열은 매우 유용할 수 있으며 게임을 만드는데 필수적입니다.

이 기능은 여러 값을 목록형태로 보유할 수 있는 변수 유형 중 하나입니다.

 

 

 

 

◈ 1차 배열

 

 

배열은 단순히 변수에 할당되는 데이터 유형이며 하나의 값이 아니라 여러 값을 포함할 수 있습니다.

배열을 사용하기 전에 먼저 초기화(정의)해야 사용할 수 있습니다.

그렇지 않으면 참조 오류가 발생해요.

 

1차 배열은 아래와 같이 정의합니다.


   변수[인덱스] = 값

 

사용할 변수에 인덱스(위치)를 지정하고, 그 위치에 값을 할당하는 방식입니다.

인덱스는 0부터 시작하고 양의 정수로 구성합니다.

 

예)


   a[0]=125
   a[1]=4.56
   a[2]=id
   a[3]="Hi!"
   ...


 

이것을 1차 배열이라고 하며, 보시다시피 배열은 변수 "a"에 저장되고 여러 값을 포함합니다.

배열에 액세스하려면 다음과 같이 해야 합니다.

 


   //배열 참조
   
   _val = a[0];


 

엑세스하려는 배열의 인덱스 위치와 함께 지정하면 됩니다.

 

배열은 아래와 같이 정의 할 수도 있습니다.

 


   numbers = [ 10, 1, 8, 3, 6, 15 ];

 

배열에 넣을 항목을 이미 알고 있는 경우 배열을 선언할 때 대괄호"[ ]" 사이에 쉼표로 구분된 값을 추가할 수 있지요.

이것은 아래와도 같습니다.

 


   numbers[0] = 10;
   numbers[1] = 1;
   numbers[2] = 8;
   numbers[3] = 3;
   numbers[4] = 6;
   numbers[5] = 15;


 

값이 없는 '빈' 배열을 만들 수도 있습니다.

예를 들면 다음과 같습니다.

 


   numbers = [ ];

 

다만, 빈 배열은 변수를 배열로 사용한다는 것일 뿐, 실질적으로는 값을 1개 이상 추가해야 사용할 수 있습니다.

 

배열의 정의된 범위를 벗어난 위치의 값에 액세스하려고 하면 오류가 발생하므로 항상 유효한 배열 위치에만 액세스하도록 주의해야 합니다.

예를 들어, 아래와 같이 인덱스가 0~5 까지인 배열이 있을 때,

 


   numbers = [ 10, 1, 8, 3, 6, 15 ];
   
   var _val = numbers[6];


 

인덱스 6을 엑세스하려면, 배열의 정의된 범위를 벗어났기 때문에 오류가 발생합니다.

즉, 위의 상황이라면 0~5 의 위치만 엑세스할 수 있습니다.

이것을 방지하려면 배열을 얼만큼 정의했는지 알아야 합니다.

간단하게는 배열 끝이 어딘지 모를 때, 함수 array_length(array_index)로 체크하면 배열의 끝을 쉽게 알 수 있습니다.

 


    array_length(배열변수) : 지정한 배열의 길이를 반환합니다.

 

※ 배열의 첫번째 인덱스는 0, 마지막 인덱스는 array_length(배열)-1 입니다.

 

예)


   for (var i = 0; i <= array_length(array)-1; i++;)
       {
       draw_text(32, 32 + (i * 32), array[i]);
       }


 

배열을 정의하는 변수를 단일 값으로 재할당하여 간단히 배열을 삭제할 수 있습니다.

예를 들어,

 


   // 배열 생성

   for (var i = 9; i > -1; --i)
   {
     array[i] = i;
   }
   
   
   // 배열 삭제
   
   array = -1;


 

이렇게 하면 해당 배열의 모든 위치 및 값과 관련된 메모리가 해제됩니다.

 

다만, 인스턴스에서 배열을 만들 때, 인스턴스가 게임에서 제거될 때까지 굳이 정리할 필요는 없습니다.

[Destroy 이벤트], 또는 [Room End 이벤트]에서 가비지 수집기(garbage collector)에 의해 자동으로 제거되기 때문이죠.

 

그러나 배열 위치에 파티클 시스템, 버퍼, 또는 데이터 구조체 등과 같은 동적 에셋에 대한 참조가 있는 경우,

인스턴스가 소멸되기 전이나 룸이 끝나기 전, 또는 배열을 삭제하기 앞서 동적 에셋들은 먼저 제거해야 합니다.

 

 

 

 

 

 

 

◈ 다차원 배열

 

 

GameMaker에서는 1차 배열뿐만아니라 여러 차원의 배열을 가질 수 있으며, 기본적으로 배열 내부의 배열로 구성됩니다.

예를 들어, 2차 배열은 아래와 같이 구성됩니다.

 


   변수[1차 인덱스][2차 인덱스] = 값

 

첫번째가 1차 배열의 인덱스, 두번째가 2차 배열의 인덱스로 구성됩니다.

 

예)


   array[0][0] = 0;
   array[0][1] = 1;
   array[0][2] = 2;
   
   array[1][0] = 3;
   array[1][1] = 4;
   array[1][2] = 5;


 

위의 코드에서 array[0]은 2차 배열을 보유하고 있으며, array[1]도 마찬가지입니다.

 

다차원 배열은 단일 1차 배열과 마찬가지로 사용하기 전에 초기화(정의)해야 하며, 변수와 마찬가지로 실수,

문자열 및 기타 데이터 유형을 저장할 수 있습니다.

 

쉽게 액세스할 수 있는 방식으로 1차 배열을 중첩하여 하나의 명령문 내에서 다차원 배열을 정의할 수도 있습니다.

 


   two_dimensional_array = 
   [
       ["Apple", 10, 2],
       ["Orange", 5, 2],
       ["Mango", 15, 4],
   ]


 

배열의 1차 배열이 보유하고 있는 2차 배열간의 길이가 서로 다를 수 있습니다.

예를 들어, 아래와 같이

 


   array[0][0] = 1;
   array[0][1] = 2;
   
   array[1][0] = "one";
   array[1][1] = "two";
   array[1][2] = "three";
   array[1][3] = "four";
   
   array[2][0] = "1";
   array[2][1] = "2";
   array[2][2] = "3";


 

위의 코드는 array[0]에는 2개의 2차배열이 있고, array[1]에는 4개, array[2]에는 3개의 2차 배열을 서로 다르게 보유하고 있죠.

 

다차원 배열은 2차 배열로 제한되지 않고 필요에 따라 [n]개의 추가 인수를 추가하기만 하면, 배열에 3, 4 또는 그 이상의 차원을 가질 수 있습니다.

 

예를 들면, 아래 처럼 말이죠.

 


   array[0][0][0] = 1; // 3차 배열
   array[0][0][0][0] = 1; // 4차 배열


 

다차원 배열의 길이도 array_length 함수를 사용하여 알아 볼 수 있습니다.

 


   array_length(배열변수[1차 인덱스]) //2차 배열의 길이
   
   array_length(배열변수[1차 인덱스][2차 인덱스]) //3차 배열의 길이
   
   ...


 

예를 들어, 배열의 1차 2번 슬롯이 보유하고 있는 2차 배열의 길이를 알아보려면,

 


   _numb = array_length(array[2]);

 

이와 같이 할 수 있습니다.

 

 

 

 

 

 

 

 

300x250