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으로 초기화 합니다.
(▲ 충돌 초기화)
- 계속 -
'GameMaker강좌[GMS2] > DnD강좌-게임' 카테고리의 다른 글
[게임메이커 강좌-DnD][GMS2]플랫포머 게임 만들기-4 : 이동 제한 (0) | 2021.02.28 |
---|---|
[게임메이커 강좌-DnD][GMS2]플랫포머 게임 만들기-3 : 플레이어 이동 (0) | 2021.02.27 |
[게임메이커 강좌-DnD][GMS2]플랫포머 게임 만들기-1 (0) | 2021.02.27 |
[게임메이커 강좌-DnD][GMS2]두더지게임 만들기-7 : 게임 오버 점수판 표시(완) (0) | 2021.02.18 |
[게임메이커 강좌-DnD][GMS2]두더지게임 만들기-6 : 화면에 점수 표시 (0) | 2021.02.18 |
댓글