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

[게임메이커강좌-3D 강좌]3D 플랫폼 게임 만들기-1-시점 설정

by 타락카얀 2013. 8. 12.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

이번 강좌는 아래와 같은 3D 플랫폼 게임을 만들어 보도록 하겠습니다.

 

 

(▲ 강좌에서 만들어 보게될 플랫폼 게임)


위의 스샷을 보시듯 어떤 게임을 만들게 될지 감이 오시죠.
일반적인 3D 시점은 z축이 위로 향한 시점이었죠.
강좌에서 게임은 시점이 y축 위로 향한 시스템으로, 2D게임처럼 제작할 수 있도록 만들 것입니다.
2D게임과 같은 평면 좌표(x,y)를 위주로 사용할 것입니다.
이 시스템은 2D를 제작하셨던 분들은 시점만 구성하면, 중력이나 충돌 이벤트등이 2D에서의 설정들이
대부분 같기 때문에, 쉽게 제작할 수 있다는 이점이 있습니다. 굳!


하지만 3D는 3D!
2D와는 달리 여러가지 설정들이 필요합니다.
이제 강좌를 시작해봅시다.

 





 

 

 

 

 

◈시점 구성(obj_cam)

 


먼저 카메라용 오브젝트(obj_cam)를 하나 만듭니다.

 

 

(▲3D 카메라)


그리고 다른 오브젝트보다 이벤트들을 먼저 실행시키기 위해 depth를 높게 설정해줍시다.
여기선 한 99999정도로 해보겠습니다.


3D의 기능을 활성화하기 위해 Game Start 이벤트를 추가하고, 아래와 같은 코드를 입력합니다.

 



     ★ obj_cam - Game Start 이벤트

     d3d_start();



이전 강좌에선 Create이벤트에서 활성화시켰지요.
Create 이벤트Game Start이벤트 어느쪽에서 실행시켜도 됩니다만, 여기선 이벤트를 구분하기

쉽도록 분리하도록 해요.
Game Start 이벤트는 게임을 시작했을 때, 게임을 재시작했을 때만 실행되는 이벤트입니다.
어차피 3D 활성화는 1번만 실행해도 게임이 종료될 때까지 유지 되기 때문에, 어디에서든 1번정도

실행시키면 됩니다.



이제 게임을 종료했을 때 3D기능을 종료해야겠지요. Game End 이벤트를 추가합니다.

 



     ★ obj_cam - Game End이벤트

     d3d_end();



이제 시점을 설정해봅시다.
먼저 시점에 필요한 변수들을 Create 이벤트에서 선언합니다.

 



     ★ obj_cam - Create 이벤트

     cam_dis=300;//맵을 화면에 표시하기 위한 카메라와 맵과의 거리
     cam_height=100;//카메라 높이. y축 위치에서 약간 내려다 봄.



이것은 카메라의 위치를 조정할 변수를 선언한 것입니다.

이 게임은 카메라 오브젝트와 플레이어 오브젝트를 분리할 것입니다.

그래서 플레이어 오브젝트를 카메라가 따라다니는 형식으로 만들게 될거에요.

2D로 치자면 뷰에 해당합니다.

본격적으로 시점을 만들기 위해 필요한 플레이어 오브젝트(obj_player) 뒷 배경을 표시할

오브젝트(obj_map1) 각각 만들도록 해요.

 

 

(▲플레이어 오브젝트)


16X16 크기의 스프라이트를 하나 만들고 플레이어 오브젝트(obj_player)Sprite에 지정합니다.
이것은 화면에 표시할 것은 아니고, 마스크와 룸에 배치할 때 식별이 가능하게 하기 위해
지정하는 것입니다.

 

(▲배경 전용 오브젝트)


이 오브젝트의 depth를 다른 모델용 오브젝트보다 약간 낮게 설정하도록 해요.
3D에서 투명도가 있는 모델 때문에 모델 일부분이 표시되지 않게 되어서, 뒷 배경이 되는 모델들은

