Наповнення сцени
Раніше я створив порожній клас першої сцени гри, який називається OpenWorldScene. Поки що він не робить нічого. Тому що це, буквально, базова заготовка, над якою потрібно ще попрацювати.
В кожній сцені, для її коректного відображення на дисплей, повинен бути створений мінімум один ігровий об’єкт, до якого потрібно прив'язати камеру. Дивіться приклади коду в IBaseScene, щоб зрозуміти, як відбувається прив’язування камери. Зазвичай, цим ігровим об’єктом є персонаж гравця. Проте, це зовсім не обов'язкова умова. До прикладу, у грі "Комірник" об’єкт, за яким слідує камера, змінюється по натисканню кнопки. Тобто вид перемикається між персонажем і "привидом", об’єктом який не має ані твердого тіла, ані власного спрайту. Завдяки цьому прийому вмикається огляд усього ігрового рівня, при тому, що об’єкт персонажа залишається на одному місці.
У грі, якої стосуєтсья ця інструкція, створення та відновлення даних об’єкта персонажа відбувається у класі IBaseScene, адже це типовий для всіх ігрових сцен код.
В методі init, кожної сцени, рекомендується викликати первинне створення об’єктів, що притаманне тільки цій сцені. Також в ньому можна налаштувати параметри об’єктів, створених в IBaseScene. Наприклад, встановити стартову позицію персонажа на ігровому рівні тощо.
Після початкової ініціалізації сцени, необхідно створити поверхню ігрового рівня. Зверніть увагу, як збирається поверхня у методі buildTerrain класу OpenWorldScene. Спочатку додається опис кожної із плиток, яка буде використовуватися на сцені, і лише після цього, викликається збірка поверхні на основі попереднього опису плиток, та шаблону сцени, що був імпортований із Tiled.
Тепер в реалізації методу update потрібно обов'язково додати виклик IGameScene::update();, щоб відбулася коректна генерація зображення гри. У нашому випадку update ігрових сцен реалізовано у класі IBaseScene. Якби було потрібно у цьому методі виконувати унікальні, для ігрового рівня дії, тоді можна б реалізувати метод update для кожного ігрового рівня окремо.
На цьому мінімальна сцена готова. Якщо все вірно написано, можна зібрати і запустити прошивку. Після відкриття контексту гри, повинна запуститися перша ігрова сцена, з тими об’єктами, які були додані в неї. Поки що об’єктом персонажа неможливо керувати, тому що наразі відсутня обробка натискання кнопок в ігровій сцені. Але, перш ніж починати додавати обробку кнопок, я додам ще одну ігрову сцену CaveScene. В ній відсутні коментарі до коду, тому що вона створюється аналогічно до попередньої. Це буде сцена підземелля, в яке персонаж зможе заходити через портал, та виходити з нього через такий же портал.
Портал це звичайний ігровий об’єкт. В його завдання входять дві речі: відображення анімації свого спрайту та сканування невеликої прямокутної області перед собою на наявність в ній об’єкта персонажа. Сканування відбувається за допомогою спеціального методу, який визначено в базовому класі ігрового об’єкта. Якщо об’єкт персонажа виявлено у визначеному прямокутнику перед порталом, тоді портал піднімає прапор, який буде прочитано ігровим рушієм. Після того, як буде прочитано тригер у об’єкта, базовий клас ігрової сцени перевикличе метод onTrigger у, реалізованій розробником, ігровій сцені, та передасть до нього ідентифікатор тригера, який щойно спрацював.
Система тригерів об’єктів працює синхронно. Хоча в одному кадрі загально може спрацювати декілька тригерів, але в кожен момент часу викликатися метод onTrigger буде тільки для одного тригера по мірі оновлення стану об’єктів. Розробник повинен сам додати систему зберігання активних тригерів, якщо потрібно відслідковувати одночасно стан декількох із них.
Тепер залишилося тільки додати обробку натискань кнопок, щоб гра виглядала повноцінно. Стани кнопок в сцені обробляються так само, як і в контекстах. Тільки замість перемикання віджетів, викликаються відповідні методи у персонажа, GUI гри або у самої сцени.
Ознайомтеся самостійно з методом update класу IBaseScene щоб зрозуміти, як відбувається переміщення об’єкта по ігровій сцені.