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); |
이제 원하는 형태로 실행되는지 테스트 해봅시다.
(▲ 테스트 화면)
- 예 제 -
- 실행파일 -
'GameMaker강좌[GMS2] > 3D기능강좌' 카테고리의 다른 글
[게임메이커 강좌-3D강좌][GMS2] 3D 멀티뷰 (6) | 2021.10.17 |
---|---|
[게임메이커 강좌-3D강좌][GMS2]1인칭 탈출게임-1-시점 설정 (6) | 2018.07.30 |
[게임메이커 강좌-3D강좌][GMS2]3D 기본 모델 (0) | 2018.07.21 |
[게임메이커 강좌-3D강좌][GMS2]3D의 시작-2 (0) | 2018.07.20 |
[게임메이커 강좌-3D강좌][GMS2]3D의 시작-1 (3) | 2018.07.19 |
댓글