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

[게임메이커강좌-3D 강좌]간단한 3D 탈출 게임 만들기-1-시점설정

by 타락카얀 2013. 5. 22.
728x90

 

 

 

 

기본적인 3D기능에 대해 알아보았으니, 이번엔 3D 탈출 게임을 한번 만들어 봅시다.

 

 

(▲강좌에서 만들게 될 탈출 게임)



◈ 3D기능의 시작(obj_cam)

 


3D게임을 만들려면 일단 3D기능을 활성화해야합니다.
이 기능은 가장 먼저 실행되어야 하며, 한번만 실행하면 d3d_end()를 사용하지 않는한

계속 활성화됩니다.


먼저 플레이어 오브젝트 하나를 만듭니다. 1인칭 시점이니 강좌에서 이 오브젝트는 카메라로도

사용될 것입니다.


일전에도 말했지만, 오브젝트에서 이벤트가 같더라도 depth값이 높을 수록 먼저 실행됩니다.
먼저 실행되어야 하니 depth값을 높게 설정합시다.
강좌에선 값을 99999정도로 설정하도록 하겠습니다.


그리고 오브젝트에 마스크로 사용할 스프라이트를 지정합니다.(카메라, 플레이어 겸용)

 

 

(▲카메라로도 사용할 오브젝트)


그리고 Create이벤트를 추가하고, control -> Code -> Execute Code액션을 사용하여 코드를

입력합니다.

 



     //obj_cam - Create이벤트

     d3d_start();



다음은 게임을 종료했을 때 3D기능을 해제해야겠지요.
Game End이벤트를 추가하고, 아래 코드를 입력합니다.

 



     //obj_cam - Game End이벤트

     d3d_end();







◈ 카메라 시점(obj_cam)

 


이제 카메라 시점을 설정해봅시다.

시점을 만드려면 아래와 같은 함수를 사용해야합니다.


d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup)

 

 

(▲카메라 시점)

 

일단 이 3D탈출게임은 정면을 바라보는 것이지요.
먼저 게임메이커에선 z축에 대한 변수가 없으므로 z변수를 선언해줍니다.
Create이벤트를 추가하고 변수를 선언합니다.

 

 
     //obj_cam - Create이벤트

     z=0;



이 강좌에서 시점은 일단 수평으로 정면을 향하지요.
그러면 zfrom값과 zto값을 같게 해야겠지요.
z축이 위를 향하기 위해선 (xup,yup,zup)값을 (0,0,1)로 설정해야합니다.

Draw이벤트를 추가하고 아래와 같이 설정합니다.

 



     //obj_cam - Draw이벤트

     _x=x+lengthdir_x(64,direction);
     _y=y+lengthdir_y(64,direction); //direction값으로 시점을 회전함.
     _z=z+16;

     d3d_set_projection(x,y,_z,_x,_y,_z,0,0,1);



이것은 정면을 바라보고, direction의 값에 따라 시점이 바뀌게 됩니다.
방향을 바꿀때마다 시점이 그쪽으로 향하게 되는 것이지요.

 

 

 

 


◈카메라 이동



다음은 카메라를 이동시켜봅시다.
강좌에서는 이동하는 키를

A키 : 왼쪽으로 방향회전
D키 : 오른쪽으로 방향회전
W키 : 앞으로 이동
S키 : 뒤로 이동

이렇게 하도록 해봅시다.

오브젝트 이벤트에서 Keyboard -> Letters -> A키를 선택합니다.
왼쪽으로 방향을 회전하게 하는 것이며 direction변수를 사용하기 때문에

 



     //obj_cam - A키 이벤트

     direction +=5; //5정도의 속도로 회전



이렇게 합니다. 회전하는 값을 높게 하면 좀 더 빨리 회전하겠지요.

마찬가지로 오른쪽 방향도 해봅시다.
오브젝트 이벤트에서 Keyboard -> Letters -> D키를 선택합니다.

 



     //obj_cam - D키 이벤트

     direction -=5; //5정도의 속도로 회전



이제 앞으로 이동하는 것도 해봅시다.
오브젝트 이벤트에서 Keyboard -> Letters -> W키를 선택합니다.

강좌에서는 1의 속도로 이동하도록 하겠습니다.

 



     //obj_cam - W키 이벤트


     //1의 속도로 이동
     x+=lengthdir_x(1,direction)*place_free(x+lengthdir_x(1,direction),y);
     y+=lengthdir_y(1,direction)*place_free(x,y+lengthdir_y(1,direction));

    
     //2의 속도로 이동할 경우

     x+=lengthdir_x(2,direction)*place_free(x+lengthdir_x(2,direction),y);
     y+=lengthdir_y(2,direction)*place_free(x,y+lengthdir_y(2,direction));

    


lengthdir_xlengthdir_y는 회전에 따라 일정한 거리로 이동할 때 사용합니다.
또한 place_free는 이동방향에 Solid로 체크된 오브젝트가 있는 경우 값이 0이 되어
자동적으로 멈추게 하기위해 사용합니다.
예를 들어 벽에 비스듬히 닿으면, 약간 미끄러지듯 이동시킬 수 있습니다.

뒤로 이동하는 것도 해보아요.
오브젝트 이벤트에서 Keyboard -> Letters -> S키를 선택합니다.

 



     //obj_cam - S키 이벤트


     //1의 속도로 이동
     x+=lengthdir_x(1,direction+180)*place_free(x+lengthdir_x(1,direction+180),y);
     y+=lengthdir_y(1,direction+180)*place_free(x,y+lengthdir_y(1,direction+180));

    
     //2의 속도로 이동할 경우

     x+=lengthdir_x(2,direction+180)*place_free(x+lengthdir_x(2,direction+180),y);
     y+=lengthdir_y(2,direction+180)*place_free(x,y+lengthdir_y(2,direction+180));



후아~! 카메라의 시점이 끝났네요.

 

 

 



◈ 3D 바닥, 그리고 테스트(obj_floor)

 


테스트를 위해 3D바닥을 만들고 테스트를 해봅시다.
오브젝트를 하나만들고, 바닥인 d3d_draw_floor를 이용해 그리면 됩니다.

d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat)

먼저 바닥 텍스쳐로 이용할 배경이미지를 준비합니다.

 

 

(▲바닥으로 사용할 이미지)


텍스쳐는 이미지가 배경이미지일경우 background_get_texture로 id를 얻을 수 있습니다.
그리고 텍스쳐의 크기는 가로와 세로의 크기가 같아야하며, 2의 제곱승이어야 합니다.
(예. 2,4,8,16,32,64,128, ...)

바닥을 만드는 김에 천장까지 만들어 봅시다.
Draw이벤트를 추가하고 아래와 같은 코드를 입력합니다.

 



     //obj_floor - Draw이벤트

     draw_set_alpha(1);
     draw_set_color(c_white);//모델의 투명도를 1로 하고 혼합색을 흰색으로 합니다.

     texid=background_get_texture(back_floor);//텍스쳐

     d3d_draw_floor(0,0,0,640,480,0,texid,20,15);//바닥
     d3d_draw_floor(0,0,32,640,480,32,texid,20,15);//천장



위에서 draw_set_color(c_white)로 하는 이유는 3D에서 드로우의 기본값이 검은색이어서
흰색으로 변경해주어야 제대로 표시됩니다.

사용된 오브젝트
obj_cam : 카메라
obj_floor : 바닥, 천장


제대로 되었는지 카메라와 바닥을 배치하고 테스트해봅시다.

 

 

(▲테스트 화면)

 

 

 

300x250

댓글