Tutorials
Tutorials

This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this tutorial in English

RPG 맵 - 샘플 프로젝트

에디터에서 열거나 GitHub에서 다운로드할 수 있는 이 샘플 프로젝트에서는 Defold에서 매우 큰 RPG 맵을 만드는 한 가지 방법을 보여줍니다. 이 설계는 다음 가정을 기반으로 합니다.

  1. 월드는 한 번에 한 화면씩 표시됩니다. 이렇게 하면 게임이 적과 NPC 캐릭터를 자연스럽게 단일 화면 경계 안에 포함할 수 있습니다. 레벨 디자이너는 플레이어 화면에 월드가 어떻게 표시될지 완전히 제어할 수 있습니다.
  2. 플레이어 캐릭터는 게임에 부동 소수점 정밀도 문제가 나타나지 않으면서 원하는 만큼 멀리 이동할 수 있어야 합니다. 이런 문제는 보통 오브젝트가 원점에서 멀리 이동했을 때 이상하게 떨리는 현상을 일으킵니다.
  3. 플레이어의 이동은 맵의 장애물에 의해 제한되므로, 레벨 디자이너는 나무, 바위, 물, 기타 장애물을 사용해 플레이어를 화면 사이로 유도할 수 있습니다.
  4. 타일 맵, 스프라이트, 기타 시각 컨텐츠를 자유롭게 조합할 수 있어야 합니다.

먼저 샘플을 실행하고 3x3 화면 크기의 월드를 걸어 다니며 샘플 구성을 확인해 보세요. 방향키로 캐릭터를 조작합니다.

main 컬렉션

“/main/main.collection”을 열어 이 샘플의 부트스트랩(bootstrap) 컬렉션을 확인합니다.

main 컬렉션에는 방향 버튼으로 8방향으로 조작하는 플레이어 캐릭터 게임 오브젝트와, 게임의 흐름을 제어하는 “game”이라는 두 번째 게임 오브젝트가 들어 있습니다. “game” 오브젝트는 스크립트 하나와 게임의 각 화면에 대응하는 컬렉션 팩토리 하나씩으로 구성됩니다. 팩토리 이름은 화면 그리드 명명 규칙에 따라 지정되어 있습니다.

“/main/game.script” 스크립트는 플레이어가 현재 어느 화면에 있는지 추적합니다. 또한 이 스크립트는 “load_screen”이라는 커스텀 메세지에 반응합니다. 이 메세지는 새 화면을 로드하고, 영웅이 이동하는 방향에 있는 현재 화면과 교체합니다. 처음에는 화면 하나가 화면 중앙에 로드되며, 위치를 바꿀 다른 화면은 없습니다.

화면 전환

영웅은 “/main/hero.script” 스크립트로 제어됩니다. 이 스크립트는 영웅 게임 오브젝트가 화면 가장자리 가까이에 있는 위쪽, 아래쪽, 왼쪽, 오른쪽 경계선을 지나 이동하는지 확인합니다.

  1. 영웅이 화면 가장자리에 충분히 가까이 이동하면, 다음 화면을 로드하도록 “game” 오브젝트 스크립트에 메세지를 보냅니다.
  2. 올바른 collectionfactory 컴포넌트에서 factory.create()를 호출하여 다음 화면 컬렉션을 스폰합니다. 컬렉션의 컨텐츠는 화면 밖에 배치됩니다.
  3. 다음 화면은 뷰 중앙으로 스크롤되어 들어오고, 현재 화면은 반대 방향으로 스크롤되어 나갑니다. 플레이어 캐릭터도 같은 거리와 같은 속도로 함께 스크롤됩니다.
  4. 이제 화면 밖으로 나간 이전 현재 화면은 삭제되고, 다음 화면이 새 현재 화면으로 승격됩니다.
  5. 영웅은 새 화면 안으로 애니메이션되며, 플레이어는 다시 조작할 수 있게 됩니다.

이 모든 과정은 1초 안에 일어나므로 전환이 부드럽고 방해가 되지 않습니다.

