본문 바로가기
GameMaker강좌[GM8]/액션게임강좌

[게임메이커강좌-플랫폼]바운스게임(공튀기기게임) 만들기

by 타락카얀 2013. 6. 17.
728x90

 

 

 

 

이번엔 바운스 게임을 한번 만들어 봅시다.

 

 

 

 

 

 

(▲바운스 게임)

 


먼저 게임을 만들기 전에 어떤식으로 움직이고, 어떻게 맵을 배치하고,
어떻게 게임을 진행할 것인지를 미리 구상해보는 것이 좋아요.

 

 

 

 

 

 

 

 

 


◈블럭(obj_block, obj_bl32)

 


공은 계속 튕기며 목적지 가는 게임입니다.
일반 플랫폼과 비슷하지만, 다르다면 계속 점프를 하는 것이겠지요.
그에 대한 설정을 해봅시다.

먼저 블럭을 구성해야겠지요.
그것에 따른 스프라이트 이미지(spr_block)를 마련합니다.

 

 

 

 

 

 

(▲블럭 이미지)

 


이제 오브젝트를 만들어야겠지요.
관리하기 편하도록 parent오브젝트를 만들고, 실제 배치시킬 블럭 오브젝트를 만듭니다.

     예) obj_block(parent오브젝트) - obj_bl32(하위 오브젝트)

 

 

 

 

 

 

(▲블럭 오브젝트)

 


블럭 오브젝트에 스프라이트를 지정하고, parent를 지정, 그리고 solid를 체크합니다.
그러면 블럭은 완성! 오옷!

 

 

 

 

 




◈플레이어(obj_player)

 


먼저 플레이어의 이미지(spr_player)를 구성합니다.

 

 

 

 

 

 

(▲플레이어 이미지)

 


이미지의 중심점을 가운데로 맞추고, Modify Mask를 눌러 마스크를 적당하게 설정합니다.
그리고 플레이어 오브젝트(obj_player)를 만들어 스프라이트를 지정합니다.

 

 

 

 

 

 

(▲플레이어 오브젝트)

 


이제 중력 설정을 할 차례입니다.
이전 강좌에서 한번 해보셨죠.

 

넵! 이미 해보셨다면 그리 어렵지 않을 것입니다.
Step이벤트를 추가하고, 중력 설정에 대한 이벤트를 작성합시다.

 

 

 



     ★obj_player - Step 이벤트

     if place_free(x,y+1){

     gravity=0.4;

     gravity_direction=270;
     }//플레이어 밑에 솔리드 오브젝트가 없으면 떨어짐
     else{

     gravity=0;
     gravity_direction=270;
     }//플레이어 밑에 솔리드 오브젝트가 있으면 멈춤




     if vspeed>8{vspeed=8;}//아래로 떨어지는 속도를 제한함


 


다음은 블럭(parent 오브젝트인 obj_block)과의 충돌 이벤트를 추가합니다.

충돌 이벤트는 블럭의 parent 대표로 지정하면 됩니다.

 

 

 



     ★obj_player - obj_block와의 충돌 이벤트

     vspeed=0;
     move_contact_solid(270,8);


 


이렇게 하면 플레이어가 블럭에 닿을 때 완전히 멈추게 됩니다.

하지만 플레이어는 계속 튕기는 모션을 주어야 겠지요.
블럭과의 충돌 이벤트에 추가적으로 작성합니다.

 

 

 



     ★obj_player - obj_block 와의 충돌 이벤트

     if vspeed>0{

     //------------------------▲ 추가

     vspeed=0;
     move_contact_solid(270,8);

     //------------------------▼ 추가
     vspeed=-8; //점프 속도
     }
     else{
     vspeed=0;
     move_contact_solid(90,8);
     }


 


이제 플레이어가 블럭에 닿으면 멈추었다가 다시 점프를 하게 됩니다.

그리고 만약 위에 블럭이 닿게 되면 플레이어는 멈추게 되고, 중력 방향으로 다시 내려오게 됩니다.

