Поделиться через


Настройка проекта игры

Примечание.

Этот раздел является частью серии руководств по созданию простой игры универсальная платформа Windows (UWP) с помощью DirectX. Эта ссылка задает контекст для ряда.

Первым шагом в разработке игры является создание проекта в Microsoft Visual Studio. После настройки проекта специально для разработки игр его можно будет повторно использовать в качестве шаблона.

Задачи

  • Создайте проект в Visual Studio с помощью шаблона проекта.
  • Изучите точку входа и инициализацию игры, проверив исходный файл для класса App .
  • Посмотрите на цикл игры.
  • Просмотрите файл package.appxmanifest проекта.

Создание проекта в Visual Studio

Примечание.

Сведения об установке Visual Studio для разработки с использованием C++/WinRT, включая установку и использование расширения C++/WinRT для Visual Studio (VSIX) и пакета NuGet (которые вместе обеспечивают поддержку шаблона проекта и сборки), приведены в разделе Поддержка Visual Studio для C++/WinRT.

Сначала установите (или обновите до) последнюю версию расширения Visual Studio C++/WinRT (VSIX); См. примечание выше. Затем в Visual Studio создайте проект на основе шаблона проекта Core App (C++/WinRT). В качестве цели выберите последнюю общедоступную (то есть не предварительную) версию Windows SDK.

Просмотрите класс App , чтобы понять IFrameworkViewSource и IFrameworkView

В проекте Core App откройте файл App.cppисходного кода. В реализации класса App , представляющего приложение и его жизненный цикл. В этом случае, конечно, мы знаем, что приложение является игрой. Но мы будем называть его приложением, чтобы говорить больше о том, как приложение универсальная платформа Windows (UWP) инициализирует.

Функция wWinMain

Функция wWinMain — это точка входа для приложения. Вот как выглядит wWinMain (от App.cpp).

int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    CoreApplication::Run(winrt::make<App>());
}

Мы создадим экземпляр класса App (это единственный и единственный экземпляр созданного приложения), который мы передаем в статический метод CoreApplication.Run. Обратите внимание, что CoreApplication.Run ожидает интерфейс IFrameworkViewSource . Поэтому класс App должен реализовать этот интерфейс.

В следующих двух разделах этого раздела описываются интерфейсы IFrameworkViewSource и IFrameworkView. Эти интерфейсы (а также CoreApplication.Run) представляют способ предоставления Windows поставщиком представлений. Windows использует этот поставщик представлений для подключения приложения к оболочке Windows, чтобы обрабатывать события жизненного цикла приложения.

Интерфейс IFrameworkViewSource

Класс App действительно реализует IFrameworkViewSource, как показано в описании ниже.

struct App : winrt::implements<App, IFrameworkViewSource, IFrameworkView>
{
    ...
    IFrameworkView CreateView()
    {
        return *this;
    }
    ...
}

Объект, реализующий IFrameworkViewSource, является объектом фабрики поставщика представлений. Задача этого объекта — производить и возвращать объект поставщика представлений.

IFrameworkViewSource имеет один метод IFrameworkViewSource::CreateView. Windows вызывает эту функцию для объекта, который передается в CoreApplication.Run. Как видно выше, реализация app::CreateView этого метода возвращается *this. Другими словами , объект App возвращается. Так как IFrameworkViewSource::CreateView имеет тип возвращаемого значения IFrameworkView, он следует, что класс App также должен реализовать этот интерфейс. И вы можете увидеть, что он делает в приведенном выше списке.

Интерфейс IFrameworkView

Объект, реализующий IFrameworkView, является объектом поставщика представлений. Теперь мы предоставили Windows с этим поставщиком представлений. Это тот же объект App , который мы создали в wWinMain. Поэтому класс App служит как фабрикой представлений, так и поставщиком представлений.

Теперь Windows может вызывать реализации класса App методов IFrameworkView. В реализации этих методов приложение может выполнять такие задачи, как инициализация, начать загрузку необходимых ресурсов, подключить соответствующие обработчики событий и получить CoreWindow , который будет использоваться для отображения выходных данных приложения.

Ваши реализации методов IFrameworkView вызываются в указанном ниже порядке.

И вот скелет класса AppApp.cpp), показывающий сигнатуры этих методов.

struct App : winrt::implements<App, IFrameworkViewSource, IFrameworkView>
{
    ...
    void Initialize(Windows::ApplicationModel::Core::CoreApplicationView const& applicationView) { ... }
    void SetWindow(Windows::UI::Core::CoreWindow const& window) { ... }
    void Load(winrt::hstring const& entryPoint) { ... }
    void OnActivated(
        Windows::ApplicationModel::Core::CoreApplicationView const& applicationView,
        Windows::ApplicationModel::Activation::IActivatedEventArgs const& args) { ... }
    void Run() { ... }
    void Uninitialize() { ... }
    ...
}

Это было просто введение в IFrameworkView. Мы рассмотрим гораздо больше сведений об этих методах и о том, как их реализовать, в разделе "Определение платформы приложений UWP игры".

Тиди вверх проект

