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

[게임메이커 강좌-액션][GMS2]봄버맨 만들기-2 : 이동

by 타락카얀 2022. 2. 2.
728x90

 

 

 

 

 

◈ 플레이어의 이동

 

 

이번 강좌에서는 플레이어 이동을 만들어 봅시다.

 

플레이어는 아래와 같이 이전에 준비했던 것처럼 그리드 방식으로 이동하게 될 거에요.

 

(▲ 플레이어 이동)

 

강좌에서 사용할 그리드의 크기는 32 x 32 로 사용할 것 입니다.

따라서 플레이어나 몬스터 이미지는 그리드 크기로 맞추는 것이 좋습니다.

플레이어의 이미지는 왼쪽, 오른쪽, 위쪽, 아래쪽 모두 4방향의 애니메이션으로 구성할 것 입니다.

 

(▲ 아래쪽 방향)

 

(▲ 왼쪽 방향)

 

(▲ 오른쪽 방향)

 

(▲ 위쪽 방향)

 

스프라이트 이미지의 크기는 32 x 32 이며, 이미지 중심점은 (0, 0)입니다.

 

(▲ 아래쪽 이미지 설정)

 

나머지 방향도 동일하게 설정하시면 됩니다.

 

플레이어의 충돌 마스크로 사용할 이미지를 따로 준비할 거에요.

충돌 마스크의 크기는 그리드 크기(32x32)로 만들어야 그리드 방식의 이동에서 충돌 체크하기가

좋습니다.

 

(▲ 충돌 마스크)

 

(▲ 충돌 마스크)

 

오브젝트를 만들고, 아래쪽 방향의 이미지를 지정합니다.

오브젝트의 이름은 obj_player 로 하겠습니다.

그리고 오브젝트에 준비한 충돌 마스크 이미지를 지정해줍니다.

 

(▲ 플레이어 오브젝트)

 

플레이어가 생성되었을 때, 잠시동안은 무적 상태가 됩니다.

무적 상태에서는 몬스터나 폭발로 인한 피해를 입지 않습니다.

이것은 게임 시작 초기에 플레이어가 게임 조작을 원활하게 플레이하기 위함입니다.

이 기능이 없다면 시작 위치에서 배회하면 플레이어는 생성되자마자 조작하기도 전에

몬스터와 충돌한 채 죽게 될 수 있죠.

그래서 플레이어가 게임 조작을 할 수 있는 약간의 준비 시간이 필요하게 됩니다.

 

먼저 [Create 이벤트]를 추가합니다.

여기에서는 무적 상태의 변수와 해제되는 시간을 [알람 이벤트]로 정의할 거에요.

그리고 [알람 이벤트]에서 지정한 시간이 지나면 무적 상태가 해제시킵니다.

 



     ● obj_player - Create 이벤트
     
     pspeed = 2; //이동 속도
     
     guard = 1; //무적상태
     alarm[0] = 60; //무적상태 해제 시간
     image_alpha = 0.5; //무적상태의 투명도

 

[알람 이벤트]를 추가하고, 무적 상태를 해제합니다.

 



     ● obj_player - Alarm 0 이벤트
     
     guard = 0; //무적상태 해제
     image_alpha = 1; //투명도

 

다음은 이동 설정입니다.

[Step 이벤트]를 추가합니다.

이동은 [place_snapped] 함수를 사용하여 현재 위치가 그리드 위치인지 확인하고, 키 이벤트를

구성합니다.

 

※ 강좌에서는 그리드의 크기를 이전 강좌에서 구상했던 것처럼 32x32 크기로 설정합니다.

 



     ● obj_player - Step 이벤트
     
     image_speed = 0.2; //애니메이션 속도
     
     if place_snapped( 32, 32 ){ //그리드 위치( 32x32 )일 때 실행
     
     //왼쪽 이동
     if keyboard_check( vk_left ){
     if place_free( x-16, y ){ hspeed = -pspeed; vspeed = 0; }
     sprite_index = spr_player_left; //왼쪽 이미지
     }
     
     //오른쪽 이동
     if keyboard_check( vk_right ){
     if place_free( x+16, y ){ hspeed = pspeed; vspeed = 0; }
     sprite_index = spr_player_right; //오른쪽 이미지
     }
     
     //위쪽 이동
     if keyboard_check( vk_up ){
     if place_free( x, y-16 ){ hspeed = 0; vspeed = -pspeed; }
     sprite_index = spr_player_up; //위쪽 이미지
     }
     
     //아래쪽 이동
     if keyboard_check( vk_down ){
     if place_free( x, y+16 ){ hspeed = 0; vspeed = pspeed; }
     sprite_index = spr_player_down; //아래쪽 이미지
     }
     
     //키를 누르지 않았을 때
     if !( keyboard_check( vk_left ) ) && !( keyboard_check( vk_right ) ){ hspeed = 0; }
     if !( keyboard_check( vk_up ) ) && !( keyboard_check( vk_down ) ){ vspeed = 0; }
     
     }

 

스프라이트 이미지의 애니메이션이 빠르거나 느리다면, image_speed 변수로 애니메이션 재생 속도를

조절할 수 있습니다. 변수값이 1(기본값)보다 작으면 느려지고, 값이 클 수록 애니메이션이 빨라집니다.

 

마지막으로 [Step 이벤트]에 오브젝트의 깊이 설정을 추가해줍니다.

 



     ● obj_player - Step 이벤트
     
     depth = -( y + 32 ); //깊이 설정

 