후순위로 처리해야 모델이 제대로 표시되기 때문입니다.
강좌에선 간단하게 -1값을 넣겠습니다.


그리고 다시 카메라 오브젝트(obj_cam)로 이동해서 Create 이벤트에 아래와 같이 추가해주세요.

 



     ★ obj_cam - Create 이벤트

     with(obj_player){

     other.x=x;
     other.y=y;
     }


이것은 카메라가 생성되었을 때 플레이어가 있다면 카메라를 플레이어 좌표로 이동시키는 것입니다.

다음은 Step이벤트를 추가하고, 카메라(obj_cam)가 플레이어(obj_player) 좌표를 따라 다니게 만듭시다.

 



★ obj_cam - Step 이벤트

     with(obj_player){

     other.x=x;
     other.y=y;
     }




이제 시점을 표시해야겠지요.
이전 강좌에서도 해보았지만, 3D 시점을 만드려면 아래와 같은 함수를 사용해야합니다.


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

 

(▲3D의 시점)


하지만 이전과는 달리 이 게임은 2D 화면 처럼 y좌표가 위로 향해야합니다.
2D에서 y좌표는 위로 갈수록 -값이지요.
따라서 (xup,yup,zup)은 (0,-1,0)이 되어야 합니다.

카메라 오브젝트(obj_cam)Draw 이벤트를 추가하고 다음과 같이 작성합니다.

 



     ★ obj_cam - Draw 이벤트

     if instance_exists(obj_player){
     with(obj_player){d3d_set_projection(x,y-other.cam_height,other.cam_dis,x,y,0,0,-1,0);}
     }
     else{
     d3d_set_projection(x,y-cam_height,cam_dis,x,y,0,0,-1,0);
     }



이것은 플레이어 오브젝트(obj_player)가 있을 때는 카메라(obj_cam)의 좌표를 플레이어의 좌표로
이동시켜 따라다니게 하고, 플레어어가 없을 때는 카메라의 자신의 좌표에 머물러 있게 하는 것입니다.

시점에 대한 설정은 끝났네요.
다음은 뒷배경에 대해 설정해봅시다.






◈뒷 배경(obj_map1)

 


일단 배경 오브젝트(obj_map1)는 이미 시점 설정때 만들었으니 그 오브젝트에 이벤트를 작성해봅시다.

 

 

(▲게임 배경)


뒷배경은 위 스샷처럼 아래쪽에 바닥이 있는 간단한 타일로 구성할거에요.
음. 여러분이 구상한대로 만드시면 됩니다.

먼저 배경을 구성할 텍스쳐 이미지를 준비하고, Background로 추가합니다.

 

 

(▲배경에 사용될 텍스쳐 이미지)

 

 

(▲뒷 배경 텍스쳐. back_backtile)

 

 

(▲바닥 배경 텍스쳐. back_floor)

 

배경 오브젝트(obj_map1)로 이동해서 Create이벤트를 추가하고 텍스쳐를 변수에 할당합니다.

 



    ★ obj_map1 - Create 이벤트

     background_color=c_black;//룸 배경 색

     back_texid=background_get_texture(back_backtile);//뒷 배경
     floor_texid=background_get_texture(back_floor);//바닥



여러분이 준비한 배경 이미지를 텍스쳐로 전환시켜야 모델에 적용할 수 있습니다.

다음은 Draw 이벤트를 추가하고 모델을 표시하도록 합니다.

 



 

     ★ obj_map1 - Draw 이벤트

     draw_set_alpha(1);
     draw_set_color(c_white);

     //바닥
     d3d_transform_add_rotation_x(-90);
     d3d_transform_add_translation(0,room_height,0);


     d3d_draw_floor(0,-16,0,floor(room_width/32)*32,16,0,floor_texid,floor(room_width/32),1);


     d3d_transform_set_identity();






     //뒷 배경
     d3d_transform_add_translation(0,0,-16);


     d3d_draw_floor(0,0,0,floor(room_width/32)*32,room_height,0,back_texid,

     floor(room_width/32),floor(room_height/32));

     d3d_transform_set_identity();



