본문 바로가기
GameMaker강좌[GMS2]/DnD강좌-게임

[게임메이커 강좌-DnD][GMS2]플랫포머 게임 만들기-2 : 플레이어 만들기

by 타락카얀 2021. 2. 27.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN


 

 

 

 

 

◈ 플레이어 만들기

 

먼저 플레이어부터 만들어 봅시다.

 

플레이어는 기본적으로 서 있는 모션, 이동하는 모션, 점프하는 모션의 이미지가 필요합니다.

기본 이미지는 오른쪽 방향을 바라보는 이미지로 구성하시면 됩니다

 

일단 오른쪽으로 서 있는 모션의 이미지를 스프라이트로 추가합니다.

이미지의 중심점을 가운데 위치로 설정합니다.

 

(▲ 서있는 모션)

 

물론 왼쪽, 오른쪽 방향 따로 구성하셔도 됩니다.

다만, 강좌에서는 좀 더 빠른 진행을 위해 오른쪽 방향만 추가하고, 이벤트를 통해 왼쪽은 왼쪽 방향을

바라볼 때 중심점 중심으로 반전 시킬 겁니다.

 

(▲ 강좌에서는 오른쪽 이미지를 왼쪽으로 반전 시키는 방법을 사용)

 

그리고 이동하는 모션의 이미지를 스프라이트로 추가합니다.

마찬가지로 중심점을 설정합니다.

 

(▲ 이동하는 모션)

 

그리고 점프하는 모션의 이미지를 스프라이트로 추가합니다.

마찬가지로 중심점을 설정합니다.

 

(▲ 점프하는 모션)

 

다음은 플레이어의 마스크 이미지가 필요합니다.

플레이어 크기만큼의 스프라이트 이미지를 추가합니다.

그리고 중심점을 플레이어의 중심점으로 설정합니다.

 

(▲ 마스크 이미지)

 

이것은 플레이어와 다른 오브젝트들 간의 충돌 설정을 위한 것입니다.

물론 이전에 준비한 플레이어 이미지에선 충돌 설정을 하면 됩니다만, 별도의 이미지를 충돌 마스크로

설정하면 보다 간단하게 설정할 수 있습니다.

 

플레이어는 점프를 하거나 공중에 있을 때 중력을 받습니다.

그리고 바닥에 닿으면 멈추게 되지요.

 

(▲ 중력)

 

중력 설정에 있어서 이 바닥도 같이 필요합니다.

바닥에 대한 이미지를 스프라이트 이미지로 추가하도록 합니다.

 

(▲ 바닥 이미지)

 

게임상의 모든 유닛들의 부모 오브젝트를 하나 만들어야 합니다.

부모 오브젝트는 룸에 동일한 오브젝트의 인스턴스들이 많을 때, 한꺼번에 제어할 수 있습니다.

 

부모 오브젝트로 사용할 오브젝트를 하나 추가합시다.

이름은 obj_allunit 이라 하겠습니다.

 

(▲ 모든 유닛의 부모 오브젝트)

 

플레이어 오브젝트를 하나 만듭니다. 이름은 obj_player 로 합시다.

그리고 이동하는 모션의 이미지를 지정합니다.

마스크 설정에는 플레이어의 마스크 이미지를 지정하도록 합니다.

 

(▲ 플레이어 오브젝트)

 

Parent 에 부모 오브젝트를 지정합니다.

 

(▲ 플레이어 오브젝트에 부모 오브젝트 지정)

 

다음은 바닥 오브젝트를 추가하고 이미지를 지정합니다.

이름은 obj_block 으로 합니다.

 

(▲ 바닥 오브젝트)

 

바닥 오브젝트는 solid 를 체크하도록 합니다.

solid 는 중력을 멈추게 할 때, 그리고 충돌 체크에 있어 가장 손쉽게 설정할 수 있는 기능입니다.

 

다만, solid 는 충돌 체크에 제약이 좀 있기 때문에, 바닥 오브젝트의 상호관계에 있어 복잡한 설정이나

다양한 이벤트가 필요하다면 solid 보다는 직접 충돌 체크 이벤트를 구성하는 것이 좋습니다.

하지만 현 강좌에서는 solid 를 사용하는 방법으로 구성해봅시다.

 

플레이어 오브젝트로 돌아가서 중력 이벤트를 설정해봅시다.

 

(▲ 플레이어 오브젝트)

 

Create 이벤트를 추가하고, [Assign Variable] 액션을 추가하고, 기본 모션(이동 속도, 점프, 이동, 좌우 방향)

대한 변수를 정의하도록 합니다.

[+]버튼을 누르면 여러개의 변수를 한번에 설정할 수 있습니다.

 

※ Create 이벤트는 오브젝트를 룸에 생성했을 때 맨 처음 1번 실행되는 이벤트입니다.

 

(▲ Create 이벤트 추가)

 

플레이어의 기본 이동 속도(pspeed)는 5 정도로 적당할 것 같네요.

xdir 은 좌우 방향 입니다. 왼쪽 방향은 -1, 오른쪽 방향은 1 입니다.

이것은 플레이어의 이미지를 방향에 따라 반전시킬 때 사용할 것입니다.

 

다음은 [Assign Variable] 액션을 추가하고, 바닥과 충돌을 체크하는데 필요한 변수를 정의합니다.

플레이어가 바닥에 닿으면 약간씩 뜰 수 있는데, 이것을 바닥쪽 방향으로 완전히 붙일 때 사용할 것입니다.

 