다음은 이동에 대해 설정합시다.
플레이어의 Step이벤트에 이어서 작성합니다.

 

 

 



     ★obj_player - Step 이벤트

     spd=3;
     if keyboard_check(vk_left){ //왼쪽

     x-=spd*place_free(x-spd,y);
     }
    
     if keyboard_check(vk_right){ //오른쪽

     x+=spd*place_free(x+spd,y);
     }

 


keyboard_check는 키 이벤트입니다.
따라서 방향키를 누르게 되면 플레이어는 이동하게 됩니다.
만약 이동 방향에 Solid로 체크된 오브젝트가 있다면 멈추게 되지요.

 

 

 

※참고: 키보드 이벤트의 키코드
 vk_left : 왼쪽 방향키
 vk_right : 오른쪽 방향키
 vk_up : 위쪽 방향키
 vk_down: 아래쪽 방향키
 vk_space : 스페이스 키
 vk_alt : 알트키
 vk_control : 컨트롤키
 vk_escape : ESC키
 vk_enter : 엔터키
 ord("키") : 문자키를 사용할 때. 문자는 대문자. 예) ord("A")
 이외에 코드 입력시 vk_를 입력하면 자동완성으로 여러가지 키코드들을 보실수 있어요.

 

 

 

다음은 룸 밖으로 나갔을 때 상황을 작성해봅시다.
룸 밖으로. 그러니까 화면에 나가 플레이을 더 이상 할 수 없을때는 플레이어를 파기해야겠지요.
그리고 게임을 재시작해야합니다.
이것에 대한 이벤트를 작성해봅시다.
먼저 Create이벤트를 추가하고 게임을 재시작에 대해 필요한 변수를 만듭니다.

 

 

 



     ★obj_player - Create 이벤트

     restart=0;//게임 재시작 스위치


 


다음은 End Step이벤트를 추가하고, 플레이어가 화면을 벗어났을 때 이벤트를 작성해봅시다.

 

 

 



     ★obj_player - End Step 이벤트

     if y>room_height+16{

     restart=1;
     instance_destroy();
     }

 


이것은 플레이어가 룸의 맨아래에 넘어갔을 때, 플레이어 자신을 파기하게 됩니다.
그리고 게임 재시작 스위치(restart변수)를 1로 만들지요.

게임을 재시작하기 전에 약간의 지연시간이 있으면 좋겠지요.
일단 게임을 재시작할때 지연 시간을 줄 오브젝트(obj_restart)를 하나 만듭니다.

 

 

 

 

 

 

(▲게임 재시작 오브젝트)

 


지연시간은 알람이벤트를 이용하도록 해요.
먼저 Create이벤트를 추가하고, 사용할 알람 이벤트를 지정합니다.

 

 

 



     ★obj_restart - Create 이벤트

     alarm[0]=120;


 


여기에선 Alarm 0 이벤트를 사용하도록 하지요.

알람 지정은 룸 속도에 맞추면 됩니다. 예를 들어 룸 속도가 60일때 알람 120은 약 2초가

됩니다(1초=룸 속도).
다음은 알람 이벤트(Alarm 0)를 추가하고, 룸을 재시작하면 됩니다.

 

 

 



     ★obj_restart - Alarm 0 이벤트

     room_restart( );


 


이렇게 하면 현재 스테이지만 재시작하게 됩니다.
※참고로 game_restart( )함수가 있는데 이것은 게임을 처음부터 재시작하게 됩니다.

이제 이것을 플레이어 오브젝트의 Destroy이벤트에 삽입하면 됩니다.
플레이어 오브젝트로 이동해서 Destroy이벤트를 추가하고 룸 재시작 이벤트를 작성하도록 합니다.

 

 

 



     ★obj_player - Destroy 이벤트

     if restart=1{

     instance_create(0,0,obj_restart);
     }

 


그냥 재시작 오브젝트를 생성해도 되는데, 왜 restart변수로 체크하게 했을 까요?
그것은 플레이어가 어떠한 상황에 따라 게임을 재시작 할수도 있고 그냥 파기만 시킬 수도 있는 상황이

있을 수도 있기 때문입니다.

Destroy이벤트파기 될 때마다 항상 일어나는 이벤트이기 때문에, 상황에 따라 프로그래머가

직접 체크하게해야 합니다.