화면

게임 월드의 각 화면은 별도의 컬렉션 안에 만들어지며, 그 컬렉션에는 해당 화면에만 있는 타일 맵, 충돌 오브젝트, 기타 게임 오브젝트가 들어 있습니다. 화면을 쉽게 관리하고 로드할 수 있도록 화면 컬렉션은 간단한 규칙에 따라 이름이 지정됩니다.

각 화면 컬렉션은 월드 그리드에서의 위치에 따라 이름이 지정됩니다. 첫 번째 숫자는 X 그리드 위치이고, 두 번째 숫자는 Y 그리드 위치입니다.

Assets view에서 맵의 가장 왼쪽 아래 모서리 화면을 설명하는 “/main/screens/0-0.collection” 컬렉션으로 이동해 엽니다.

모든 화면 컨텐츠의 부모인 “root”라는 게임 오브젝트가 있다는 점에 주목하세요. 이것은 샘플에서 사용하는 또 다른 규칙이며 매우 중요한 목적이 있습니다. 화면이 뷰 안으로 들어올 때는 “root” 게임 오브젝트만 이동하면 됩니다. 모든 자식 오브젝트는 root 부모와 함께 자동으로 이동합니다. 화면에 특수한 게임 오브젝트가 있다면, 그 움직임이 root 부모를 기준으로 하므로 자유롭게 애니메이션할 수도 있습니다. 화면이 안으로 스크롤되거나 밖으로 스크롤될 때 이 자식들도 화면과 함께 이동합니다. 오브젝트가 화면 사이를 이동해야 하는 경우에만 특수한 코드가 필요합니다.

0-1 화면의 벌은 이 아이디어를 보여주는 간단한 예입니다.

월드 컨텍스트에서 화면 편집하기

각 화면에는 내장 타일 맵 에디터에서 편집할 수 있는 자체 타일 맵이 있습니다. 하지만 각 화면을 따로 편집할 때의 가장 큰 단점은 인접한 화면과 어떻게 연결되는지 쉽게 볼 수 없다는 점입니다. 이는 게임 월드 전체의 연속성을 만드는 데 중요한 요소입니다.

이런 이유로 특별한 컬렉션을 만들었습니다. “/main/map/test_layout.collection”을 열어 이 월드 테스트 레이아웃 컬렉션을 확인합니다.

이 컬렉션의 유일한 목적은 개발 중 편집 도구로 사용하는 것입니다. 특정 화면을 테스트 레이아웃 컬렉션과 나란히 편집하면 현재 작업 중인 화면의 컨텍스트를 볼 수 있어 편집 과정이 훨씬 더 편해집니다.

화면 타일 맵(여기서는 오른쪽 패널)을 편집하면 변경 사항이 테스트 컬렉션(왼쪽 패널)에 즉시 반영됩니다. 또한 테스트 레이아웃 컬렉션은 정적 계층구조에 추가되지 않으므로 모든 빌드에서 자동으로 제외됩니다.

요약

지금까지 본 것처럼 이 샘플은 게임 월드와 영웅이 그 안을 이동하는 방식에 관한 특정 제약에 맞춰 만들어졌습니다. 게임의 요구 사항이 다르다면 아마 다른 해결책을 찾아야 합니다. 예를 들어 게임에서 카메라가 월드 맵 위를 끊김 없이 이동해야 한다면, 컨텐츠를 나누는 방식, 로딩 메커니즘, 게임 월드를 제작하는 데 도움을 주는 도구까지 모두 달라져야 합니다.

이것으로 RPG 맵 샘플의 둘러보기를 마칩니다. 언제나처럼 샘플의 컨텐츠는 원하는 방식으로 자유롭게 사용할 수 있습니다. Defold에 대해 더 알아보려면 더 많은 예제, 튜토리얼, 매뉴얼, API 문서가 있는 문서 페이지를 확인하세요.

문제가 생기거나 질문이 있다면 포럼으로 이동하세요.

Happy Defolding!