Проект Core App, созданный на основе шаблона проекта, содержит функциональные возможности, которые мы должны принудить к этому моменту. После этого проект можно использовать для повторного создания игры съемочной галереи (Simple3DGameDX). Внесите следующие изменения в класс App.cppApp.

  • Удалите его элементы данных.
  • Удаление OnPointerPressed, OnPointerMoved и AddVisual
  • Удалите код из SetWindow.

Проект будет создавать и запускаться, но он будет отображать только сплошной цвет в клиентской области.

Цикл игры

Чтобы получить представление о том, как выглядит цикл игры, просмотрите исходный код для скачаемой игры Simple3DGameDX .

Класс App имеет элемент данных с именем m_main типа GameMain. И этот элемент используется в App::Run , как показано ниже.

void Run()
{
    m_main->Run();
}

Вы можете найти GameMain::Run in GameMain.cpp. Это основной цикл игры, и вот очень грубый контур его показывает наиболее важные особенности.

void GameMain::Run()
{
    while (!m_windowClosed)
    {
        if (m_visible)
        {
            CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
            Update();
            m_renderer->Render();
            m_deviceResources->Present();
        }
        else
        {
            CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}

И вот краткое описание того, что делает этот основной цикл игры.

Если окно для игры не закрыто, отправить все события, обновить таймер, а затем отобразить результаты графического конвейера. Есть многое другое, чтобы сказать об этих проблемах, и мы сделаем это в разделах Определение платформы приложений UWP игры, платформы отрисовки I: введение в отрисовку и платформу отрисовки II: отрисовка игры. Но это базовая структура кода игры UWP DirectX.

Просмотр и обновление файла package.appxmanifest

Файл Package.appxmanifest содержит метаданные о проекте UWP. Эти метаданные используются для упаковки и запуска игры, а также для отправки в Microsoft Store. Файл также содержит важные сведения о том, что система игрока использует для предоставления доступа к системным ресурсам, которые требуется запустить игре.

Запустите конструктор манифеста, дважды щелкнув файл Package.appxmanifest в Обозреватель решений.

Снимок экрана редактора манифеста package.appx.

Дополнительные сведения о файле package.appxmanifest и упаковке см. в конструкторе манифестов. Теперь просмотрите вкладку "Возможности" и просмотрите указанные параметры.

снимок экрана с возможностями по умолчанию приложения direct3d.

Если вы не выбираете возможности, которые использует ваша игра, например доступ к Интернету для глобальной системы оценки высокого уровня, вы не сможете получить доступ к соответствующим ресурсам или функциям. При создании новой игры убедитесь, что вы выбираете все возможности, необходимые API для вызова игры.

Теперь рассмотрим остальные файлы, которые входят в пример игры Simple3DGameDX .

Просмотр других важных библиотек и файлов исходного кода

Если вы планируете создать для себя тип шаблона проекта игры, чтобы можно было повторно использовать его в качестве отправной точки для будущих проектов, вы хотите скопировать GameMain.h и GameMain.cpp выйти из скачаемого проекта Simple3DGameDX и добавить их в новый проект Core App. Изучите эти файлы, узнайте, что они делают, и удалите все, что зависит от Simple3DGameDX. Кроме того, закомментируйте все, что зависит от кода, который еще не скопирован. Просто по примеру GameMain.h зависит от GameRenderer.h. Вы сможете раскомментировать при копировании дополнительных файлов из Simple3DGameDX.

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

Исходный файл Папка с файлами Description
DeviceResources.h/.cpp Служебные инструменты Определяет класс DeviceResources, который управляет всеми ресурсами устройства DirectX. Также определяет интерфейс IDeviceNotify , используемый для уведомления приложения о том, что устройство графического адаптера было потеряно или повторно создано.
DirectXSample.h Служебные инструменты Реализует вспомогательные функции, такие как ConvertDipsToPixels. ConvertDipsToPixels преобразует длину в независимых от устройства пикселях (DIPs) в длину в физических пикселях.
GameTimer.h/.cpp Служебные инструменты Определяет таймер высокого разрешения, полезный для игр или интерактивных приложений отрисовки.
GameRenderer.h/.cpp Отрисовка Определяет класс GameRenderer , который реализует базовый конвейер отрисовки.
GameHud.h/.cpp Отрисовка Определяет класс для отрисовки дисплея (HUD) для игры с помощью Direct2D и DirectWrite.
VertexShader.hlsl и VertexShaderFlat.hlsl Шейдеры Содержит код языка шейдеров высокого уровня (HLSL) для основных шейдеров вершин.
PixelShader.hlsl и PixelShaderFlat.hlsl Шейдеры Содержит код языка шейдеров высокого уровня (HLSL) для базовых шейдеров пикселей.
ConstantBuffers.hlsli Шейдеры Содержит определения структуры данных для буферов констант и структур шейдеров, используемых для передачи матрицы представления модели (MVP) и данных вершин в шейдер вершин.
pch.h/.cpp Н/П Содержит общие компоненты C++/WinRT, Windows и DirectX.

Следующие шаги

На этом этапе мы показали, как создать новый проект UWP для игры DirectX, посмотрел на некоторые из частей в нем, и начал думать о том, как превратить этот проект в своего рода повторно используемые шаблон для игр. Мы также рассмотрели некоторые важные части примера игры Simple3DGameDX .

Следующий раздел — определение платформы приложений UWP игры. Здесь мы более подробно рассмотрим, как работает Simple3DGameDX .