Covellite++  Version: 2.3.0 Revision: 2580 Platform: x64 Build: 15:23 16.10.2020
Кроссплатформенный фреймворк для разработки приложений на С++
Создание базового проекта приложения
  • Создать проект сборки основного модуля программы Windows/ Android.

Создать класс программы.

Создание проекта сборки основного модуля программы для Windows

Создать пустой проект приложения Windows:

Добавить в проект .ico файл иконки программы и .rc файл, определяющий иконку программы как ApplicationIcon (именно эта иконка будет отображаться в заголовке окна программы):


ApplicationIcon ICON "ApplicationIcon.ico"
Заметки
  • В качестве заголовка окна программы будет использовано значение макроса __APPLICATION_NAME__ из файла версии решения.
  • Режим работы (полноэкранный/оконный), размеры и цвет фона окна программы задаются в настройках приложения.

Создание проекта сборки основного модуля программы для Android

Создание проекта сборки .apk файла программы

Создать "Простое приложение Android":

Добавить в его java код перехват функции dispatchKeyEvent() (как это делается и зачем это нужно).

Фоновое выполнение задач в коде С++

Заметки
Чтобы программа работала в полноэкранном режиме (без статус-бара), необходимо добавить в AndroidManifest.xml
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">

Создание проекта сборки главного модуля программы

Создать проект .so файла (который будет загружаться при старте NativeActivity):

Проекту Packaging добавить его в ссылки, а в AndroidManifest.xml добавить запись загрузки именно этого модуля (подробнее).

Создание класса программы

Класс программы содержит главный цикл обработки сообщений, отвечает за обработку системных сообщений и создание/разрушение главного окна программы.

Заметки
При написании кода следует учитывать, что Android в NativeActivity загружает главный модуль программы только один раз, при первом запуске программы, после чего при каждой последующей активации программы вызывает функцию точки входа. При этом объект класса программы будет создаваться каждый раз заново, но все статические объекты будут иметь состояния, унаследованные от предыдущей активации.

Создать класс-наследник от covellite::app::Application, конструктору которого передать способ отрисовки окна приложения (по событию или непрерывно), подписаться на необходимые события и добавить код обработки этих событий.

