본문 바로가기
GameMaker강좌[GMS2]/3D기능강좌

[게임메이커 강좌-3D강좌][GMS2]1인칭 탈출게임-2-이동 설정

by 타락카얀 2018. 7. 31.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

 

이번 강좌에서는 이동 설정을 만들어 보도록 합시다.

 

 

 

   ◈ 이동 설정(obj_cam)



이동은 아래와 같이 카메라의 방향에 따라 이동시켜 봅시다.


(▲ 이동 방향)


강좌에서 이동 키는

   앞으로 이동 : [W] 키
   뒤로 이동 : [S] 키
   왼쪽으로 이동 : [A] 키
   오른쪽으로 이동 : [D] 키

이와 같이 할 것입니다.

다음 고려 해야 할 부분은 이동시 벽과 같은 장애물(Solid 오브젝트) 인식 부분입니다.
아래와 같은 경우지요.

 


(▲ 이동 가능 지역과 이동 불가한 지역)


카메라(플레이어)가 이동할 때 이동이 가능한 경우 그냥 이동시키고, 이동이 불가한 지역은 이동을 못하게

처리해야겠지요.

먼저 앞으로 이동시키는 이벤트를 구성해봅시다.
Solid 오브젝트를 체크할 때는 place_free 함수를 사용하면 됩니다.

 



   place_free(x,y) : 지정한 (x,y)좌표에 Solid 오브젝트가 없는지를 체크하여 Solid 오브젝트가

       있을 경우 false를 반환하고, 있다면 true 를 반환.
 


이 함수로 솔리드 오브젝트를 체크하고, 카메라를 회전해도 일정한 속도로 이동시킬 수 있는
lengthdir_x, lengthdir_y 를 이용해 앞으로 이동시킨다면,

 



   //카메라의 전방은 cam_zang 과 같음. 이동 속도는 2
   var spd,dir;
   spd=2;//이동 속도
   dir=cam_zang;//이동할 방향

   if place_free(x+lengthdir_x(spd,dir),y){x+=lengthdir_x(spd,dir);}
   if place_free(x,y+lengthdir_y(spd,dir)){y+=lengthdir_y(spd,dir);}

 

 

또는,

 



   dir=cam_zang;
   x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
   y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));

 

 

이와 같이 구성할 수 있습니다.

키보드의 키 체크는 아래의 함수로 체크할 수 있습니다.

 



   keyboard_check(key) : 키를 누르고 있을 때
   keyboard_check_pressed(key) : 키를 눌렀을 때
   keyboard_check_released(key) : 키를 눌렀다 떼었을 때

 


이것을 이용하여 이동시키는 이벤트를 구성해봅시다.
카메라 오브젝트(obj_cam)Step 이벤트를 추가합니다.
키를 계속 눌러 이동시켜야 하기 때문에 keyboard_check를 사용하여 아래와 같이 설정할 수 있습니다.

 



   ★ obj_cam - Step 이벤트

   //이동 속도는 2
   var spd,dir;
   spd=2;//이동 속도

   //앞으로 이동
   if keyboard_check(ord("W")){

   dir=cam_zang;
   x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
   y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));
   }

 

 

[W]키를 누르고 있을 때, 카메라의 전방(cam_zang)으로 이동시키는 것입니다.

뒤로 이동하는 것과 왼쪽, 오른쪽으로 이동시키는 것도 추가해봅시다.


(▲ 카메라 방향)


카메라 시점의 전방 기준이 cam_zang 일 때,

   앞: cam_zang
   뒤: cam_zang+180
   좌: cam_zang+90
   우: cam_zang-90

 



   ★ obj_cam - Step 이벤트

   //뒤로 이동
   if keyboard_check(ord("S")){

   dir=cam_zang+180;
   x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
   y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));

   }

   //왼쪽으로 이동
   if keyboard_check(ord("A")){

   dir=cam_zang+90;
   x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
   y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));

   }

   //오른쪽으로 이동
   if keyboard_check(ord("D")){

   dir=cam_zang-90;
   x+=lengthdir_x(spd,dir)*place_free(x+lengthdir_x(spd,dir),y);
   y+=lengthdir_y(spd,dir)*place_free(x,y+lengthdir_y(spd,dir));

   }
 


이동 설정이 모두 끝났습니다.

이제 테스트를 위해 벽(Solid 오브젝트)과 같은 장애물을 만들어 봅시다.

 

 

 

 

   ◈(obj_block, obj_wall32)

 

벽 오브젝트(obj_wall32)를 하나 만들고, 관리하기 쉽도록 parent 오브젝트(obj_block)하나 만들어

벽 오브젝트의 parent 에 지정합시다.

 


(▲ 벽 오브젝트. 32X32 크기)


그리고 벽 오브젝트(obj_wall32)에 충돌 체크를 위한 마스크용으로 스프라이트(32X32)를 지정하고,
solid 를 체크합니다.

 


강좌에서 벽 3D 모델을 만들기 위해서는 아래 강좌의 기본 모델이 필요합니다.
http://kayanworld.tistory.com/210

[Tools][Import Local Package] 로 파일을 열어 추가하시면 됩니다.

 

 


강좌의 벽은 간단하게 draw_3d_block_ext 스크립트를 이용하여 육면체로 만들어 보겠습니다.

 



   draw_3d_block_ext(x1,y1,z1,x2,y2,z2,texid,xrepeat,yrepeat,zrepeat)

      texid : 사용할 텍스처 ID를 지정,
      xrepeat : 텍스쳐를 x 축으로 몇번 반복시킬지를 지정(값은 1이상).
      yrepeat : 텍스쳐를 y 축으로 몇번 반복시킬지를 지정(값은 1이상).
      zrepeat : 텍스쳐를 z 축으로 몇번 반복시킬지를 지정(값은 1이상).

 

 