오브젝트의 깊이(depth)는 오브젝트의 위치에 따라 화면에 표시할 수 있는 순서를 정렬 시키기

위함입니다.

 

 

 

 

 

◈ 벽

 

 

다음은 벽을 만들 차례입니다.

 

(▲ 벽)

 

이 벽은 파괴할 수 있는 벽과, 파괴할 수 없는 벽 2가지로 구성합니다.

그리고 이 벽들의 부모 오브젝트를 지정하여 한번에 제어하기 쉽게 할 것입니다.

 

(▲ 벽 오브젝트 구성)

 

먼저 벽 오브젝트의 부모 오브젝트를 추가합니다.

※ 여러 오브젝트를 부모 오브젝트에 연결하면, 오브젝트들을 따로 호출하지 않고 한번에

제어할 수 있습니다.

 

(▲ 벽 오브젝트 부모 오브젝트)

 

다음은 벽 오브젝트로 사용할 이미지를 추가합니다.

이 벽은 파괴되지 않는 벽으로 사용할 것입니다.

 

(▲ 벽 오브젝트 이미지)

 

오브젝트를 추가하고, 준비한 벽 스프라이트 이미지를 지정합니다.

그리고 solid 를 체크하고, 부모 오브젝트(parent)를 지정해줍니다.

중요한 것은 그리드 크기와 충돌 마스크의 크기가 동일한 것이 충돌 체크에 좋습니다.

만약 차이가 난다면, 그리드 크기의 마스크 이미지를 지정해주세요.

 

(▲ 파괴되지 않는 벽 오브젝트)

 

다음은 파괴할 수 있는 오브젝트로 사용할 이미지를 추가합니다.

 

(▲ 벽 오브젝트 이미지)

 

오브젝트를 추가하고, 준비한 벽 스프라이트 이미지를 지정합니다.

마찬가지로 solid 를 체크하고, 부모 오브젝트(parent)를 지정해줍니다.

강좌의 이미지는 그리드 크기와 차이가 있기 때문에 마스크 이미지를 지정하겠습니다.

 

(▲ 파괴할 수 있는 벽 오브젝트)

 

다양한 벽을 더 구성할 수도 있지만, 강좌에서는 간단하게 2가지만 사용하겠습니다.

 

 

이제 플레이어와 이 벽과의 상호관계를 구성해주어야 합니다.

플레이어는 벽을 지나가지 못해야 하죠.

플레이어 오브젝트로 돌아가서 [벽 오브젝트의 부모 오브젝트(obj_block_parent)와의

충돌 이벤트]를 추가합니다.

 



     ● obj_player - obj_block_parent 와의 충돌 이벤트
     
     hspeed = 0;
     vspeed = 0;

 

이렇게 하면 플레이어가 벽과 충돌 했을 때 멈추게 됩니다.

 

 

 

 

 

◈ 플레이어 시작 위치

 

 

다음은 플레이어가 시작하는 지점을 만들어 봅시다.

이 시작 위치는 스테이지를 시작하거나, 또는 플레이어가 파기되어 다시 생성할 때, 위치를

얻기 위해 사용됩니다.

이 위치는 화면에 굳이 표시할 필요가 없지만, 룸에 배치할 때 알아보기 쉽도록 이미지를 만들어

오브젝트에 지정해요.

 

(▲ 시작 위치 표시 이미지)

 

오브젝트를 하나 만들고 이미지를 지정한 후, visible을 체크해제해주세요.

 

(▲ 시작 위치 오브젝트)

 

이제 이 오브젝트의 위치를 사용하여 플레이어를 생성하면 됩니다.

스테이지가 시작할 때, 약간의 지연시간이 필요하면 [알람 이벤트]를 이용하여 플레이어를

생성하시면 됩니다.

 

[Create 이벤트]를 추가하고, [알람 이벤트]를 호출합니다.

 



     ● obj_start_point - Create 이벤트
     
     alarm[0] = 1;

 

강좌에서는 [알람 이벤트]를 바로 호출하여 플레이어를 생성하도록 하겠습니다.

 

그리고 [알람 이벤트]를 추가하고 플레이어를 생성하도록 합니다.

 



     ● obj_start_point - Alarm 0 이벤트
     
     instance_create_depth( x, y, 0, obj_player );

 

지금껏 만든 리소스를 활용하여 룸에 배치하고, 제대로 작동하는지 테스트해봅시다.

먼저 사용할 룸의 크기를 지정합니다.

뷰포트 카메라를 사용하지 않으면, 룸의 크기가 게임 화면의 크기가 됩니다.

 

(▲ 룸에 배치)

 

시작 위치 오브젝트, 벽 오브젝트는 인스턴스 레이어에 배치하고, 타일은 타일 레이어에,

스프라이트 이미지를 바로 배치하고 싶다면 에셋 레이어에 배치하면 됩니다.

배경 이미지로 배치한다고 하면, 배경 레이어에 스프라이트 이미지를 지정하세요.

 

(▲ 테스트)

 

플레이어가 벽을 뚫고 지나가지 않는지 확인해보고, 제대로 작동하지 않는다면, 강좌를 다시 확인해주세요.

보통 벽에 soild가 체크되어 있지 않다던가, 플레이어에 벽과의 충돌 설정이 잘못 된 경우일 거에요.

 

 

 

 

bomberman_01.yyz
0.13MB

 

 

 

 

 

 

 

300x250

댓글