ExampleApp::ExampleApp(void) noexcept :
Application(Continuous{})
{
namespace events = ::covellite::events;
m_Events[events::Application.Start]
.Connect([&]() { DoInitWindow(); } );
m_Events[events::Error.Exception]
.Connect([](const events::Error_t::Description & _Description)
{ LOGGER(Error) << _Description.c_str(); });
// ...

События, которые может обрабатывать приложение.

Заметки
Подписка на событие Application.Start обязательна, в обработчике следует создать набор окон программы; в качестве класса главного окна программы следует указать ранее созданный класс.
Подписка на собыие Application.Exit не требуется, окно будет уничтожено автоматически.
  • BasementWindow - класс окна программы, обеспечивающий предварительную отрисовку в окне, поверх которой будeт отображаться панели GUI (например, это может быть сцена из 2D или 3D объектов).
  • ExampleWindow - класс главного окна программы (см. Создание кода панелей GUI).
{
LOGGER(Info) << "Create main window.";
// Создание обязательного набора объектов окон приложения.
const auto & wOs = // Класс фреймворка окна операционной системы.
MakeWindow<::covellite::os::Window>(*this);
const auto & wApi = // Класс фреймворка окна графического Api
MakeWindow<::covellite::api::Window>(wOs); // (реализация DirectXOpenGL задается в настройках).
auto & wExpanse = // Класс фреймворка окна, обеспечивающего отрисовку 3D сцены.
MakeWindow<::covellite::expanse::Window>(wApi);
MakeWindow<BasementWindow>(wApi, wExpanse); // Клиентский код, формирующий 3D сцену.
auto & wGui = // Класс фреймворка окна, обеспечивающего отрисовку GUI.
MakeWindow<::covellite::gui::Window>(wApi);
MakeWindow<ExampleWindow>(wGui); // Клиентсткий код программы, управляющий
// переходами между разными слоями GUI.
}

Для создания точки входа программы использовать макрос APPLICATION_ENTRY_POINT, в качестве параметра которого указать имя созданного класса программы.

Настройки

Для всех платформ

Параметр Раздел Описание
PathToFontsDirectory Root Путь к папке расположения шрифтов, которые используются в .rcss файлах.
R Root\Window\BackgroundColor Цвет фона окна программы по умолчанию: красная компонента [0...255].
G Root\Window\BackgroundColor Цвет фона окна программы по умолчанию: зеленая компонента [0...255].
B Root\Window\BackgroundColor Цвет фона окна программы по умолчанию: синяя компонента [0...255].
A Root\Window\BackgroundColor Цвет фона окна программы по умолчанию: прозрачность [0...255].

Только для Windows

Параметр Раздел Описание
GraphicsApi Root\Window Используемый для рендеринга графический Api (Auto, DirectX11, OpenGL).
IsFullScreen Root\Window Полноэкранный/оконный режим работы программы (true/false).
IsResized Root\Window Разрешение/запрет изменения размеров окна программы мышью (true/false).
Width Root\Window\Size Ширина клиентской области окна программы в пикселях.
Height Root\Window\Size Высота клиентской области окна программы в пикселях.
MinClientWidth Root\Window\Size Минимальная ширина клиентской области окна программы в пикселях.
MinClientHeight Root\Window\Size Минимальная высота клиентской области окна программы в пикселях.

Только для Android

Параметр Раздел Описание
GraphicsApi Root\Window Используемый для рендеринга графический Api (Auto, OpenGLES3, OpenGLES).

Настройки по умолчанию

В код проекта необходимо также добавить реализацию функции установки значений параметров по умолчанию. Функция в обязательном порядке должна устанавливать значения по умолчанию для всех параметров.

Пример:

#include "stdafx.h"
#include <Covellite/App/Settings.hpp>
namespace alicorn
{
namespace extension
{
namespace std
{
template<>
/*static*/ SectionPtr_t Singleton<Section_t>::Make(void)
{
auto pSettings = ::std::make_unique<Section_t>(uT("Covellitepp"));
// Функция AddExtra() используется для параметров, которые не должен менять
// пользователь (они не будут видны в программе изменения настроек),
// SetDefault() - для параметров, которые пользователь может изменить
// при необходимости.
(*pSettings).AddExtra(uT("PathToFontsDirectory"),
uT("Data/Fonts")); // Путь к папке расположения шрифтов, которые
// используются в .rcss файлах.
(*pSettings).AddExtra(uT("PathToTextureDirectory"),
uT("Data")); // Путь к папке расположения текстур, которые
// используются в проекте примера.
(*pSettings).AddExtra(uT("PathToMeshDirectory"),
uT("Data")); // Путь к папке расположения файлов 3D объектов, которые
// используются в проекте примера.
(*pSettings).AddExtra(uT("PathToSoundsDirectory"),
uT("Data/Sounds")); // Путь к папке расположения звуковых файлов, которые
// используются в проекте примера.
(*pSettings)[uT("Window")].SetDefault(uT("IsFullScreen"),
false, uT("Полноэкранный/оконный режим работы программы."));
(*pSettings)[uT("Window")].AddExtra(uT("IsResized"),
true); // Разрешение/запрет изменения размеров окна программы мышью.
(*pSettings)[uT("Window")].SetDefault(uT("GraphicsApi"),
uT("Auto"), uT("Используемый для рендеринга графический Api."));
(*pSettings)[uT("Window")][uT("Size")].SetDefault(uT("Width"),
480, uT("Ширина клиентской области окна программы."));
(*pSettings)[uT("Window")][uT("Size")].SetDefault(uT("Height"),
762, uT("Высота клиентской области окна программы."));
(*pSettings)[uT("Window")][uT("Size")].AddExtra(uT("MinClientWidth"),
480); // Минимальная ширина клиентской области окна программы.
(*pSettings)[uT("Window")][uT("Size")].AddExtra(uT("MinClientHeight"),
480); // Минимальная высота клиентской области окна программы.
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("R"),
0x80); // Цвет фона окна программы по умолчанию: красная компонента [0...255].
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("G"),
0x80); // Цвет фона окна программы по умолчанию: зеленая компонента [0...255].
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("B"),
0x80); // Цвет фона окна программы по умолчанию: синяя компонента [0...255].
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("A"),
0x80); // Цвет фона окна программы по умолчанию: прозрачность [0...255].
(*pSettings)[uT("Demo")].SetDefault(uT("IsParticleInstance"),
true, uT("Использовать instancing для рендеринга частиц."));
(*pSettings)[uT("Demo")].SetDefault(uT("ParticlesCount"),
10000, uT("Количество частиц."));
(*pSettings)[uT("Demo")].SetDefault(uT("IsCubeInstance"),
true, uT("Использовать instancing для рендеринга кубиков."));
(*pSettings)[uT("Demo")].SetDefault(uT("IsNightMode"),
false, uT("Режим рендеринга ночь/день."));
(*pSettings)[uT("Demo")].SetDefault(uT("PointLightsPercent"),
5, uT("Количесто точечных источников света ночью в процентах от общей площади игровой сцены."));
(*pSettings)[uT("Demo")].SetDefault(uT("IsAutoRun"),
false, uT("Включение/выключение автоматического перемещения по ландшафту."));
return pSettings;
}
} // namespace std
} // namespace extension
} // namespace alicorn

Настройка чтения данных из файлов

В код проекта необходимо также добавить реализацию функции настройки способа чтения данных из файлов.

Пример:

#include "stdafx.h"
#include <alicorn/compress.hpp>
#include <Covellite/App/Vfs.hpp>
namespace alicorn
{
namespace extension
{
namespace std
{
using namespace ::covellite::app;
template<>
/*static*/ VfsPtr_t Singleton<VfsCore_t>::Make(void)
{
using ImplPtr_t = ::std::shared_ptr<::alicorn::modules::vfs::IImplementation>;
using ConverterPtr_t = ::std::shared_ptr<::alicorn::modules::vfs::IConverter>;
using CompressorType_t = ::alicorn::source::compress::Snappy_t;
using Compressor_t = ::alicorn::modules::vfs::Compress<CompressorType_t>;
return ::std::make_unique<VfsCore_t>(::std::vector<ImplPtr_t>
{
::std::make_shared<::alicorn::modules::vfs::Pack>("data/Data.pack", // Чтение данных из упакованного файла Data.pack.
::std::vector<ConverterPtr_t>{ ::std::make_shared<Compressor_t>() }),
});
}
} // namespace std
} // namespace extension
} // namespace alicorn
ExampleApp
Класс входит в проект Example Класс главного объекта (точка входа) программы.
Definition: ExampleApp.hpp:24
APPLICATION_ENTRY_POINT
#define APPLICATION_ENTRY_POINT(MainApplicationClass)
Макрос входит в проект Covellite.App Макрос реализации функции точки входа для приложения.
Definition: ApplicationEntryPoint.hpp:36
ExampleApp::DoInitWindow
void DoInitWindow(void)
[Create main window]
Definition: ExampleApp.cpp:58
ExampleApp::ExampleApp
ExampleApp(void) noexcept
[Constructor main application class]
Definition: ExampleApp.cpp:11