본문 바로가기
GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커 강좌-기초][GMS2] 게임 저장 : 맵 데이터 구조체로 암호화 저장

by 타락카얀 2021. 2. 21.
728x90

 

 

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);
   }

 

강좌에서는 간단한 정보만 저장했지만, 응용하기에 따라선 다양한 정보를 저장할 수 있습니다.

 

 

 

 

 

 

 

300x250

댓글