이제 룸을 만들고 플레이어 오브젝트와 블럭 오브젝트를 배치한 다음 제대로 되는지 테스트 해봅시다.
잘 되는지 모르겠네요.

다음은 트랩을 설치해볼까요.

 

 

 

 

 

 

 

 

 

 

 


◈트랩(obj_trap)

 


먼저 이미지를 구성하도록 합니다.

 

 

 

 

 

 

(▲트랩 이미지)

 


다음은 오브젝트를 하나 만들고(obj_trap), 스프라이트를 지정합니다.

 

 

 

 

 

 

(▲트랩 오브젝트)

 


다양한 트랩을 만들고자 한다면 parent용 오브젝트를 먼저 만들고, 하위 오브젝트들을 만드세요.
강좌에선 1개만 사용하기 때문에 그냥 하나만 만들도록 하겠습니다. 헤헤!

이제 플레이어 오브젝트에서 이 오브젝트(obj_trap)들과의 충돌 이벤트를 작성해야합니다.
플레이어 오브젝트로 이동해서 트랩 오브젝트와의 충돌 이벤트를 추가합니다.
트랩 오브젝트가 parent가 있는 경우 parent오브젝트를 지정하면 됩니다.

 

 

 



     ★obj_player - obj_trap과의 충돌 이벤트

     restart=1;
     instance_destroy();


 


이렇게 하면 룸 재시작 변수를 1로 만들고, 플레이어는 파기됩니다. 그러면 약간의 지연 시간후

스테이지를 재시작 하게 되겠지요. 굳!

하지만 그냥 파기되면 좀 밋밋하겠지요. 간단한 이펙트라도 생성해보도록 합시다.

 

 

 

 

 




◈이펙트(obj_effect)

 
 
 

 

 

 

(▲이펙트)

 


이렇게 8방향으로 이동하면서 점점 투명해져 없어지는 이펙트를 만들어 봅시다.
먼저 간단하게 흰색 원 이미지를 마련합니다.

 

 

 

 

 

 

(▲이펙트로 사용할 이미지)

 


그리고 중심점을 가운데 맞춰줍니다.

이펙트로 사용할 오브젝트를 하나 만들고, 스프라이트를 지정합니다.

 

 

 

 

 

 

(▲이펙트 오브젝트)

 


Create 이벤트를 추가하고 필요한 변수를 선언합니다.

 

 

 



     ★obj_effect - Create 이벤트

     alp=1;//투명도
     fade_spd=0.05;//페이드 감소치
     sca=1;//이미지 확대치


 


다음은 Draw이벤트를 추가하고, 이미지를 표시합니다.

 

 

 



     ★obj_effect - Draw 이벤트

     draw_sprite_ext(sprite_index,0,x,y,sca,sca,0,c_white,alp);


 


이제 투명도를 조절해야겠지요. Step이벤트를 추가하고, 투명도를 조절하는 이벤트를 작성해봅시다.

 

 

 



     ★obj_effect - Step 이벤트

     if alp>0{

     alp-=fade_spd;
     sca-=0.02;
     }
     else{
     instance_destroy( );
     }

 


호옹~ 간단하죠?
투명도가 0이 될때까지 감소시키고, 이미지의 크기도 조금씩 축소시키며, 투명도가 0이하의 값이

되면 오브젝트를 파기시키는 것입니다. 어차피 투명도가 0이면 보이지 않기 때문에 필요가 없어지죠.

이제 이 이펙트를 플레이어 오브젝트의 Destroy이벤트에서 생성시키면 됩니다.
플레이어 오브젝트(obj_player)로 이동해서, 이펙트를 생성하도록 합시다.
Destroy이벤트에 이어서 작성하도록 합니다.

 

 

 



     ★obj_player - Destroy 이벤트

     i=0;repeat(8){
     it=instance_create(x,y,obj_effect);
     it.direction=i;

     it.speed=3;
     it.friction=0.2;
     i+=360/8;

     }

 


이제 플레이어가 파기되면 이펙트를 발생시킬 것입니다. 굳!

테스트 해봅시다.

 

 

 

 

 

 

 




◈점프 블럭(obj_jump)

 


이번엔 점프 블럭을 만들어 봅시다.

 

 

 

 

 

 

