Создать класс программы.
Создание проекта сборки основного модуля программы для 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, конструктору которого передать способ отрисовки окна приложения (по событию или непрерывно), подписаться на необходимые события и добавить код обработки этих событий.
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 не требуется, окно будет уничтожено автоматически.
{
LOGGER(Info) << "Create main window.";
const auto & wOs =
MakeWindow<::covellite::os::Window>(*this);
const auto & wApi =
MakeWindow<::covellite::api::Window>(wOs);
auto & wExpanse =
MakeWindow<::covellite::expanse::Window>(wApi);
MakeWindow<BasementWindow>(wApi, wExpanse);
auto & wGui =
MakeWindow<::covellite::gui::Window>(wApi);
MakeWindow<ExampleWindow>(wGui);
}
Для создания точки входа программы использовать макрос 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<>
SectionPtr_t Singleton<Section_t>::Make(void)
{
auto pSettings = ::std::make_unique<Section_t>(uT("Covellitepp"));
(*pSettings).AddExtra(uT("PathToFontsDirectory"),
uT("Data/Fonts"));
(*pSettings).AddExtra(uT("PathToTextureDirectory"),
uT("Data"));
(*pSettings).AddExtra(uT("PathToMeshDirectory"),
uT("Data"));
(*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);
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("G"),
0x80);
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("B"),
0x80);
(*pSettings)[uT("Window")][uT("BackgroundColor")].AddExtra(uT("A"),
0x80);
(*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;
}
}
}
}
Настройка чтения данных из файлов
В код проекта необходимо также добавить реализацию функции настройки способа чтения данных из файлов.
Пример:
#include "stdafx.h"
#include <alicorn/compress.hpp>
#include <Covellite/App/Vfs.hpp>
namespace alicorn
{
namespace extension
{
namespace std
{
using namespace ::covellite::app;
template<>
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",
::std::vector<ConverterPtr_t>{ ::std::make_shared<Compressor_t>() }),
});
}
}
}
}