데이터 구조 작업
데이터 구조 작업 라이브러리
게임에서는 정보를 정확하고 체계적으로 저장할 필요가 자주 있습니다. 예를 들어, 사용자가 소지한 아이템 목록을 저장하거나 방문해야 할 장소의 그리드를 저장할 수 있습니다. 이를 위해 여러 변수를 사용할 수 있지만, 데이터를 정렬하거나 특정 아이템을 검색하는 등의 복잡한 작업을 수행하려면 많은 코드 블록을 작성해야 하며, 이는 느릴 수 있고 디버깅하기 어렵고 작성하기도 번거롭습니다.
이 문제를 해결하기 위해 GameMaker에는 전문 함수로 접근할 수 있는 여러 내장 데이터 구조가 있습니다. GML Visual을 통해 사용할 수 있는 데이터 구조는 총 네 가지이며, GML을 사용하면 여섯 가지입니다. 각각은 저장하려는 정보의 종류와 나중에 이를 조작하는 방법에 따라 장단점이 있습니다. 네 가지 데이터 구조는 다음과 같습니다:
1. 리스트 (Lists)
리스트는 정보를 순차적으로 저장하는 데이터 구조입니다. 리스트의 인덱스는 0부터 시작하며, 아이템이 추가될 때마다 증가합니다. 리스트의 마지막 위치 외에도 다른 위치에 데이터를 삽입할 수 있습니다. 스택과 달리 언제든지 리스트의 모든 인덱스에서 데이터에 접근할 수 있습니다.
활용 예제
var itemList = ds_list_create();
ds_list_add(itemList, "Health Potion");
ds_list_add(itemList, "Mana Potion");
2. 맵 (Maps)
맵 데이터 구조는 키와 값의 쌍을 저장할 수 있어 매우 유용합니다. 예를 들어, 게임의 캐릭터가 여러 아이템(키)을 가지고 있고, 각 아이템에 대해 개수(값)를 가질 수 있습니다. 맵은 이러한 쌍을 같은 장소에 유지하고, 간단한 함수를 사용하여 맵에 쌍을 추가하고 특정 키에 해당하는 값을 검색할 수 있습니다.
활용 예제
var inventory = ds_map_create();
ds_map_add(inventory, "Health Potion", 10);
ds_map_add(inventory, "Mana Potion", 5);
3. 그리드 (Grids)
그리드는 값의 2차원 배열로, 너비와 높이를 정의하여 총 "셀"의 수를 설정합니다. 이 셀들은 서로 다른 데이터 값을 저장하는 데 사용될 수 있습니다. 그리드의 셀 값은 x(열)와 y(행)의 위치를 지정하여 설정하고 검색할 수 있습니다.
활용 예제
var grid = ds_grid_create(5, 5);
ds_grid_set(grid, 1, 1, "Visited");
var cellValue = ds_grid_get(grid, 1, 1);
4. 스택 (Stacks)
스택은 후입선출(LIFO) 구조입니다. 값을 스택에 추가(push)하고 스택에서 제거(pop) 할 수 있습니다. 스택에 가장 최근에 추가된 값이 가장 먼저 제거됩니다. 스택은 중단되는 작업 처리, 재귀 함수 처리, 간단한 AI 구축 등에 자주 사용됩니다.
활용 예제
var coinStack = ds_stack_create();
ds_stack_push(coinStack, "Coin 1");
ds_stack_push(coinStack, "Coin 2");
var topCoin = ds_stack_pop(coinStack);
데이터 구조 사용 방법
모든 데이터 구조는 동일한 방식으로 작동합니다. 데이터 구조를 생성하고 그 인덱스 값을 변수에 저장한 후, 이 인덱스를 사용하여 추가 기능 호출 시 데이터 구조를 참조합니다. 작업이 끝나면 데이터 구조를 메모리에서 제거하기 위해 파괴해야 합니다. 필요한 만큼 구조를 동시에 사용할 수 있으며, 모든 구조는 문자열과 실제 값을 저장할 수 있습니다.
또한, 데이터 구조는 메모리를 차지하므로 필요하지 않을 때는 항상 파괴하여 메모리 누수를 방지해야 합니다. 메모리 누수는 게임이 느려지거나 결국 충돌하는 원인이 됩니다.
데이터 구조 라이브러리 속성
| 작업 | 설명 |
|---|---|
| Create List | 리스트 생성 |
| Create Map | 맵 생성 |
| Create Grid | 그리드 생성 |
| Create Stack | 스택 생성 |
| Clear Data Structure | 데이터 구조 비우기 |
| Free Data Structure | 데이터 구조 해제 |
| Add To List | 리스트에 추가 |
| Remove From List | 리스트에서 제거 |
| Get List Item At | 리스트 항목 가져오기 |
| Get Index Of List Item | 리스트 항목 인덱스 가져오기 |
| Insert Into List | 리스트에 삽입 |
| Get List Item Count | 리스트 항목 수 가져오기 |
| Set Map Value | 맵 값 설정 |
| Get Map Value | 맵 값 가져오기 |
| Remove Map Entry | 맵 항목 제거 |
| Set Grid Value | 그리드 값 설정 |
| Get Grid Value | 그리드 값 가져오기 |
| Clear Grid | 그리드 비우기 |
| Push Onto Stack | 스택에 추가 |
| Pop Stack | 스택에서 제거 |
| If Data Structure Exists | 데이터 구조가 존재하는지 확인 |
| If Data Structure Empty | 데이터 구조가 비어있는지 확인 |
이 문서가 데이터 구조의 이해와 활용에 도움이 되기를 바랍니다!