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

[게임메이커 강좌-기초][GMS2] 게임메이커에서 비디오 재생-1 : 기본

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

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 게임메이커에서 비디오 재생

 

게임메이커는 코덱과 함께 제공되지 않으며 게임이 실행되는 OS 플랫폼에 설치되어 있는 코덱을 사용합니다.

즉, 비디오는 게임의 대상 OS 플랫폼에서 디코딩할 수 있는 형식으로 인코딩되어야 합니다.

 

특정 형식을 사용하는 경우 관련 코덱의 라이선스 및 게임 수익에 따라 라이선스 비용을 지불해야 할 수 있으며,

이 경우 코덱 소유자에게 지불해야 하는 모든 수수료에 대한 법적 책임은 개발자에게 있습니다.

코덱도 플랫폼마다 라이선스가 다르기 때문에 여러 플랫폼에 배포되는 게임 개발에 주의가 필요합니다.

 

비디오 형식(예: .mp4, .avi, .mkv 등)은 비디오 및 오디오 스트리밍을 하는 단순한 컨테이너이며,

둘 다 별도로 인코딩해야 될 수 있고 별도의 라이선스가 필요할 수도 있습니다.

 

게임메이커에서 아래 함수를 사용하면 게임내에 비디오을 재생할 수 있습니다.


   ◎ video_open(path) : 비디오 열기
   ◎ video_close( ) : 비디오 제거

   ◎ video_draw( ) : 비디오 상태 배열 반환


 

비디오 재생은 아래의 단계를 거칩니다.

 

   1) 프로젝트의 Included Files(/datafiles 디렉토리)에 비디오 파일을 추가합니다.

       또는, 비디오 파일 경로를 확보합니다.

 

   2) video_open( ) 함수를 사용하여 비디오 파일을 로드합니다.

 

   3) video_draw( )를 사용하여 Draw 이벤트에 그립니다.

         - 이 함수는 비디오을 내부 서피스에 그리고 배열의 일부로 반환합니다.

         - 비디오를 표시하려면 draw_surface( )를 사용하여 해당 서피스를 수동으로 그려야 합니다.

 

   3) 비디오가 끝나면 video_close( )를 호출하여 메모리에서 제거합니다.

 

(▲ 비디오 파일 재생)

 

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

아래 함수를 사용하면 비디오를 게임내에 로드하여 재생합니다.


   ◎ video_open(path) : 비디오 열기

 

이 함수를 사용한다고 해서 바로 비디오가 표시되는 것은 아닙니다.

비디오의 표시는 video_draw( )함수를 통해 별도로 표시할 필요가 있습니다.

 

예)


   video_open("splash.mp4");

 

재생할 지정한 비디오 파일을 로드합니다.

 

다음 함수는 비디오 재생 상태를 배열로 반환하며, 반환된 값으로 비디오를 표시할 수 있습니다.


   ◎ video_draw( ) : 비디오 상태 배열 반환

      - 배열[0] : 데이터 반환 (0 = 문제 없음, -1 = 오류 있음, -2 = 재생 끝)
      - RGBA Videos: 배열[1] 비디오 프레임 서피스
      - YUV Videos : 배열[1] 흑백 서피스, 배열[2] 모든 색상 데이터를 포함하는 채도 서피스


 

 

사용예)


   //Draw 이벤트

    var _data = video_draw();
    var _status = _data[0];

    if (_status == 0)
    {
        var _surface = _data[1];
        
        draw_surface(_surface, x, y);//비디오 표시
    }


 

비디오의 크기가 화면의 크기보다 크더라도 자동으로 맞춰주진 않습니다.

따라서 비디오의 크기(서피스의 크기로 확인)를 확인하고, draw_surface_ext 함수로 리사이징하여 표시해야합니다.

 

예) 화면에 꽉차게 표시(비율 고정 안함)


   //Draw 이벤트


    var _data = video_draw();
    var _status = _data[0];


    if (_status == 0)
    {
        var _surface = _data[1];
        
        var xs=room_width/surface_get_width(_surface);
        var ys=room_height/surface_get_height(_surface);
        
        draw_surface_ext(_surface, 0, 0, xs, ys, 0, c_white, 1);
    }


 

※ 파일 로드시 약간의 딜레이가 발생해 화면에 표시되는 것이 조금 늦을 수 있습니다.

 

 

마지막으로 아래 함수는 비디오가 끝났을 때, 메모리에서 완전히 제거합니다.


   ◎ video_close( ) : 비디오 제거

 


   video_close( )

 

비디오 함수는 비동기 콜백(Async Social 이벤트)을 실행합니다.

 

 

 

 

◈ 비동기 콜백(Async Callbacks)

 

비동기 소셜(Async Social) 이벤트는 async_load 맵의 "type" 키가 지정된 값으로 설정된 아래 주어진 단계에서 트리거됩니다.


   ◎ "video_start": 비디오 재생이 시작되면 상태가 video_status_preparing에서 video_status_playing으로 변경됩니다.

   ◎ "video_end": 비디오이 끝날 때. 비디오가 루프로 설정되어 있으면 트리거되지 않습니다.


 

다음은 비디오 콜백을 수신하는 비동기식 소셜 이벤트의 예입니다.

 

사용예)


   //Async Social 이벤트


   var _type = async_load[? "type"];
   
   if (_type == "video_start"){
       //비디오 시작
   }
   else{
      if (_type == "video_end"){
       //비디오 종료
       video_close( );
      }
   }


 

위의 코드는 async_load 맵에서 유형을 읽습니다.

비디오가 끝나면 video_close( )를 호출하여 메모리에서 비디오를 제거합니다.

 

 

 

 

 

 

 

 

300x250

댓글