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

[게임메이커강좌-3D 강좌]3D 플랫폼 게임 만들기-2-적 유닛 추가

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

 

 

GAME MAKER 강좌

 

 

KAYAN

 

 

 

 

 

이번 강좌에선 이동하는 적과 트랩을 만들어 볼것입니다.

 

 

(▲게임 화면)

 

 

 

 

 

 

 

 

 

◈적(obj_enemy, obj_en1)

 


이동하는 적을 한번 만들어 봅시다.
일단 마스크로 사용할 이미지를 준비하고, 스프라이트로 추가합니다.

 

 

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


크기는 16 X 16사이즈이고, 중심점은 가운데로 맞추었습니다.

강좌에서 만들어 볼 적은 게임 스샷에도 있었지만, 아래와 같은 모습을 하고 있습니다.

 

 

(▲적 모습)


어랏! 플레이어의 모습과 같죠.
넵. 텍스쳐만 다르고 플레이어와 같습니다.

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

 

 

(▲텍스쳐 이미지)


강좌에서 사용할 텍스쳐의 이미지 크기는 16 X 16으로 준비했습니다.

이제 적으로 사용할 parent 오브젝트(obj_enemy)를 하나 만들고, 실제 배치할 수 있는

하위 오브젝트(obj_en1) 만듭니다.

 

 

(▲적 오브젝트)


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

하위 오브젝트(obj_en1)에는 parentparent오브젝트를 지정하고, sprite에는 이전에 마스크용으로
준비한 적 스프라이트를 지정해줍니다.

이제 본격적으로 적 유닛을 설정해봅시다.
실제 배치되는 적 유닛(obj_en1)Create 이벤트를 추가하고, 필요한 변수들을 선언해줍니다.

 

 

     ★ obj_en1 - Create 이벤트

     hp=1;//체력
     pspeed=1;//속도
     xdir=1;//방향. -1은 왼쪽, 1은 오른쪽

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



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

 

 

     ★ obj_en1 - Create 이벤트

     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();



네. 플레이어 모델과 다를바가 없죠?

캬아~! 그냥 붙여넣기 했습니다. 헤헤~

모델은 6면체로 플레이어 모델과 같습니다.

면마다 텍스쳐가 다르다면 그 부분만 다른 텍스쳐를 지정하시면 되겠지요.

 

뭐, 여러분이 구상하신대로 적 유닛을 구성하셔도 되고요.
다만, 주의하실 것은 모델의 크기를 마스크의 크기, 중심점에 맞춰줘야 충돌 체크를 제대로 할 수

있습니다.

모델 표시도 만들었으니 이젠 중력 설정을 해봅시다.
Step 이벤트를 추가하고 중력에 대한 이벤트를 작성 해봅시다.

 

 

     ★ obj_en1 - Step 이벤트

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

     if vspeed>=8{vspeed=8;}//떨어지는 속도 제한


 

이 역시 플레이어와 같습니다.

솔리드 오브젝트가 있는가, 없는가에 따라 중력 속도를 조절해주면 됩니다.

아래로 떨어질 때 블럭과 충돌할 때는 정지 시키도록 만들어봅시다.
블럭(obj_block)과의 충돌 이벤트를 추가하고, 아래와 같이 작성하도록 합니다.

 

 

     ★ obj_en1 - obj_block과의 충돌 이벤트

     vspeed=0;
     move_contact_solid(270,8);



다음은 이동에 대해 설정해 볼까요?
마찬가지로 Step 이벤트에 아래와 같이 추가 작성하도록 합니다.

 

 

     ★ obj_en1 - Step 이벤트

     if place_meeting(x+(pspeed*xdir),y,obj_block){x=xprevious;xdir*=-1;}//방향 변경 설정
     x+=pspeed*xdir*place_free(x+(pspeed*xdir),y);//이동(솔리드 오브젝트 체크)



이것은 이동하는 방향에 블럭이 있다면 방향을 바꾸게 하여 이동하게 하는 것입니다.
또한 솔리드로 체크된 오브젝트가 있을 때도, 더 이상 이동시키지 못하게 합니다.

적의 체력이 0일때, 룸 밖으로 나갔을 때는 파기시키도록 해요.
Step 이벤트에 아래와 같이 추가 작성하도록 합니다.

 

 

     ★ obj_en1 - Step 이벤트

     if y>room_height{instance_destroy();}//룸 밖으로 나갔을 때
     if hp<=0{instance_destroy();}//체력이 0일때



파기될때는 플레이어와 마찬가지로 이펙트를 생성하도록 만들어요.
적 오브젝트에 Destroy 이벤트를 추가하고, 아래와 같이 작성합니다.

 

 

     ★ obj_en1 - 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개 정도 생성하게 됩니다.

이제 이 유닛을 룸에 배치해 제대로 움직이는지 테스트 해봅시다.

 

 


엇!!! 이동방향에 블럭이 없으니 그냥 떨어지는 군요.
적 유닛이 이동방향에 블럭이 없어도 안떨어지게 방향을 변경하게 해봅시다.
방향을 변경시킬 오브젝트를 따로 만들어서, 이 오브젝트와 적 유닛과 충돌하면 충돌한 적 유닛의

방향을 되돌아 가도록 변경시키도록 해요

먼저 마스크로 사용할 적당한 크기의 이미지를 준비하고, 스프라이트로 추가합니다.

 

 

(▲강좌에서 사용할 마스크)