(▲ 바닥과 충돌을 체크하는데 필요한 변수)

 

이제 중력 설정을 구성해봅시다.

플레이어 오브젝트에 Step 이벤트를 추가합니다.

 

※ Step 이벤트는 매시간마다 발생하는 이벤트입니다.

 

그리고 Movement[Set Gravity Direction] 액션을 사용하여 중력 방향을 설정하도록 합니다.

방향은 아래와 같습니다.

 

(▲ 중력 방향)

 

방향은 오른쪽 0 에서 반시계 방향으로 값이 올라갑니다.

우리가 원하는 방향은 아래쪽 수직 방향인 270 이 됩니다.

 

(▲ 중력 방향 설정)

 

그리고 Common[If Variable] 조건문 액션을 추가하고, 아래 함수를 사용하여 solid 오브젝트를 체크하도록 합니다.

 

   ◎ place_free(x,y) : 지정한 위치에 solid 오브젝트가 없는지 체크

 

(▲ solid 오브젝트 체크)

 

이와 같이 하면 플레이어 밑에 solid 오브젝트가 없을 때 이벤트를 실행하게 됩니다.

즉, 공중에 있거나, 점프중인 상태입니다.

 

Movement[Set Gravity Force] 액션을 추가하고, 중력값을 지정합니다.

중력에는 매 이벤트마다 가속도가 붙기 때문에(속도 예: 0.5 ▶ 1 ▶ 1.5 ▶ 2 ...) 그것을 감안하여

값을 지정해야 합니다. 일단 강좌에서는 0.3 으로 설정하겠습니다.

속도가 느리다면 조금 더 큰 값을 지정하면 됩니다.

 

(▲ 중력값 설정)

 

그리고 [Assign Variable] 액션을 추가하고 점프에 관련된 변수를 설정합니다.

현재 공중에 있거나, 점프 중이기 때문에 1로 설정합니다(0 은 바닥에 착지했을 때 사용).

 

이번에 바닥에 착지했을 때의 이벤트를 구성해봅시다.

Common[Else] 조건문 액션을 중력 체크 조건문 밑에 추가합니다.

 

(▲ Else 조건문 추가)

 

바닥에 착지를 했으니 중력을 0으로 만들어야 합니다.

Movement[Set Gravity Force] 액션을 추가하고, 중력을 0으로 설정합니다.

 

(▲ 중력을 0으로 설정)

 

그리고 바닥에 착지중이니 [Assign Variable] 액션을 추가하고, 점프 변수를 다시 0으로 설정합니다.

 

플레이어가 공중에 있을 때, 중력이 적용되면 가속도가 붙어 너무 빨리 떨어질 수 있습니다.

너무 빨리 이동하게 되면, 충돌 체크에 잘 이뤄지지 않을 수도 있지요.

이것을 방지하기 위해서는 어느정도 속도를 제한하는 것이 좋습니다.

 

먼저 [If Variable] 조건문 액션을 추가하고, 공중에서 너무 빨리 떨어지지 않도록 속도를 제한합시다.

중력 방향은 270 , 수직 방향이었죠. 수직 방향의 속도는 vspeed 로 제어할 수 있습니다.

 

(▲ 속도 제한)

 

그리고 [Assign Variable] 액션을 추가하고, 수직속도 vspeed 값을 10으로 제한 합시다.

 

※ [참고] : 수평 속도와 수직속도

 

(▲ 수평속도와 수직속도)

 

다음은 바닥 오브젝트와의 충돌 이벤트를 추가합니다.

이동하는 플레이어 오브젝트가 solid 오브젝트와 충돌하면, 일단 멈추게 됩니다.

다만, 이 때 두 오브젝트 간에 틈이 생길 수도 있어 보기에 좋지 않을 수 있습니다.

우리는 여기서 플레이어가 바닥에 착지했을 때, 바닥쪽으로 틈이 생기면 플레이어를 강제로 붙일 겁니다.

먼저 [If Variable] 조건문 액션을 추가하고, vspeed가 0 (멈춰있을 때)인지 체크합니다.

 

(▲ 바닥 오브젝트와의 충돌 이벤트)

 

그리고 [Assign Variable] 액션을 추가하고, 이전에 정의한 변수들을 재설정합니다.

이후 이 변수를 이용하여 End Step 이벤트에서 좌표를 재설정할 것입니다.

마지막으로 vspeed 값을 0으로 설정합니다.

 

(▲ vspeed를 0으로 설정)

 

End Step 이벤트를 추가합니다.

여기서 바닥에 착지했을 때, 틈이 벌어졌다면 붙일 거에요.

[If Variable] 조건문 액션을 추가하고, 바닥에 착지했는지 체크합니다.

 

※ End Step 이벤트는 매시간마다 발생하는 이벤트입니다. Step 이벤트보다 나중에 발생하는 이벤트입니다.

 

(▲ End Step 이벤트)

 

Common[Function Call]액션을 추가하고, move_contact_solid 함수를 호출하여 solid 오브젝트에 붙입니다.

move_contact_solid 함수는 solid 오브젝트에 붙일 때 사용하는 함수입니다.

 

   ◎ move_contact_solid(direction, maxdist)

 

   - direction : 방향

   - maxdist : 최대 거리

 

함수에는 이동할 방향과, 이동할 거리를 지정하면 됩니다.

 

(▲ move_contact_solid 함수 호출)

 

그리고 충돌 변수를 0으로 초기화 합니다.

 

(▲ 충돌 초기화)

 

 

 

 

- 계속 -

 

 

 

 

 

300x250

댓글