뒷 배경은 룸 크기만큼만 표시하고, 바닥은 룸의 맨 아래쪽에 표시하도록 합니다.

     d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat)//바닥을 그릴때 사용하는 모델

텍스쳐를 루프시키고자 한다면 hrepeatvrepeat 인자부분에 각각 루프시킬만큼 값을 넣으시면

됩니다.
강좌에선 룸의 넓이와 높이에 텍스쳐 이미지의 크기대로 루프시켰습니다.

일단 테스트를 위해 룸을 하나 만들고, 카메라 오브젝트(obj_cam)와 배경오브젝트(obj_map1),

플레이어 오브젝트(obj_player)를 배치하시고, 어떤 모습으로 되는지 확인해봅시다.
어차피 플레이어 오브젝트는 아무런 설정을 하지 않았기 때문에 배경부분만 확인하시면 됩니다.

 

 

 

 

 



◈플레이어(obj_player)

 


이제 플레이어(obj_player)의 설정을 해봅시다.
먼저 마스크로 사용할 이미지를 준비하고, 스프라이트에 추가합니다.

 

 

(▲룸에 배치시 식별, 마스크로 사용할 스프라이트)


강좌에선 16X16크기의 이미지를 준비했고, 중심점은 가운데 맞추었습니다.
플레이어 오브젝트(obj_player)Sprite에 마스크로 준비한 스프라이트를 지정해줍니다.

그리고 플레이어에 사용할 텍스쳐이미지들을 준비하고, background에 추가하도록 해요.

 

 

(▲플레이어 16 X 16 크기의 텍스쳐)


이 텍스쳐 이미지는 아래와 같은 모델에 사용될 거에요.

 

 

(▲플레이어 모델)


강좌이기 때문에 간단한 이미지를 준비했지만, 여러분은 구상하신대로 준비하시면 됩니다.
육면체이기 때문에 6개의 이미지를 준비하시면 되겠죠. 헤헤~

일단 플레이어 오브젝트(obj_player)Create 이벤트를 추가하고, 필요한 변수와 텍스쳐를 변수에

할당하도록 해요.

 



 

     ★ obj_player -  Create 이벤트

     pspeed=2;//이동 속도
     xdir=1;//방향. -1은 왼쪽, 1은 오른쪽

     texid=background_get_texture(back_player);//왼쪽 오른쪽을 제외한 텍스쳐
     texid2=background_get_texture(back_player_left);//왼쪽면(90도 방향의 면)
     texid3=background_get_texture(back_player_right);//오른쪽면(270도 방향의 면)



다음은 플랫폼게임 답게 중력 설정이 있어야 겠지요.
Step 이벤트를 추가하고 중력에 대한 설정을 작성하도록 해요.

 



     ★ obj_player -  Step 이벤트

     if place_free(x,y+1){gravity=0.3;gravity_direction=270;}
     else{gravity=0;gravity_direction=270;}//중력 설정

     if vspeed>=8{vspeed=8;}//아래로 하강하는 속도가 8보다 크면 8값으로 유지하도록 설정



이렇게 하면 플레이어 아래쪽에 솔리드로 체크된 오브젝트가 있을때 멈추고,
아래쪽에 솔리드가 체크된 오브젝트가 없을때는 아래쪽(270방향)으로 떨어지게 됩니다.

이제 이동에 대한 설정을 만들어 봅시다.
Step 이벤트에 아래와 같이 내용을 추가해줍니다.

 



 

     ★ obj_player -  Step 이벤트

     if keyboard_check(vk_left){//왼쪽으로 이동
     xdir=-1;
     x-=pspeed*place_free(x-pspeed,y);
     }

     if keyboard_check(vk_right){//오른쪽으로 이동
     xdir=1;
     x+=pspeed*place_free(x+pspeed,y);
     }

     if keyboard_check_pressed(vk_up){
     if !(place_free(x,y+1)){vspeed=-8;}//점프
     }

     if y>room_height{instance_destroy();}//룸 밖으로 나갔을 때 파기함



     x-=pspeed*place_free(x-pspeed,y)

