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, ми показуємо один зі способів створення дуже великих карт RPG у Defold. В основі цього підходу лежать такі припущення:

  1. Світ показується по одному екрану за раз. Це дає змогу природно обмежити пересування ворогів і неігрових персонажів (NPC) межами одного екрана. Дизайнер рівнів повністю контролює те, як світ виглядає на екрані гравця.
  2. Персонаж гравця має бути здатним подорожувати як завгодно далеко без проблем із точністю чисел із рухомою комою. Такі проблеми зазвичай спричиняють дивне тремтіння об’єктів, коли вони віддаляються від початку координат.
  3. Рух гравця обмежують перешкоди на карті, тож дизайнер рівнів може спрямовувати гравця між екранами за допомогою дерев, скель, води та інших перешкод.
  4. Має бути можливість поєднувати карти плиток, спрайти та інший візуальний вміст.

Спочатку запустіть приклад і пройдіться світом розміром 3x3 екрани, щоб ознайомитися з його будовою. Ви керуєте персонажем за допомогою клавіш зі стрілками.

Головна колекція

Відкрийте “/main/main.collection”, щоб переглянути стартову колекцію (bootstrap collection) цього прикладу.

Головна колекція містить ігровий об’єкт (game object) персонажа гравця, яким можна керувати у 8 напрямках за допомогою клавіш зі стрілками, і другий ігровий об’єкт із назвою “game”, який керує перебігом гри. Об’єкт “game” складається зі скрипту й окремої фабрики колекцій для кожного екрана у грі. Назви фабрик відповідають схемі іменування сітки екранів.

Скрипт “/main/game.script” відстежує, на якому екрані зараз перебуває гравець. Він також реагує на користувацьке повідомлення “load_screen”. Це повідомлення завантажує новий екран і замінює ним поточний у напрямку руху героя. Спочатку екран завантажується в центр області відображення, і іншого екрана, з яким можна помінятися місцями, ще немає.

Зміна екранів

Героєм керує скрипт “/main/hero.script”. Скрипт перевіряє, чи перетнув ігровий об’єкт героя верхню, нижню, ліву або праву лінію поблизу краю екрана:

  1. Якщо герой наближається до краю екрана на достатню відстань, скрипту об’єкта “game” надсилається повідомлення, щоб завантажити наступний екран.
  2. Колекція наступного екрана створюється викликом factory.create() для відповідного компонента collectionfactory. Вміст колекції розташовується за межами екрана.
  3. Наступний екран прокручується в центр області перегляду, а поточний — за її межі у протилежному напрямку. Персонаж гравця також переміщується на ту саму відстань і з тією самою швидкістю.
  4. Попередній поточний екран, який тепер перебуває поза областю перегляду, видаляється, а наступний стає новим поточним екраном.
  5. Герой анімовано з’являється на новому екрані, і гравець знову отримує керування.

Усе це відбувається протягом секунди, тож перехід плавний і не порушує перебігу гри.

Екрани

Кожен екран ігрового світу побудований в окремій колекції, яка містить карту плиток, об’єкт колізій та інші ігрові об’єкти, унікальні для цього екрана. Щоб спростити керування екранами та їх завантаження, колекції екранів названо за простою схемою:

Назва кожної колекції екрана відповідає її позиції в сітці світу. Перше число — це позиція X у сітці, а друге — позиція Y.

На панелі Assets знайдіть і відкрийте колекцію “/main/screens/0-0.collection”, яка описує екран у нижньому лівому куті карти:

Зверніть увагу на ігровий об’єкт із назвою “root”, який є батьківським для всього вмісту екрана. Це ще одна домовленість, використана в прикладі, і вона має дуже важливе призначення: коли екран переміщується в область перегляду, достатньо перемістити лише ігровий об’єкт “root”. Усі дочірні об’єкти автоматично переміщуються разом із кореневим батьківським об’єктом. Якщо на екрані є особливі ігрові об’єкти, їх також можна вільно анімувати, оскільки їхній рух відбувається відносно кореневого батьківського об’єкта. Коли екран прокручується в область перегляду або за її межі, ці дочірні об’єкти переміщуються разом з екраном. Спеціальний код потрібен лише тоді, коли об’єкт має переходити між екранами.

Бджоли на екрані 0-1 — простий приклад цієї ідеї:

Редагування екранів у контексті світу

Кожен екран має власну карту плиток, яку можна редагувати у вбудованому редакторі карт плиток. Проте головний недолік окремого редагування кожного екрана полягає в тому, що складно побачити, як він поєднується із сусідніми екранами, а це важливо для створення цілісного ігрового світу.

Саме для цього створено спеціальну колекцію. Відкрийте “/main/map/test_layout.collection”, щоб переглянути цю колекцію з тестовим макетом світу:

Єдине призначення цієї колекції — бути інструментом редагування під час розробки. Якщо редагувати певний екран поруч із колекцією тестового макета, ви бачитимете контекст екрана, над яким працюєте, і редагувати його буде значно зручніше:

Будь-які зміни карти плиток екрана (тут на правій панелі) одразу відображаються в тестовій колекції (на лівій панелі). Також зауважте, що колекцію тестового макета не додано до статичної ієрархії, тому вона автоматично виключається з усіх збірок.

Підсумок

Як ви побачили, цей приклад побудований з урахуванням певних обмежень щодо ігрового світу й того, як ним пересувається герой. Якщо ваша гра має інші вимоги, вам, імовірно, знадобиться інше рішення. Наприклад, якщо камера у вашій грі має безперервно рухатися картою світу, вам потрібні інший спосіб поділу вмісту, інший механізм завантаження, а також інші інструменти для створення ігрового світу.

На цьому огляд прикладу карти RPG завершується. Як завжди, ви можете використовувати вміст прикладу на власний розсуд. Щоб дізнатися більше про Defold, перегляньте наші сторінки документації, де знайдете більше прикладів, уроків, посібників і документацію API.

Якщо виникнуть труднощі або запитання, завітайте на наш форум.

Приємної роботи з Defold!