강좌에선 32 X 32크기의 이미지를 준비해, 중심점을 (0, 0)으로 설정했습니다.
방향 변경 오브젝트(obj_wall)를 하나 만들고, sprite에 마스크로 준비한 스프라이트를 지정해줍니다.

 

 

(▲방향 변경 오브젝트)


이 오브젝트는 룸에 보이지 않아도 되기때문에 Visible은 체크해제하도록 합니다.

이제 적 유닛(obj_en1)으로 돌아가서 이 변경 오브젝트(obj_wall)와의 충돌 이벤트를 추가한 다음,
아래와 같이 작성하도록 합니다.

 

 

     ★ obj_en1 - Destroy 이벤트

     x=xprevious;//x좌표를 1 Step 이번 좌표로 이동
     xdir*=-1;//방향을 변경함



이것으로 적 유닛이 방향 변경 오브젝트와 충돌 했을 때 멈추고(x좌표를 1 Step 이번 좌표로 이동),
이전 방향으로 되돌아가게 합니다.

잘되는지 테스트 해봅시다.

슈퍼 마리오처럼 플레이어가 점프를 뛰어 작 유닛을 밟았을 때, 적을 파기 시켜볼까요.
플레이어에 적들의 parent 와의 충돌 이벤트를 추가하고, 아래와 같이 작성하도록 합니다.

 

 

     ★ obj_player - obj_enemy와의 충돌 이벤트

     if other.hp>0{
     if vspeed>0{//아래로 하강할때만 공격으로 인정
     other.hp-=1;
     vspeed=-5;
     }
     else{//아래로 하강하지 않을때는 플레이어가 파기됨
     instance_destroy();
     }
     }



이렇게 하면 플레이어가 하강할때 적에게 데미지를 주게 됩니다.
그리고 적의 hp가 0이 되면 파기되는 것이죠.

와우~! 적 유닛이 하나 완성되었네요.
얼른 테스트를 해봅시닷.

 

 






◈트랩(obj_trap)

 


이번에는 아래와 같은 가시 트랩을 만들어 봅시다.

 

 

(▲트랩)


어떻게 만들면 될까요?
이것은 d3d_draw_wall 또는 d3d_draw_floor 모델을 사용해 3개정도 표시하면 됩니다.
먼저 마스크로 사용할 이미지를 준비해 스프라이트(spr_trap)로 추가합니다.

 

 

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


크기는 32 X 32사이즈이고, 중심점은 배치하기 편하도록 (0,0)으로 맞추었습니다.

다음은 트랩 오브젝트로 사용할 오브젝트를 하나 만들고, sprite 에 마스크로 준비한

스프라이트(spr_trap)지정하도록 합니다.

 

 

(▲트랩 오브젝트)

 

설정을 하기 이전에 모델에 필요한 텍스쳐 이미지(back_trap)를 준비하고, background에 추가하도록

합니다.

 

 

(▲텍스쳐 이미지)


강좌에선 마스크에 사용했던 이미지를 준비했습니다.
트랩 오브젝트에 Create 이벤트를 추가하고, 변수에 텍스쳐를 할당하도록 합니다.

 

 

     ★ obj_trap - Create 이벤트

     texid=background_get_texture(back_trap);



이제 모델을 표시해야겠죠.
Draw 이벤트를 추가하고 아래와 같이 모델을 표시하도록 해요.

 

 

     ★ obj_trap - 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,-12,0,32,-12,-32,texid,1,1);
     d3d_draw_wall(0,0,0,32,0,-32,texid,1,1);
     d3d_draw_wall(0,12,0,32,12,-32,texid,1,1);
     d3d_transform_set_identity();



물론 강좌에선 d3d_draw_wall 로 모델을 그리고 회전시켰지만, d3d_draw_floor 로 바로 표시해도

됩니다.
편하신 방법대로 만드시면 됩니다.
모델로 만드실때 오브젝트에 지정한 스프라이트 또는 마스크 크기대로 만드세요.
그래야 충돌 체크가 정확하게 됩니다.

이제 플레이어 오브젝트에 이 오브젝트와 충돌 이벤트를 추가하고 이벤트를 작성하시면 됩니다.
플레이어 오브젝트(obj_player)로 이동해서 트랩 오브젝트(obj_trap)와의 충돌 이벤트를 추가하고

아래와 같이 작성합니다.

 

 

     ★ obj_player - obj_trap와의 충돌 이벤트

     instance_destroy();



이것은 플레이어가 트랩 오브젝트(obj_trap)와 충돌하게 되면 플레이어 자신은 파기하도록 하는

것입니다.


 

 

 

◈ 룸에 배치

 

 

이제 게임을 구성할 재료가 준비되었네요.
룸에 배치하고 잘 되는지 테스트 해봅시다.

 

 

(▲룸에 배치)


⊙룸에 배치할 오브젝트들

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

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

     적 오브젝트 : obj_en1
     트랩 오브젝트 : obj_trap

 

 

(▲테스트 화면)


후아~! 강좌가 끝났네요.
모델 그리기가 기존 방식과는 약간 달랐기 때문에 제대로 되셨는지 모르겠네요.
어째든 만들기 편하신 방법을 선택하여 만드시면 됩니다.

게임메이커로 게임을 만들때 중요한것은 뭐다?
프로젝트 저장과 백업, 그리고 무한  테스트는 필수!

재미있는 게임 만드세요!

 

 

 



 


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

 

 

platform3DX_1-2.gmk
다운로드

 

platform3DX_1-2.exe
다운로드

 

 

 

300x250

댓글