이번엔 바운스 게임을 한번 만들어 봅시다.
(▲바운스 게임)
먼저 게임을 만들기 전에 어떤식으로 움직이고, 어떻게 맵을 배치하고,
어떻게 게임을 진행할 것인지를 미리 구상해보는 것이 좋아요.
◈블럭(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는 세로측에 어느정도
닿았을 때 이동할 것인지를 지정하면 됩니다.
(▲테스트 화면)
여기까지!
강좌가 재밌있으셨는지 모르겠네요. 헤헤~
어째든 바운스 게임은 만들기 쉬운편에 속하기 때문에 천천히 따라해보시면 금방 이해하실것이라
생각합니다.
재미있는 게임 만드세요~!
--------- 예 제 ---------
'GameMaker강좌[GM8] > 액션게임강좌' 카테고리의 다른 글
[게임메이커강좌-플랫폼]간단한 플래폼게임 만들기-5-파트1-더블 점프 (15) | 2013.09.26 |
---|---|
[게임메이커강좌-플랫폼]바운스게임(공튀기기게임) 만들기-추가(부서지는 블럭) (12) | 2013.08.16 |
[게임메이커강좌-플랫폼]간단한 플래폼게임 만들기-4-낙하 트랩 (5) | 2013.06.09 |
[게임메이커강좌-플랫폼]간단한 플랫폼게임 만들기-3-적 구성 (29) | 2013.05.20 |
[게임메이커강좌-플랫폼]간단한 플랫폼게임 만들기-2-게임 구성 (23) | 2013.05.20 |
댓글