(▲일반 블럭과 점프 블럭)

 


점프블럭은 좀 더 높이 뛰어야 겠지요.
일단 스프라이트 이미지(spr_jumpblock)를 구성합니다.

 

 

 

 

 

 

(▲점프 블럭 이미지)

 

 

 

다음은 오브젝트를 만들고(obj_jump), 스프라이트를 지정합니다.

 

 

 

 

 

 

(▲점프 블럭 오브젝트)

 

 

 

그리고 Solid를 체크하도록 합니다.

 

이제 점프 블럭은 완성되었습니다.

하지만 플레이어의 설정이 남았지요.
다시 플레이어 오브젝트(obj_player)로 이동해서, 점프 블럭과의 충돌 이벤트를 추가하도록 합니다.

 

 

 



     ★obj_player - obj_jump와의 충돌 이벤트

     if vspeed>0{
     vspeed=0;
     move_contact_solid(270,8);
     vspeed=-12; //점프 속도. 보다 더 높게 뛰려면 값을 더 낮게 설정
     }
     else{
     vspeed=0;
     move_contact_solid(90,8);
     }


 


물론 더 높이 뛰게 하려면 vspeed를 더 낮게 잡으시면 됩니다.
※참고로 vspeed는 음수가 위쪽, 양수가 아래쪽 방향입니다.


 

 

 

 

 



 

◈목표 지점(obj_goal)

 


이제 게임의 목표인 다음 스테이지로 가기 위한 골 지점을 만들어 봅시다.
먼저 스프라이트 이미지(spr_goal)를 구성합니다.

 

 

 

 

 

 

(▲골 지점 이미지)

 


다음은 오브젝트를 하나 만들고(obj_goal), 마련한 골 지점 스프라이트를 지정합니다.

 

 

 

 

 

 

(▲골 지점 오브젝트)

 


애니메이션이 되어 있는 경우 image_speed로 속도를 적당하게 조절해야합니다.
물론 프레임 수가 많아 자연스럽다면 안해도 되지만, 프레임 수가 적다면 너무 빠르게 재생되어

보일 것입니다.
그에 따른 설정으로 Create 이벤트를 추가합니다.

 

 

 



     ★obj_goal - Create 이벤트

     image_speed=0.2;//애니메이션이 있는 경우만 해당함


 


애니메이션이 없다면 이 이벤트는 안해도 됩니다. 헤헤!

다음은 플레이어와의 충돌이벤트를 추가하고, 다음 스테이지, 즉, 다음 룸으로 이동하는 이벤트를

만들어야 합니다.

 

 

 



     ★obj_goal - obj_player와의 충돌 이벤트

     room_goto_next( );


 


이것은 반드시 다음 룸이 있어야 합니다.
예를 들어 특정 룸으로 이동 할때는 room_goto(룸 이름)을 사용하시면 됩니다.



와우! 이제 어느정도의 재료가 완성되었습니다.

 

 

 

 

 

 

(▲룸에 배치. 룸 속도는 60이 적당)

 


룸에 플레어어, 블럭, 점프블럭, 트랩, 골지점을 배치하고, 테스트 해봅시다.

참고로 룸의 크기가 화면보다 크다면 아래처럼 설정하시면 됩니다.

 

 

 

 

 

 

(▲뷰가 플레이어를 따라 다니도록 설정함)

 


룸의 뷰탭에서 사용할 뷰를 선택후, Object following에 플레이어를 지정하면 됩니다.
Hbor에는 가로측에 어느정도 닿았을 때 이동할 것인지를 지정하면 되고, Vbor는 세로측에 어느정도

닿았을 때 이동할 것인지를 지정하면 됩니다.

 

 


(▲테스트 화면)

 


여기까지!

 

강좌가 재밌있으셨는지 모르겠네요. 헤헤~
어째든 바운스 게임은 만들기 쉬운편에 속하기 때문에 천천히 따라해보시면 금방 이해하실것이라

생각합니다.

재미있는 게임 만드세요~!


 

 


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

 

bounceX_1-1.gmk
다운로드

 

bounceX_1-1.exe
다운로드

 

 

 

300x250

댓글