이것은 x방향으로 이동시 솔리드 오브젝트를 만나면 이동하지 않게 설정하는 것입니다.
솔리드 오브젝트가 있을 때 place_free의 값은 0을 반환하여 pspeed X 0 이기 때문에 더이상

이동하지 않게 되는 것이죠.

만약 비어있다면 place_free의 값은 1을 반환하여 pspeed X 1 이기 때문에 이동속도만큼 이동하게

됩니다.

 



     ★ obj_player -  Draw 이벤트

     draw_set_alpha(1);
     draw_set_color(c_white);

     d3d_transform_add_rotation_x(-90);//x축을 기준으로 회전시킴

     d3d_transform_add_scaling(xdir,1,1);//방향에 따라 모델을 스케일링시킴.
     d3d_transform_add_translation(x,y,0);
     d3d_draw_floor(-8,-8,8,8,8,8,texid,1,1);//상단면
     d3d_draw_floor(8,-8,-8,-8,8,-8,texid,1,1);//하단면

     d3d_draw_wall(-8,-8,8,-8,8,-8,texid,1,1);//뒷면(180 방향)
     d3d_draw_wall(8,8,8,8,-8,-8,texid,1,1);//정면(0 방향)

     d3d_draw_wall(8,-8,8,-8,-8,-8,texid2,1,1);//왼쪽면(90 방향)
     d3d_draw_wall(-8,8,8,8,8,-8,texid3,1,1);//오른쪽면(270 방향)
     d3d_transform_set_identity();



조금 복잡해보이지요.
면마다 모델을 조합하여 적용했고, 모델의 사이즈는 텍스쳐 크기에 맞추었습니다.
이 모델에 대한 설정은 다음과 같습니다.

 

 

(▲일반적인 모델 모습)


위의 모습은 일반적인 모습으로 d3d_transform_add_rotation_x를 적용하지 않았을 때 모습입니다.

 

 

(▲회전 방향)


d3d_transform_add_rotation_x를 적용하면 x축을 기준으로 회전하게 되는데, 이것을 적용하면

 

 

(▲회전이 적용된 모습)


이렇게 회전하게 됩니다.
회전 함수는 모델을 표시하기전에 적용해야 제대로 표시됩니다. (x, y, z)에서 (x, y) 2D 평면에 맞춘

형태이지요.
모델을 그릴때 이런식으로 그릴 수 있지만, 바로 평면기준으로 모델을 조합해 만들 수도 있습니다.
저는 간단하게 회전시키는 방법을 사용했습니다만, 개인마다 취향이 있기 때문에 여러분이 편하신

방법대로 만드시면 됩니다.


 

 



◈ 블럭(obj_block,obj_bl)

 


이제 블럭을 만들어 봅시다.
먼저 마스크용으로 사용할 스프라이트를 하나 만듭니다.

 

 

(▲룸에 배치시 식별, 마스크로 사용할 스프라이트)


크기는 32X32크기이고, 중심점은 배치하기 편하도록 (0,0)에 맞추었습니다.
참고로 모델도 이 마스크 기준으로 맞추어 만들어야 합니다.
그래야 플레이어의 블럭 체킹이 정확하게 됩니다.

다음은 parent로 사용할 오브젝트(obj_block)를 만들고, 하위 오브젝트(obj_bl)를 만듭니다.

 

 

(▲ 블럭 오브젝트)


     obj_block(parent 오브젝트) - obj_bl(실제 배치되는 하위 오브젝트)

하위 오브젝트(obj_bl)parent를 지정(obj_bl)하고, Sprite에는 이전에 준비한 마스크용 스프라이트를

