Перенос цикла игры
Сводка
- Часть 1. Инициализация Direct3D 11
- Часть 2. Преобразование платформы отрисовки
- Часть 3. Перенос цикла игры
Показывает, как реализовать окно для игры универсальная платформа Windows (UWP) и как перенести цикл игры, включая создание IFrameworkView для управления полноэкранным CoreWindow. Часть 3 из простого приложения Direct3D 9 на DirectX 11 и UWP .
Создание окна
Чтобы настроить окно рабочего стола с помощью окна просмотра Direct3D 9, нам пришлось реализовать традиционную платформу окон для классических приложений. Нам пришлось создать HWND, задать размер окна, предоставить обратный вызов обработки окна, сделать его видимым и т. д.
Среда UWP имеет гораздо более простую систему. Вместо настройки традиционного окна игра Microsoft Store с помощью DirectX реализует IFrameworkView. Этот интерфейс существует для приложений и игр DirectX, выполняемых непосредственно в CoreWindow в контейнере приложений.
Обратите внимание, что Windows предоставляет управляемые указатели на ресурсы, такие как объект исходного приложения и CoreWindow. См. раздел "Дескриптор для оператора объектов" (^).
Класс main должен наследоваться от IFrameworkView и реализовать пять методов IFrameworkView: Initialize, SetWindow, Load, Run и Uninitialize. Помимо создания IFrameworkView, который (по сути) будет находиться в вашей игре, необходимо реализовать класс фабрики , который создает экземпляр IFrameworkView. У вашей игры по-прежнему есть исполняемый файл с методом с именем main(), но все, что можно сделать, — использовать фабрику для создания экземпляра IFrameworkView .
Основная функция
//-----------------------------------------------------------------------------
// Required method for a DirectX-only app.
// The main function is only used to initialize the app's IFrameworkView class.
//-----------------------------------------------------------------------------
[Platform::MTAThread]
int main(Platform::Array<Platform::String^>^)
{
auto direct3DApplicationSource = ref new Direct3DApplicationSource();
CoreApplication::Run(direct3DApplicationSource);
return 0;
}
Фабрика IFrameworkView
//-----------------------------------------------------------------------------
// This class creates our IFrameworkView.
//-----------------------------------------------------------------------------
ref class Direct3DApplicationSource sealed :
Windows::ApplicationModel::Core::IFrameworkViewSource
{
public:
virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView()
{
return ref new Cube11();
};
};
Перенос цикла игры
Давайте рассмотрим цикл игры из нашей реализации Direct3D 9. Этот код существует в главной функции приложения. Каждая итерация этого цикла обрабатывает сообщение окна или отрисовывает кадр.
Игровой цикл в классической игре Direct3D 9
while(WM_QUIT != msg.message)
{
// Process window events.
// Use PeekMessage() so we can use idle time to render the scene.
bGotMsg = (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0);
if(bGotMsg)
{
// Translate and dispatch the message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// Render a new frame.
// Render frames during idle time (when no messages are waiting).
RenderFrame();
}
}
Игровой цикл похож - но проще - в версии UWP нашей игры:
Цикл игры переходит в метод IFrameworkView::Run (вместо main()), так как наши игровые функции в классе IFrameworkView.
Вместо реализации платформы обработки сообщений и вызова PeekMessage мы можем вызвать метод ProcessEvents, встроенный в ядро CoreDispatcher окна приложения. Нет необходимости в цикле игры ветвлять и обрабатывать сообщения - просто вызывать ProcessEvents и продолжить.
Игровой цикл в игре Direct3D 11 Microsoft Store
// UWP apps should not exit. Use app lifecycle events instead.
while (true)
{
// Process window events.
auto dispatcher = CoreWindow::GetForCurrentThread()->Dispatcher;
dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
// Render a new frame.
RenderFrame();
}
Теперь у нас есть приложение UWP, которое настраивает ту же базовую графическую инфраструктуру и отрисовывает тот же красочный куб, что и наш пример DirectX 9.
Что дальше?
Закладка вопросы и ответы о переносе DirectX 11.
Шаблоны UWP DirectX включают надежную инфраструктуру устройств Direct3D, которая готова к использованию с игрой. Сведения о выборе подходящего шаблона см. в статье "Создание игрового проекта DirectX на основе шаблона ".
Ознакомьтесь со следующими подробными статьями по разработке игр в Microsoft Store:
- Пошаговое руководство. Простая игра UWP с DirectX
- Звук для игр
- Элементы управления move-look для игр