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

[게임메이커 강좌-기초][GMS2]뷰 서피스

by 타락카얀 2023. 1. 21.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 뷰 서피스

 

 

때때로 게임 화면을 화면 전환이나 다른 형태의 이미지로 사용하고 싶을 때가 있죠.

이럴 때 사용할 수 있는 뷰 서피스는 카메라 뷰에서 보이는 화면을 서피스로 활용할 수 있는 기능입니다.

 

(▲ 뷰 서피스를 활용한 화면)

 

서피스로 본뜬 화면에 이펙트를 적용하여 표시하거나 다른 이미지로 쓸 수 있어요.

 

뷰 서피스는 아래 변수에 서피스 ID를 할당하여 사용할 수 있습니다.

 

   ◎ view_surface_id[0~7]

    - 0~7 : 사용할 카메라

 

뷰 서피스는 카메라 뷰당 1개씩, 총 7개까지 설정할 수 있습니다.

 

※ [참고] 뷰 서피스와 비슷한 기능으로 application_surface 내장 전역 변수가 있습니다.

  게임메이커는 기본적으로 게임 화면(Draw GUI 이벤트는 제외)을 서피스에 그려 화면에 표시하는데,

  이 서피스가 application_surface 입니다.

  간단하게 사용하려면 application_surface 를 활용하시면 됩니다.

 

뷰 서피스를 사용하려면 먼저, 사용할 카메라 뷰를 하나를 활성화해야 합니다.

 

(▲ 카메라 뷰 활성화)

 

강좌에서는 카메라 뷰 0번을 활성화 하겠습니다.

 

서피스를 만들기 위해 변수를 추가해줍니다.

 


   //● Create 이벤트
   
   surf = -1;


 

서피스는 처음에 생성해도 됩니다만, 서피스는 휘발성이므로 OS 메모리 관리 및 기타 요인으로 인해

언제든지 메모리에서 제거될 수 있습니다.

따라서 이미지를 표시할 수 있는 [Draw 이벤트]에서 서피스가 존재하는지 확인하고,

서피스가 없는 경우 서피스를 생성하여 카메라 뷰 0에 할당합니다.

 


   //● Draw 이벤트
   
   var vw,vh;
   vw=camera_get_view_width(view_camera[0]);
   vh=camera_get_view_height(view_camera[0]);
   
   if !(surface_exists(surf)){
   surf=surface_create(vw,vh);
   view_surface_id[0]=surf;
   }


 

마지막으로 [Draw GUI 이벤트]에서 뷰 서피스로 얻은 이미지를 표시하면 됩니다.

 


   //● Draw GUI 이벤트
   
   if surface_exists(surf){
   draw_surface_stretched(surf, 0, 0, display_get_gui_width(), display_get_gui_height());
   }


 

 

 

 

 

 

 

 

◈ 예제

 

 

간단하게 화면 전환할 때 사용할 수 있는 페이드 아웃 - 페이드 인 효과를 만들어봅시다.

 

(▲ 페이드 아웃 - 페이드 인)

 

카메라뷰 0번을 활성화합니다.

그리고 오브젝트를 하나 만들고, 서피스 변수를 추가합니다.

 


   //● Create 이벤트
   
   surf_view=-1;//뷰 서피스용
   surf_image=-1;//이펙트로 구성한 다음, 화면에 표시
   
   effect_scale=1;//화면 확대/축소 값
   
   effect_on=0;//화면 전환 스위치 : 1=페이드 아웃, 2=페이드 인


 

[Draw Begin 이벤트]에서 서피스를 생성하도록 합니다.

 


   //● Draw Begin 이벤트
   
   var vw,vh;
   vw=camera_get_view_width(view_camera[0]);
   vh=camera_get_view_height(view_camera[0]);


   if !(surface_exists(surf_view)){
   surf=surface_create(vw,vh);
   view_surface_id[0]=surf_view;
   }
   
   if !(surface_exists(surf_image)){
   surf_image=surface_create(vw+64,vh+64);
   }


 

[Draw GUI 이벤트]에서 서피스화된 뷰서피스를 사용하여 스크린 이펙트를 구성하면 됩니다.

 


   //● Draw GUI 이벤트
   
   var vw,vh;
   vw=camera_get_view_width(view_camera[0]);
   vh=camera_get_view_height(view_camera[0]);
   
   
   //페이드 아웃
   if effect_on==1{effect_scale-=0.01;}
   
   //페이드 인
   if effect_on==2{effect_scale+=0.01;}
   
   effect_scale=max(0,min(effect_scale,1));
   
   var sca;
   sca=max(0.02,effect_scale);
   
   surface_set_target(surf_image);
   draw_clear_alpha(c_black,0);
   draw_surface_ext(surf_view,0,0,sca,sca,0,c_white,1);
   surface_reset_target();
   
   var c;
   c=c_black;draw_rectangle_color(-1,-1,vw+1,vh+1,c,c,c,c,0);//배경
   if effect_scale>0{
   draw_surface_ext(surf_image,0,0,1/sca,1/sca,0,c_white,1);//화면
   }
   
   
   
   //테스트용
   if keyboard_check_pressed(vk_space){effect_on+=1;}
   if effect_on>2{effect_on=0;}


 

effect_on 값이 1일 때, 페이드 아웃 효과를 볼 수 있고, 2일 때는 페이드 인 효과를 볼 수 있습니다.

상황에 따라 값을 변경하면 됩니다.

예제에서는 스페이스 키를 누르면 바로 확인할 수 있어요.

 

 

 

 

 

300x250

댓글