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

[게임메이커 강좌-기초][GMS2] 배열값 우선순위로 정렬하기

타락카얀 2024. 1. 3. 10:27
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 배열값 우선순위로 정렬하기

 

 

배열 정렬은 기본적으로 아래와 같이 array_sort 함수를 사용하면 오름차/내림차순으로 정렬할 수 있습니다.


   array_sort(array, true) //오름차순으로 정렬. 예) 12345


   array_sort(array, false) //내림차순으로 정렬. 예) 54321

하지만 지정한 종류별 순서로 정렬하고 싶을 때가 있을 겁니다.

예를 들어, 아래와 같이


   A - B - C - D - E - F


   또는,


   F - E - D - C - B - A

단순 오름차/내림차순서가 아니라, 아래와 같이 정렬 우선 순위를 정해놓고 부분적으로 정렬하는 것입니다.


   //목록 우선 순위
   C - D - E
   A - B
   F



   //우선 순위에 따라 정렬
   C - D - E - A - B - F

그럴 때는 콜백 메서드를 필터링하면서 정렬하면 됩니다.

 

 

 

 

이처럼 배열을 종류별로 분류하는 방법에 대해 알아봅시다.

 

먼저 종류별 순서가 필요합니다.

아이템과 아이템 사이를 구분할 수 있는 기호와 함께 순서대로 작성합니다.

여기에서는 쉼표","를 구분자로 사용하겠습니다.

강좌에서는 대충 아래와 같이 채소, 과일 등의 우선순위를 정해놓겠습니다.


   //종류별 우선순위(분류 목록)

   item_filter=@"수박,멜론,오이,여주,참외,호박,
   ,사과,오렌지,귤,감,파인애플,배,바나나,포도,
   ,배추,청경채,상추,치커리,시금치,무,
   ,도라지,더덕,인삼,";


다음, array_sort 함수에 사용할 콜백 메서드를 만듭니다.

배열을 요소를 검사하기 위해, 분류 목록의 문자열을 배열로 분류합니다.


   //배열 정렬에 사용할 콜백 메서드

   var sort_filter_func=function(_current,_next){
   
   var temp_array=string_split(item_filter,",",true);//분류 목록 item_filter를 배열로 전환
   
   var _sort=0;//0은 변동 없음.
   
   var a,b;
   a=array_get_index(temp_array,_current); //체크할 현재 아이템의 분류 목록 위치
   b=array_get_index(temp_array,_next); //체크할 다음 아이템의 분류 목록 위치
   if a>=0 && b>=0{_sort=a-b;} //오름차순으로 정렬. 내림차는 b-a.
   
   return _sort; //정렬 결과를 정렬함수에 반환.
   }


배열의 현재요소의 인덱스와 다음요소의 인덱스를 분류목록에서 찾아 순서의 차이를 계산합니다.

여기서 콜백 메서드의 반환값에 따라 배열의 순서가 아래의 순서로 바뀝니다.

 

   ◎ 0 : 변동 없음

   ◎ 음수 : [현재요소, 다음요소]

   ◎ 양수 : [다음요소, 현재요소]

 

이걸 토대로 [현재요소-다음요소]는 오름차순, [다음요소-현재요소]로 하면 내림차순으로 정렬 될 거에요.

 

이제 array_sort함수와 콜백메서드를 적용하여 아이템이 있는 배열을 정렬하면 됩니다.


   //아이템
   var array1=["바나나","참외","사과","수박","더덕","귤","파인애플","도라지"];
   
   //아이템 정렬
   array_sort(array1,sort_filter_func);


아이템 배열을 만들고, 원하는 순서대로 정렬되었는지 확인해봅시다.

위의 코드에서 종류별로 정렬하면, 분류 목록순으로 ["수박","참외","사과","귤","파인애플","바나나","도라지","더덕"]가 됩니다.

 

아이템이 분류 목록에 없는 경우, 먼저 1차로 간단하게 오름차/내림차순으로 정렬합니다.

그러면 글자명순서로 분류되겠죠.

 

다음 2차로 분류 목록 순서대로 다시 분류하면 됩니다.

예를 들어, 분류 목록에 없는 "아이템1", "아이템2" 가 무작위로 있을 때,


   //아이템
   var array1=["바나나","참외","아이템2","사과","수박","아이템1","더덕","귤","파인애플","도라지"];
   
   //1차 오름차/내림차순으로 정렬
   array_sort(array1, true);//1차로 이름을 오름차순으로 정렬. 내림차순은 false.
   
   //2차 분류 목록순으로 다시 정렬
   array_sort(array1, sort_filter_func); //종류별로 분류


위와 같이 하면 먼저 글자순으로 정렬됩니다.

다음 분류에서 배열은 분류 목록순으로 다시 정렬되어 최종적으로 ["아이템1","아이템2","수박","참외","사과","귤","파인애플","바나나","도라지","더덕"]가 될 겁니다.

 

 

 

 

 

 

 

 

 

300x250