지정해줍니다.
그리고 오브젝트에 Solid를 체크하도록 해요.

이제 블럭에 모델을 적용해볼까요.

 

 

(▲블럭)


모델의 위의 스샷처럼 2가지 텍스쳐를 입힐 것입니다.
플레이어 설정을 했기 때문에 대충 감이 오시죠. 헤헤~!
텍스쳐로 사용할 2가지 이미지(상단면, 옆면)를 준비하고, background로 추가합니다.

 

 

(▲텍스쳐로 사용할 이미지)


강좌에선 32 X 32크기의 이미지를 준비했습니다.

하위 오브젝트(obj_bl)를 선택해 Create 이벤트를 추가하고, 변수에 텍스쳐를 할당하도록 합니다.

 





     ★ obj_bl - Create 이벤트

     texid=background_get_texture(back_block_wall);//옆면 텍스쳐
     texid2=background_get_texture(back_block_floor);//상단면 텍스쳐



이제 모델을 표시하도록 해야겠지요.
Draw 이벤트를 추가하고 아래와 같이 작성합니다.

 





     ★ obj_bl - Draw 이벤트

     draw_set_alpha(1);
     draw_set_color(c_white);

     d3d_transform_add_rotation_x(-90);
     d3d_transform_add_translation(x,y,0);
     d3d_draw_floor(0,-16,0,32,16,0,texid2,1,1);//상단면
     d3d_draw_floor(32,-16,-32,0,16,-32,texid2,1,1);//하단면

     d3d_draw_wall(0,-16,0,0,16,-32,texid,1,1);//뒷면(180 방향)
     d3d_draw_wall(32,16,0,32,-16,-32,texid,1,1);//정면(0 방향)

     d3d_draw_wall(32,-16,0,0,-16,-32,texid,1,1);//왼쪽면(90 방향)
     d3d_draw_wall(0,16,0,32,16,-32,texid,1,1);//오른쪽면(270 방향)

     d3d_transform_set_identity();



엇! 플레이어 모델과 비슷하군요.
넵. 같은 모델입니다.
모델의 사이즈와 텍스쳐가 다를뿐, 같은 모델입니다.
모델을 그리고, x축을 기준으로 회전시켰지요.

이제 플레이어 오브젝트(obj_player)로 이동해서 이 블럭과의 충돌 체크를 해야겠지요.
플레이어 오브젝트(obj_player)에 블럭의 parent(obj_block)와의 충돌 이벤트를 추가하고,
아래와 같이 작성합니다.

 





     ★ obj_playerl - obj_block과의 충돌 이벤트

     vspeed=0;
     move_contact_solid(270,8);



간단하죠?
블럭과 충돌하면 아래로 더 떨어지지 못하게 하고 vspeed를 0로 만들고,
이 때 1픽셀정도 뜰 수 있기 때문에 move_contact_solid로 붙여주게 하는 것입니다.

룸에 블럭을 배치하고, 테스트 해봅시다.

음. 플레이어의 그림자가 없으니, 어느정도 위치인지 모르겠군요.
그럼 그림자를 추가해볼까요.






◈ 그림자(obj_map1)

 


플레이어의 그림자를 추가해볼까요.
배경 오브젝트(obj_map1)로 이동하여 Draw 이벤트에 아래와 같이 추가 작성합시다.

 



 

     ★ obj_map1 - Draw 이벤트

     with(obj_player){
     var _y,_dis;
     _y=10000;
     _dis=10000;

     with(obj_block){
     if !(collision_rectangle(other.bbox_left,other.y,other.bbox_right,other.y+10000,id,1,0)=noone){
     if distance_to_object(other)<=_dis{_y=bbox_top;_dis=distance_to_object(other);}}
     }
     draw_set_alpha(0.6);
     d3d_transform_add_rotation_x(-90);
     d3d_transform_add_translation(x,_y-1,0);
     c=c_black;draw_rectangle_color(-8,-8,8,8,c,c,c,c,0);
     d3d_transform_set_identity();
     draw_set_alpha(1);
     }