(▲ 육면체)


텍스쳐로 사용할 이미지를 준비합니다. 강좌에서는 아래의 이미지를 사용해보겠습니다.

 


(▲ 벽으로 사용할 텍스쳐 64X64)


벽 오브젝트(obj_wall32)Draw End 이벤트를 추가하고, 마스크의 크기와 이전 강좌에서 설정한
천장의 높이에 맞게 벽 모델을 만들도록 합니다.
이전 강좌에서 천장의 높이는 32였지요.

마스크는 오브젝트에 지정한 스프라이트 이미지의 크기인 가로 32, 세로32 로 한다면,

 



   ★ obj_wall32 - Draw End 이벤트

   var texid=sprite_get_texture(spr_wall01,0);
   draw_3d_block_ext(x,y,32,x+32,y+32,0,texid,1,1,1);

 

 

이와 같이 할 수 있습니다. 간단하죠.

x,y 좌표는 2D의 충돌 체크 부분을 고려하고, 높이는 천장의 높이나, 원하는 크기로 구성하면 됩니다.

이제 이동이 제대로 이루어지는지 벽 오브젝트를 룸에 배치합시다.

 


(▲ 룸에 벽 오브젝트 및 타일을 배치)


음. 다음 룸으로 이동하는 부분도 만들어 볼까요?


 

 

 

   ◈ 다음 룸으로 이동(obj_goal)

 



다음 룸은 아래와 같이 벽과 같은 형태로 벽에 닿으면 다음 룸으로 이동하는 형태입니다.

 


(▲ 오브젝트에 플레이어가 닿으면 다음 룸으로 이동)


먼저 외형을 구성해보도록 합시다.
간단하게 벽 형태로 구성할 것이기 때문에 벽 오브젝트와 마찬가지로 draw_3d_block_ext 스크립트로
육면체로 만들 것입니다.

 


(▲ 강좌에서 만들 골 포인트)


텍스쳐를 준비하고,

 


(▲ 텍스쳐 64X64)


다음 룸으로 이동할 오브젝트(obj_goal)를 하나 만듭니다. 그리고 벽과 마찬가지, 마스크로 사용할

스프라이트(32X32)만들어 Sprite 란에 지정합니다. 아래와 같이 말이지요.

 


(▲ 오브젝트)

 

골 오브젝트(obj_goal)Draw End 이벤트를 추가하고,  draw_3d_block_ext 스크립트를 이용해

육면체 형태로 표시합니다.

 



   ★ obj_goal - Draw End 이벤트

   var texid=sprite_get_texture(spr_goal_point,0);
   draw_3d_block_ext(x,y,32,x+32,y+32,0,texid,1,1,1);

 

 

이것도 벽 오브젝트와 같이 마스크 충돌을 고려하여 모델의 크기를 맞추시면 됩니다.

 

다음은 이 오브젝트에 플레이어가 닿으면 다음 룸으로 이동하도록 이벤트를 구성할 것입니다.
골 오브젝트(obj_goal) 카메라 오브젝트(obj_cam)와의 충돌 이벤트를 추가합니다.

 



   ★ obj_goal - obj_cam 과의 충돌 이벤트, 또는 obj_player (parent)와의 충돌 이벤트

   if !(room=room_last){room_goto_next( );}

 

 

이것은 카메라 오브젝트가 이 골 오브젝트(obj_goal) 닿게 되면, 현재 룸이 마지막 룸이 아닐 때,

다음 룸으로 이동하게 됩니다. 그리고 다음 룸이 있을 경우에만 작동하겠지요.

지금까지 만든 것을 룸에 배치하고, 테스트 해봅시다.

 


(▲ 테스트 화면)


음. 마우스 포인터가 보이는 군요. 마우스 포인터를 숨기는 것이 좋겠네요.
카메라 오브젝트(obj_cam)Create 이벤트에 아래와 같이 추가해줍니다.

 



   ★ obj_cam - Create 이벤트

   window_set_cursor(cr_none);

 

 

이와 같이 하면 마우스 포인터가 화면에 있을 때, 마우스 포인터를 숨기게 됩니다.




 

   ◈ 안개 기능

 



게임메이커 스튜디오에서는 안개 기능이 지원됩니다. 안개도 추가해봅시다.



(▲ 안개 미적용-왼쪽, 안개 적용-오른쪽)


안개는 아래 함수를 사용하면 안개를 적용할 수 있습니다.

 



   gpu_set_fog(enable, color, start, end)

      enable : 사용. true=사용(1), false=사용안함(0).
      color : 안개 색상
      start : 카메라의 위치를 중심으로 안개를 적용할 시작위치(투명)
      end :  카메라의 위치를 중심으로 안개를 적용할 끝위치(불투명)

 

 

카메라 오브젝트(obj_cam)Create 이벤트에 원하는 형태의 안개를 적용합니다.
강좌에서는 64에서 240까지 적용하고, 안개 색상은 검은색(c_black, $0)으로 하겠습니다.

 



   ★ obj_cam - Create 이벤트

   gpu_set_fog(1,c_black,64,240);

 


이제 원하는 형태로 실행되는지 테스트 해봅시다.


(▲ 테스트 화면)

 

 

 

 

- 예 제 -

 

fps_example01.yyz
0.08MB

 

 

- 실행파일 -

 

fps_example01.zip
다운로드

 

 

 

 

 

 

 

 

300x250

댓글