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

[게임메이커 강좌-DnD][GMS2]플랫포머 게임 만들기-10 : 좌우 이동하는 이동 블록

by 타락카얀 2021. 3. 3.
728x90

 

 

GAME MAKER 강좌

 

 

KAYAN


 

 

 

 

 

◈ 좌우 이동하는 이동 블록

 

플레이어가 올라 탈 수 있는 이동블록을 만들어 봅시다.

이번 강좌는 조금 복잡할 수 있습니다.

 

(▲ 이동 블록)

 

강좌에서 만들 이동 블럭은 플레이어가 점프를 하여, 이동블럭에 올라타면 일반 바닥에

착지하는 것처럼 중력을 멈추고 블록이 좌우로 이동하는 대로 플레이어도 같은 방향으로

이동하게 됩니다.

 

(▲ 이동 블록)

 

먼저 블록에 대한 이미지를 스프라이트 이미지로 추가합니다.

 

(▲ 스프라이트 이미지)

 

오브젝트를 추가하고 이동 블록 이미지를 지정합니다.

이름은 obj_block_solid_move_h 로 하겠습니다.

음. 쓰고나니 이름이 기네요.

여러분은 짧은 이름으로 구성하세요.

오브젝트의 Solid 를 체크하도록 합니다.

 

(▲ 오브젝트)

 

그리고 부모 오브젝트로 이전에 만든 바닥 오브젝트(obj_block)을 지정합니다.

 

(▲ 부모 오브젝트 지정)

 

Create 이벤트를 추가하고 [Assign Variable] 액션을 사용하여 속도에 대한 변수를 정의 합니다.

이 변수는 좌우로 이동하는데 쓰일 것입니다.

 

(▲ Create 이벤트)

 

Step 이벤트를 추가합니다.

Common[Apply To] 액션을 추가합니다.

[Apply To] 액션은 다른 오브젝트에서 이벤트를 발생시키기 위한 특수 액션입니다.

참고로 GML 에서는 with 문을 사용합니다.

 

(▲ Step 이벤트)

 

[Apply To] 액션[▼]버튼을 클릭하고, 플레이어 오브젝트의 부모 오브젝트(obj_allunit)를 선택합니다.

 

(▲ [Apply To] 액션에 플레이어 부모 오브젝트를 지정)

 

이렇게 하면 이 액션에 연결된 이벤트는 현재 이벤트를 구성중인 이동 블록 오브젝트가 아닌

플레이어 부모 오브젝트(obj_allunit)에서 실행됩니다.

 

Collision[If Object At Place] 조건문 액션을 추가하고 오브젝트에 현재 블록 오브젝트를

지칭하는 other.id 를 지정합니다.

 

※ [Apply To] 액션으로 실행되는 이벤트 내에서 other를 사용하면 [Apply To] 액션을 사용하는

오브젝트를 지칭하게 됩니다.

 

(▲ 충돌 체크)

 

이것은 플레이어 오브젝트 밑(x, y+1)에 현재 이동 블럭이 있을 때 실행되도록 하는 조건문입니다.

 

다음은 Movement [Jump To Point] 액션을 사용하여 이 이동 블럭 위에 있는 플레이어 오브젝트를

이동 방향으로 동일하게 이동시킵니다.

 

(▲ 플레이어가 이동 블록에 착지했을 때)

 

먼저, 이동 블록 이동 속도만큼 이동 시킵니다.

 

   other.pspeed

 

그리고 이동 방향에 Solid 오브젝트가 없는지 체크하도록 조건문을 곱해줍니다.

 

   other.pspeed * place_free(x + other.pspeed, y)

 

이와 같이 하면, Solid 오브젝트가 없을 때 조건문은 1(true)를 반환하여 속도x1 이므로

같은 방향으로 이동하게 됩니다.

반대로 Solid 오브젝트가 있다면 조건문은 0(false)를 반환하기 떄문에 속도x0 이므로

플레이어는 멈추게 됩니다.

즉, 플레이어 입장에서 블럭에 착지했을 때 이동 블록 오브젝트와의 동기화를 구성하는 것입니다.

 

다음 플레이어가 이동 블록 옆면에 닿았을 때 상황을 구성해야 합니다.

 

Collision[If Object At Place] 조건문 액션을 추가하고, 플레이어가 이동 블록

이동방향(-other.pspeed, y)충돌하는 지를 체크합니다.

이동 블록 이동 방향에 플레이어가 있다면 어떻게 해야 할까요?

플레이어를 이동 방향 쪽으로 밀어버려야겠죠.

 

(▲ 이동 블록 이동 방향에 플레이어가 있을 때)

 

Movement[Jump To Point] 액션을 추가하고, 이동 블록 이동 방향으로 플레이어를 이동 시킵니다.

 

(▲ 이동 블록 이동 방향에 플레이어가 있을 때)

 

다음은 아래와 같이 플레이어가 이동 블록과 다른 solid 블록 사이에 있을 때 상황입니다.

 

(▲ 플레이어가 이동 블록과 solid 블록 사이에 있을 때)

 

[If Expression] 액션을 추가하고, place_free 함수를 사용하여 플레이어 뒤에 solid 블록이

있는지 체크합니다.

만약 있다면 이동 블록의 속도에 -1값을 곱하여 반대 방향으로 이동 시킵니다.

 

(▲ 반대 방향으로 이동)

 

여기까지는 이동 블록에 착지한 플레이어 오브젝트를 제어하는 이벤트였습니다.

 

마지막으로 [Jump To Point] 액션을 사용하여 속도 변수에 따라 현재 이동 블록을

이동 시키면 됩니다.

 

(▲ 현재 이동 블록 이동)

 

다음은 현재 이동 블록 오브젝트의 부모 오브젝트인 solid 오브젝트와 충돌 이벤트를 추가합니다.

 

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

 

그리고 [Assign Variable] 액션을 추가하고, 속도를 반대로 설정합니다.

 

(▲ 속도를 반대로 설정)

 

슬라임 오브젝트와 같이 일부 이동 구간을 지정해봅시다.

 

(▲ 슬라임 오브젝트의 이동 구간으로 사용한 유턴 오브젝트)

 

아래처럼 구간을 처리할 것입니다.

 

(▲ 이동 구간으로 지정)

 

이동 블록에 유턴 오브젝트(obj_reverse)와의 충돌 이벤트를 추가합니다.

 

(▲ 유턴 오브젝트와의 충돌 이벤트 추가)

 

그리고 [Assign Variable] 액션을 추가하고, 속도를 반대로 설정합니다.

 

(▲ 속도를 반대로 설정)

 

이동 블록이 완성되었습니다.

잘 작동하는지 테스트해봅시다.

 

 

 

 

 

- 계속 -

 

 

 

 

 

300x250

댓글