이것은 플레이어의 x좌표 아래서 플레이어에 충돌할 수 있는 가장 가까운 블럭 오브젝트를 찾고,
그 블럭오브젝트 위에 플레이어의 그림자를 표시하는 것입니다.

오웃! 그림자도 간단하게 되었네요. 굳!
다시한번 테스트 해봅시다.

음. 플레이어가 파기될때 이펙트가 없으니 밋밋하군요.
이펙트라도 발생시키고, 게임을 재시작시켜봅시다.



 

 



◈ 플레이어 파기 이펙트(obj_effect)

 


이펙트로 사용할 오브젝트(obj_effect)를 만들어요.

 

 

(▲이펙트 오브젝트)


그리고 텍스쳐로 사용할 이미지를 준비하고, background에 추가하도록 합니다.

 

 

(▲이펙트용 텍스쳐 이미지)


강좌에선 간단하게 동그란 흰원을 준비했습니다.
이펙트 오브젝트(obj_effect)Create 이벤트를 추가하고, 필요한 변수들을 선언해줍니다.

 



     ★ obj_effect - Create 이벤트

     alp=1;//투명도
     fade_spd=0.05;//투명도 속도
     rot=0;//회전
     rot_spd=0;//회전 속도
     col=c_white;//혼합색
     sca=1;//확대/축소

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



여러가지 설정을 해주기 위해 다양한 변수들을 선언해주었습니다.
Draw 이벤트를 추가하고, 모델을 표시하도록 해요.

 



 

     ★ obj_effect - Draw 이벤트

     draw_set_alpha(alp);
     draw_set_color(col);
     d3d_transform_add_rotation_z(rot);
     d3d_transform_add_scaling(sca,sca,sca);
     d3d_transform_add_translation(x,y,0);
     d3d_draw_floor(-16,16,0,16,-16,0,texid,1,1);
     d3d_transform_set_identity();
     draw_set_alpha(1);



간단하게 바닥용 모델을 사용하여 표시하도록 했습니다.
이제 Step 이벤트에 이전에 설정한 변수를 조절해보도록 합시다.

 



     ★ obj_effect - Draw 이벤트

     if alp>0{alp-=fade_spd;}else{instance_destroy();}



이것은 투명도가 0이 되면 이펙트를 파기하는 것입니다.

이제 이펙트를 플레이어 오브젝트(obj_player)Destroy 이벤트에서 생성하시면 됩니다.
플레이어 오브젝트(obj_player)Destroy 이벤트를 추가하고, 아래와 같이 이펙트를 생성하시면

됩니다.

 



 

     ★ obj_player - Destroy 이벤트

     i=1;repeat(10){
     aa=instance_create(x,y,obj_effect);
     aa.depth=depth-i;
     with(aa){
     direction=irandom(360);
     speed=random_range(2,6);
     friction=0.2;
     rot=irandom(360);
     rot_spd=5;
     sca=random_range(0.1,0.5);
     }
     i+=1;}



이것은 랜덤방향으로 10정도의 이펙트를 생성하게 됩니다.


 

 

 

 



◈게임 재시작(obj_restart)

 


플레이어가 파기되고 몇초 후에 게임을 재시작하도록 만들어 봅시다.
일단 게임을 재시작할 오브젝트(obj_restart)를 하나 만들어요.

 

 

(▲ 재시작 오브젝트)


그리고 Create 이벤트를 추가하고, 사용할 Alarm 이벤트를 지정해줍니다.

 



     ★ obj_restart - Create 이벤트

     alarm[0]=90;



다음은 Alarm 0 이벤트를 추가하고, 아래과 같이 작성하도록 해요.

 



 

     ★ obj_restart - Alarm 0 이벤트

     room_restart();



