Skip to content

Створення контексту

В прошивці lilka_v2_meowui вже є певна структура каталогів. Ігрові модулі розміщуються в каталозі context/games. Тому я створюю в цьому каталозі нову папку, що називається simple_rpg. В ній міститимуться усі ресурси та код, пов'язані з грою.

У папці simple_rpg створюю файл SimpleRpgContext.h. Це заголовковий файл головного контексту нашої гри. У цьому файлі оголошую однойменний класс, що наслідується від IContext. Класс потрібно обов’язково додати в унікальний простір імен. Це допоможе в майбутньому уникнути конфліктів з іншими іграми. Я назвав простір імен simple_rpg.

IContext - абстрактний клас, тому в будь-якому класі, що наслідується від нього необхідно реалізувати його чисто віртуальні методи. Їх небагато, це віртуальний деструктор, loop та update. Окрім того, конструктор класу повинен обов’язково приймати посилання на об’єкт GraphicsDriver. Це посилання передається в конструктор базового IContext. В подальшому воно буде розповсюджуватися між іншими компонентами, які повинні відображати себе на дисплей.

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

Після створення нового контексту, його необхідно зареєструвати. Для того щоб не ускладнювати на початковому етапі, я додам його до контекстів першого рівня. Читай попередні розділи документації, щоб дізнатися більше про рівні контексту. До перечислення ContextID у файлі include\meowui_setup\context_id.h додаю нове значення ID_CONTEXT_SIMPLE_RPG. Це і буде ідентифікатор нашого нового контексту. Тепер у файлі include\meowui_setup\ui_setup.h потрібно додати кілька рядків коду, які будуть обробляти отримання цього ідентифікатора та створюватимуть відповідний контекст. Також обов’язково потрібно підключити заголовковий файл раніше створеного модуля. Детальніше про коректне підключення модулів можна прочитати в попередніх розділах документації.

Тепер відкриваю файл context\games\GamesListContext.cpp. Цей модуль виводить на дисплей список ігор, що є в прошивці. В його конструкторі формується шаблон меню зі списком. Щоб додати нову гру до існуючого списку, потрібно створити новий віджет елемента списку меню та помістити його до фіксованого меню, що виводить ці елементи на дисплей. Елемент списка меню може містити, в тому числі, іконку, але тут буде додано тільки текст.

Створюю новий віджет з вказівником на нього, що має назву simple_rpg_item. Зверніть увагу на те, яким способом створюється цей віджет.

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

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

Одразу потрібно додавати вказівник щойно створеного віджета до фіксованого меню, аби не забути це зробити пізніше. Те саме стосується ширини віджета, якщо його не буде адаптовано під розміри контейнера автоматично. Якщо не закріпити цю звичку, доведеться витратити багато часу на пошук причини, чому віджет не відображається на дисплеї. Перевірено на власному досвіді :)

Тепер потрібно додати текст до цього елемента списку. Зробити це також дуже просто з використанням шаблонізатора. Розгляньте самостійно, як створюється віджет текстової мітки, та додається до елемента списку.

Хоча інструкція тут займає багато місця і часу на читання, проте, як бачите, створення віджета для списку меню займає всього лише п’ять рядків коду. В основному, так буде і надалі. Коли зрозумієте, як працює Meowui, створення GUI до будь-якого вашого пристрою потребуватиме зовсім незначних витрат часу. Тому увесь час, звільнений від рутини, можна буде витратити на написання логіки програми.

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

Макет GUI контексту →