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

[게임메이커 강좌-기초][GMS2] GIF 이미지 저장 기능

by 타락카얀 2024. 3. 21.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

◈ GIF 이미지 저장 기능

 

게임메이커에서는 완벽하지는 않지만, 간단하게 GIF 이미지 파일을 구성할 수 있는 기능이 있습니다.

GIF 이미지는 색상수가 256 색상(Universal 884 Palette)으로 제한되지만 간단한 짤방 정도는 만들 수 있지요.

(▲ GIF 이미지)

 

아래는 GIF 이미지 구성시 사용할 수 있는 함수들입니다.


   ◎ gif_open(width, height);
   ◎ gif_add_surface(gif_index, surface, delay_time, [xoffset], [yoffset]);
   ◎ gif_save(gif_index, fname);


 

이 기능을 사용하기 위해서는 서피스로부터 이미지를 추가해야하기 떄문에 서피스 기능을 같이 사용해야 합니다.

GIF 구성은 기본적으로 아래와 같이 3 단계로 나뉩니다.


   1) gif_open(...) //GIF 이미지의 크기를 설정 및 GIF ID를 반환

   2) gif_add_surface(...) //GIF 에 서피스로부터 프레임 이미지를 추가

   3) gif_save(...) //모두 추가했다면 파일로 저장


 

일단 함수에 대해 알아봅시다.

먼저 아래 함수로 GIF 형식의 이미지 구성을 시작할 수 있습니다.


   ◎ gif_open(width, height)

      - width : gif 의 너비

      - height : gif 의 높이


 

함수를 호출 할 때 GIF 이미지의 너비와 높이를 제공하면 함수는 GIF 이미지를 구성할 수 있는 GIF ID 를 반환합니다.

GIF 크기는 제한이 없지만, 값이 클 수록 GIF 구성이 느려지거나 사용 가능한 메모리에 비해 너무 큰 경우 오류가 발생할 수 있습니다.

 

참고로 게임메이커의 GIF 이미지는 투명도, 또는 투명색 지원이 없습니다.

기본적으로 뒷 배경(투명한 부분이 노출될 경우)을 검은색으로 불투명 처리하는데, 다른 배경색을 원한다면 서피스 구성시 원하는 배경을 뒤에 깔아주면 됩니다.

 

다음 함수는 GIF 이미지에 프레임을 추가할 수 있는 함수입니다.


   ◎ gif_add_surface(gif_index, surface, delay_time, [xoffset], [yoffset], [quantization] )

      - gif_index : 서피스 데이터를 추가할 gif ID
      - surface : 프레임으로 추가하는데 사용할 서피스 ID
      - delay_time : 프레임의 지연 시간 (100 분의 1 초)

      - [xoffset] : [선택 사항] 추가 할 서피스의 X축 오프셋
      - [yoffset] : [선택 사항] 추가 할 서피스의 Y축 오프셋

      - [quantization] : [선택 사항] 0에서 3까지의 양자화 양
                          (최저 품질 0, 최고 품질 3, 기본값은 2)


 

gif_open으로부터 반환된 GIF ID에 프레임을 추가할 서피스를 지정합니다.

delay_time 은 프레임의 지연시간(1/100)을 지정합니다.

현재 프레임이 다음 프레임으로 넘어가는 시간으로 값이 클 수록 느려지고, 작을 수록 빨라집니다.

소수점도 가능하나 브라우저에 따라 다르기 때문에 정수로 지정(최소 단위 1~)하는 것이 좋습니다.

게이메이커에서 아래와 같이 설정하시면 될 거에요.


   delay_time=round(100/게임속도)*지연시간

   //게임속도가 60, 지연시간 없이 게임속도에 맞출 경우
   delay_time=round(100/60);


 

[xoffset], [yoffset] 는 선택 사항으로 프레임으로 추가할 서피스의 위치를 지정합니다.

값을 지정하지 않으면 자동으로 (0,0)으로 부터 추가합니다.

[quantization] 는 선택 사항으로 GIF 품질을 지정합니다.

값이 작으면 저품질로, 클 수록 품질이 향상됩니다만, 결과 퀄리티를 보면... 값을 변경하는 것을 별로 권장하지는 않습니다.

기본 값은 2로 설정되어있습니다.

 

 

마지막으로 모든 프레임이 추가되었다면 아래 함수로 GIF 파일로 저장할 수 있습니다.


   ◎ gif_save(gif_index, fname)
      - gif_index : 저장할 gif ID
      - fname : gif 로 저장할 파일 이름(확장자 포함)


 

파일로 저장할 GIF ID와 파일명을 지정하면 됩니다.

 

사용예)


   //Create 이벤트

   count = 0; //프레임 카운트
   save_gif = false; //true면 GIF 구성시작


   //GIF 구성 이벤트
   if save_gif == true //GIF 저장 체크
   {


   if count == 0{ //GIF 구성 시작
       gif_image = gif_open(room_width, room_height);//GIF 구성 호출
       }
   else{
      if count < 30{
       gif_add_surface(gif_image, application_surface, round(100/60));//프레임 추가
      }
       else{
       gif_save(gif_image, "GameCapture.gif");//파일 저장
      count = 0;
       save_gif = false;
      }
       }
   count++;//프레임 카운트
   }


 

먼저 gif_open를 호출해 룸의 크기만큼 GIF 를 만들 준비를 합니다.

다음 count 수가 30(프레임) 미만일 때 gif_add_surface함수로 GIF 프레임을 추가하고 count 를 1더해줍니다.

count가 30(프레임) 이 되었다면 gif_save 함수를 호출해 파일로 저장합니다.

 

 

 

추가로 아래 함수는 gif_open 함수로 구성한 GIF 이미지를 게임메이커 버퍼에 저장할 수 있는 함수입니다.


   ◎ gif_save_buffer(gif_index) //GIF를 버퍼로 저장
      - gif_index : 저장할 gif ID

   ◎ buffer_save(buffer,fname) //버퍼를 파일로 저장


 

gif_save_buffer 함수는 GIF 데이터를 1 바이트로 정렬된 증가 버퍼(grow buffer)로 저장합니다.

이후에 버퍼를 삭제하지 않는 한, buffer_save(buffer,fname) 함수를 사용하여 GIF 파일로 다시 저장할 수 있습니다.


   global.capture_buff = gif_save_buffer(gif_image);


   buffer_save(global.capture_buff, "GameCapture.gif");


 

 

 

 

 

 

 

 

 

 

300x250

댓글