이것은 룸을 재시작 하는 것입니다.
게임을 맨 처음부터 재시작하려면 game_restart()를 사용하세요.

이제 이 오브젝트를 플레이어 오브젝트(obj_player)Destroy 이벤트에 추가해주면 됩니다.
플레이어 오브젝트(obj_player)Destroy 이벤트에 아래와 같이 추가 주면 됩니다.

 



 

     ★ obj_player - Destroy 이벤트 추가

     instance_create(0,0,obj_restart);



이렇게 하면 재시작 오브젝트가 생성되고, 몇 초후 룸을 재시작하게 됩니다.

제대로 되는지 테스트 해봅시다.


이제 다음 룸으로 넘어가는 골지점을 만들어 봅시다.

 

 

 

 

 



◈골 지점(obj_goal)

 


먼저 마스크로 사용할 이미지를 준비하고, 스프라이트로 추가하도록 합니다.

 

 

(▲룸에 배치시 식별, 마스크로 사용할 스프라이트)


크기는 32X32크기이고, 중심점은 배치하기 편하도록 (0,0)에 맞추었습니다.
이제 오브젝트(obj_goal)를 하나 만들고, sprite에 마스크용으로 준비한 스프리아트를 지정합니다.

 

 

(▲골 지점 오브젝트)


골지점은 아래와 같이 만들 거에요.

 

 

(▲골 지점)


일단 텍스쳐로 사용할 이미지를 준비하고, background로 추가해요.

 

 

(▲텍스쳐 이미지)


골 지점 오브젝트(obj_goal)Create 이벤트를 추가하고, 아래와 같이 텍스쳐를 변수에 할당하도록

합니다.

 



     ★ obj_goal - Create 이벤트

     texid=background_get_texture(back_goal);



다음은 모델을 표시해야겠죠.
Draw 이벤트를 추가하고, 아래와 같이 작성하도록 해요.

 



     ★ obj_goal - Draw 이벤트

     draw_set_alpha(1);
     draw_set_color(c_white);
     d3d_transform_add_rotation_x(-90);
     d3d_transform_add_translation(x,y,0);
     d3d_draw_wall(0,0,0,32,0,-32,texid,1,1);
     d3d_transform_set_identity();



강좌에선 d3d_draw_wall모델이기 때문에 d3d_transform_add_rotation_x로 회전 시켰으나,

모델을 d3d_draw_floor로 바로 그려도 됩니다.

이제 다음 룸으로 이동 시키는 이벤트를 작성해봅시다.
플레이어(obj_player)와의 충돌 이벤트를 추가하고, 다음 룸으로 이동시키도록 합니다.

 





     ★ obj_goal - obj_player와의 충돌 이벤트

     room_goto_next();



이렇게 하면 플레이어와 골지점이 충돌 했을 때 다음 룸으로 이동하게 됩니다.
주의 하실 것은 현재 룸이후에 룸이 있어야 합니다. 중요!


특정 룸으로 이동시에는

     room_goto(이동할 룸 이름)

를 사용하도록 하세요.

 

 

 

 

 


◈ 룸에 배치

 

 

후아~ 드디어 테스트해볼 재료가 준비되었습니다.
룸에 카메라, 배경오브젝트, 플레이어, 블럭, 골지점들을 제대로 배치하고, 테스트 해봅시다.

 

 

(▲룸에 배치)


⊙ 룸에 배치할 오브젝트들

     카메라 오브젝트 : obj_cam
     배경 오브젝트 :obj_map1

     플레이어 오브젝트 : obj_player
     블럭 오브젝트 : obj_bl
     골 지점 오브젝트 : obj_goal

 

 

(▲테스트 화면)


으아~ 강좌가 길었네요.
다음 강좌에선 이동하는 적과 트랩을 만들어 보도록 해요.

 

 

 

 



 


-------- 예 제 --------

 

 

platform3DX_1-1.gmk
다운로드

 

platform3DX_1-1.exe
다운로드

 

 

300x250

댓글