◈ 플레이어의 이동
이번 강좌에서는 플레이어 이동을 만들어 봅시다.
플레이어는 아래와 같이 이전에 준비했던 것처럼 그리드 방식으로 이동하게 될 거에요.
(▲ 플레이어 이동)
강좌에서 사용할 그리드의 크기는 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가 체크되어 있지 않다던가, 플레이어에 벽과의 충돌 설정이 잘못 된 경우일 거에요.
'GameMaker강좌[GMS2] > 액션게임강좌' 카테고리의 다른 글
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-6 : 점수 표시 및 상단 인터페이스 (0) | 2022.02.04 |
---|---|
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-5 : 게임오버와 클리어 (0) | 2022.02.04 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-4 : 폭탄 만들기 (0) | 2022.02.03 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-3 : 몬스터 만들기 (2) | 2022.02.03 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-1 : 준비 (0) | 2022.02.01 |
댓글