GAME MAKER 강좌
KAYAN
◈ 맵 데이터 구조체로 암호화 저장하기
이번에는 맵 데이터 구조체 형태로 저장하는 방법에 대해 알아봅시다.
아래 함수를 사용하면 맵 구조체 데이터를 암호화하여 지정한 파일로 저장할 수 있습니다.
◎ ds_map_secure_save(map, filename) : 맵 데이터 구조체를 암호화 저장합니다.
예)
ds_map_secure_save(map, "gamesave.dat"); |
아래 함수를 사용하면 암호화하여 저장한 맵 구조체 데이터를 로드할 수 있습니다.
◎ ds_map_secure_load(filename) : 암호화되어 저장된 맵 데이터 구조체 정보를 로드합니다.
예)
map=ds_map_secure_load("gamesave.dat"); |
이제 게임을 저장할 맵 데이터를 구성해봅시다.
◈ 저장하기
예를 들어 obj_unit 이라는 오브젝트의 정보를 저장한다고 가정해봅시다.
먼저 맵 데이터 구조체를 생성합니다.
var ind_count, inst; ind_count=0; save_map=ds_map_create( ); |
맵 데이터 구조체는 ini 파일 형식과 비슷한 키와 키 값으로 구성됩니다.
맵 데이터 구조체의 데이터 입력할 때는 아래의 함수를 사용합니다.
◎ ds_map_set(id, key, value) : 지정한 키(key) 에 값(value)을 할당합니다.
또는, 배열 형태로 접근할 수 있습니다.
◎ save_map[? key] = value
키 이름은 참조하기 쉽도록 순서에 맞게 구성해야 합니다.
그래야 데이터를 읽을 때 혼선이 없습니다.
이제 저장할 오브젝트의 이름, 좌표, 깊이, 그 외 변수들을 맵에 저장합니다.
예를 들어, obj_unit 오브젝트의 정보를 저장한다고 해봅시다.
//obj unit 오브젝트의 정보를 저장하는 경우 with(obj_unit){ inst="inst_"+string(ind_count);//키 이름을 순서대로 구성 other.save_map[? inst]=object_get_name(object_index);//오브젝트 저장 other.save_map[? inst+"x"]=x; other.save_map[? inst+"y"]=y; other.save_map[? inst+"depth"]=depth; other.save_map[? inst+"hp"]=hp; ind_count+=1; } |
데이터화한 맵 데이터 구조체를 암호화하여 저장합니다.
fname="gamesave.dat"; ds_map_secure_save(save_map,fname); |
마지막으로 맵 데이터 구조체를 파기하면 됩니다.
ds_map_destroy(save_map); |
종합하자면 아래와 같습니다.
예)
var ind_count, inst; ind_count=0; save_map=ds_map_create( ); //----- 저장할 오브젝트 체크 with(obj_unit){ inst="inst_"+string(ind_count); other.save_map[? inst]=object_get_name(object_index);//오브젝트 저장 other.save_map[? inst+"x"]=x; other.save_map[? inst+"y"]=y; other.save_map[? inst+"depth"]=depth; other.save_map[? inst+"hp"]=hp; ind_count+=1;} //----- 저장할 오브젝트 체크 fname="gamesave.dat"; ds_map_secure_save(save_map, fname); ds_map_destroy(save_map); |
◈ 불러오기
이제 저장했던 맵 데이터 구조체 정보를 로드해봅시다.
먼저 로드할 파일이 있는지 체크하고, 맵 데이터 구조체를 생성합니다.
fname="gamesave.dat"; if file_exists(fname){ load_map=ds_map_create( ); //이벤트// } |
다음은 암호화하여 저장된 맵 데이터 구조체를 로드합니다.
fname="gamesave.dat"; if file_exists(fname){ load_map=ds_map_create( ); load_map=ds_map_secure_load(fname); //◀ 맵 데이터 구조체 불러오기 //이벤트// } |
이제 이벤트 내용을 구성해봅시다.
먼저 저장했던 오브젝트들과 중복 방지를 위해 룸 안에 있는 오브젝트를 클리어합니다.
//룸 안에 있는 오브젝트 클리어(저장했던 오브젝트들과 중복 방지) if !(ds_map_empty(load_map)){with(obj_unit){instance_destroy( );}} |
다음은 로드한 데이터를 저장했던 키와 순서대로 적용합니다.
//데이터 적용하기 var ind_count, inst, obj; ind_count=0; while(1){ inst="inst_"+string(ind_count); if !(ds_map_exists(load_map,inst)){break;} //저장한 오브젝트가 없으면 종료(저장파일 로드 실패와 같음) else{ obj=asset_get_index(load_map[? inst]); //생성할 오브젝트 체크 if obj<0{continue;} //키와 값은 저장되었지만, 오브젝트 리소스가 현재 없으면 패스 //----- 데이터 로드 var it, _x, _y, _depth; _x=load_map[? inst+"x"]; _y=load_map[? inst+"y"]; _depth=load_map[? inst+"depth"]; it=instance_create_depth(_x,_y,_depth,obj); //새로 생성하기 it.hp=load_map[? inst+"hp"]; //----- 데이터 로드 } ind_count+=1; } |
데이터를 모두 적용했다면, 맵 데이터 구조체를 파기하도록 합니다.
ds_map_destroy(load_map); |
종합하자면 아래와 같습니다.
fname="gamesave.dat"; if file_exists(fname){ load_map=ds_map_create(); load_map=ds_map_secure_load(fname); //룸 안에 있는 오브젝트 클리어(저장했던 오브젝트들과 중복 방지) if !(ds_map_empty(load_map)){with(obj_unit){instance_destroy();}} //데이터 적용하기 var ind_count, inst, obj; ind_count=0; while(1){ inst="inst_"+string(ind_count); if !(ds_map_exists(load_map,inst)){break;} else{ obj=asset_get_index(load_map[? inst]);//생성할 오브젝트 체크 if obj<0{ continue; }//키와 값은 저장되었지만, 오브젝트 리소스가 현재 없으면 패스 //----- 데이터 로드 var it, _x, _y, _depth; _x=load_map[? inst+"x"]; _y=load_map[? inst+"y"]; _depth=load_map[? inst+"depth"]; it=instance_create_depth(_x,_y,_depth,obj);//새로 생성하기 it.hp=load_map[? inst+"hp"]; //----- 데이터 로드 } ind_count+=1; } ds_map_destroy(load_map); } |
강좌에서는 간단한 정보만 저장했지만, 응용하기에 따라선 다양한 정보를 저장할 수 있습니다.
'GameMaker강좌[GMS2] > GMS2기초강좌' 카테고리의 다른 글
[게임메이커 강좌-기초][GMS2] enum : 열거형 데이터 타입 (2) | 2021.03.16 |
---|---|
[게임메이커 강좌-기초][GMS2] 게임 저장 : 베이스64(Base64)로 암호화 저장 (0) | 2021.02.23 |
[게임메이커 강좌-기초][GMS2] 게임 저장 : ini 저장 (0) | 2021.02.20 |
[게임메이커 강좌-기초][GMS2] 게임 저장 : 기본 기능 (0) | 2021.02.20 |
[게임메이커 강좌-기초][GMS2] 코드로 타일 배치-3 : 레이어에서 타일맵 찾기 (0) | 2021.02.16 |
댓글