ゲーム プロジェクトを設定する

注

このトピックは、DirectX チュートリアル シリーズを使用して簡単なユニバーサル Windows プラットフォーム (UWP) ゲームを作成する の一部です。 そのリンクのトピックは、系列のコンテキストを設定します。

ゲームを開発する最初の手順は、Microsoft Visual Studio でプロジェクトを作成することです。 ゲーム開発専用にプロジェクトを構成したら、後でテンプレートの一種として再利用できます。

目標

  • プロジェクト テンプレートを使用して Visual Studio で新しいプロジェクトを作成します。
  • App クラスのソース ファイルを調べることで、ゲームのエントリ ポイントと初期化について理解します。
  • ゲーム ループを見てください。
  • プロジェクトの package.appxmanifest ファイルを確認します。

Visual Studio で新しいプロジェクトを作成する

注

C++/WinRT 開発用に Visual Studio をセットアップする方法 (C++/WinRT Visual Studio 拡張機能 (VSIX) と NuGet パッケージ (プロジェクト テンプレートとビルド サポートを提供) のインストールと使用など) については、Visual Studio での C++/WinRTのサポート 参照してください。

最初に最新バージョンの C++/WinRT Visual Studio 拡張機能 (VSIX) をインストール (または更新) します。上記のメモを参照してください。 次に、Visual Studio で、Core アプリ (C++/WinRT) プロジェクト テンプレートに基づいて新しいプロジェクトを作成します。 Windows SDK の最新の一般公開バージョン (プレビュー版ではない) をターゲットにします。

App クラスを確認して、IFrameworkViewSource 理解し、IFrameworkView を します

Core App プロジェクトで、ソース コード ファイル App.cppを開きます。 アプリとそのライフサイクルを表す App クラスの実装があります。 この場合、もちろん、アプリがゲームであることがわかります。 ただし、ユニバーサル Windows プラットフォーム (UWP) アプリがどのように初期化されるかについてより一般的に説明するために、アプリ と見なします。

wWinMain 関数

wWinMain 関数は、アプリのエントリ ポイントです。 からの wWinMain を次に示します。

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

App クラスのインスタンスを作成し (作成された App のインスタンスのみ)、静的 CoreApplication.Run メソッドに渡します。 CoreApplication.Run には、IFrameworkViewSource インターフェイスが必要であることに注意してください。 そのため、App クラスでは、そのインターフェイスを実装する必要があります。

このトピックの次の 2 つのセクションでは、IFrameworkViewSource と IFrameworkView インターフェイス について説明します。 これらのインターフェイス (および CoreApplication.Run) は、アプリが windows に ビュー プロバイダーを提供する方法を表します。 Windows では、アプリケーション ライフサイクル イベントを処理できるように、そのビュー プロバイダーを使用してアプリを Windows シェルに接続します。

IFrameworkViewSource インターフェイス

App クラスは、以下のリストに示すように、実際に IFrameworkViewSource を実装します。

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

IFrameworkViewSource 実装するオブジェクトは、ビュー プロバイダー ファクトリ オブジェクトです。 そのオブジェクトの役割は、ビュー プロバイダー オブジェクトを作成して返すことです。

IFrameworkViewSource には、IFrameworkViewSource::CreateView1 つのメソッドがあります。 Windows は、CoreApplication.Runに渡すオブジェクトでその関数を呼び出します。 前述のように、App::CreateView そのメソッドの実装では、*thisが返されます。 つまり、App オブジェクトはそれ自体を返します。 IFrameworkViewSource::CreateView には、IFrameworkViewという戻り値の型があるため、App クラスもその インターフェイスを 実装する必要があります。 そして、それが上記のリストで確認できることがわかります。

IFrameworkView インターフェイス

IFrameworkView を 実装するオブジェクトは、ビュー プロバイダー オブジェクトです。 これで、そのビュー プロバイダーに Windows が提供されました。 これは、wWinMainで作成したのと同じ App オブジェクトです。 そのため、App クラスは、ビュー プロバイダー ファクトリ と、ビュー プロバイダーの両方として機能します。

Windows では、IFrameworkViewのメソッドの App クラスの実装 呼び出すようになりました。 これらのメソッドの実装では、アプリは初期化などのタスクを実行したり、必要なリソースの読み込みを開始したり、適切なイベント ハンドラーを接続したり、アプリが出力を表示するために使用する CoreWindow を受け取ることができます。

あなたの IFrameworkView メソッドの実装は、次に示す順序で呼び出されます。

App クラスのスケルトン (App.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 アプリ フレームワークのを定義する」を参照してください。

プロジェクトを整理する

プロジェクト テンプレートから作成したコア アプリ プロジェクトには、この時点で整理する必要がある機能が含まれています。 その後、プロジェクトを使用して、シューティング ギャラリー ゲームを再作成できます (Simple3DGameDX)。 の App.cpp クラスに次の変更を加えます。

  • データ メンバーを削除します。
  • 削除する OnPointerPressed、OnPointerMoved、および AddVisual
  • SetWindowからコード 削除します。

プロジェクトはビルドされて実行されますが、クライアント領域には単色のみが表示されます。

ゲーム ループ

ゲーム ループの外観を把握するには、ダウンロードした Simple3DGameDX サンプル ゲームのソース コードを確認します。

App クラスには、m_mainという名前の、GameMain型のデータメンバーがあります。 そのメンバーは、次のように App::Run で使用されます。

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

GameMain::Run は、にあります。 これはゲームのメイン ループであり、最も重要な機能を示す非常に大まかな概要を次に示します。

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 と をコピーし、新しい Core App プロジェクトに追加します。 これらのファイルを調査し、実行内容を学習し、Simple3DGameDX固有の内容を削除します。 また、まだコピーしていないコードに依存するものもコメント アウトします。 例を挙げて、GameMain.h は GameRenderer.hに依存します。 ファイルをさらに Simple3DGameDXから にコピーすると、コメントを解除できるようになります。

テンプレートを作成する場合に役立つ Simple3DGameDX のファイルの一部を簡単に紹介します。 いずれの場合も、Simple3DGameDX 自体の動作を理解することは、同様に重要です。

ソース ファイル ファイル フォルダー 説明
DeviceResources.h/.cpp 公共サービス のすべての DirectX デバイス リソースを制御する、DeviceResources クラスを定義します。 また、IDeviceNotify インターフェイスを定義します。これは、グラフィックス アダプター デバイスが失われたり再作成されたりしたことをアプリケーションに通知するために使用されます。
DirectXSample.h 公共サービス ConvertDipsToPixelsなどのヘルパー関数を実装します。 ConvertDipsToPixels 、デバイスに依存しないピクセル (DIP) の長さを物理ピクセル単位の長さに変換します。
GameTimer.h/.cpp 公共サービス ゲームまたは対話型レンダリング アプリに役立つ高解像度タイマーを定義します。
GameRenderer.h/.cpp レンダリング 基本的なレンダリング パイプラインを実装する GameRenderer クラスを定義します。
GameHud.h/.cpp レンダリング Direct2D と DirectWrite を使用して、ゲームのヘッドアップ ディスプレイ (HUD) をレンダリングするクラスを定義します。
VertexShader.hlsl と VertexShaderFlat.hlsl シェーダー 基本頂点シェーダーの高レベル シェーダー言語 (HLSL) コードが含まれています。
PixelShader.hlsl と PixelShaderFlat.hlsl シェーダー 基本ピクセル シェーダーの高レベル シェーダー言語 (HLSL) コードが含まれています。
ConstantBuffers.hlsli シェーダー モデル ビュー プロジェクション (MVP) マトリックスと頂点ごとのデータを頂点シェーダーに渡すために使用される定数バッファーとシェーダー構造のデータ構造定義が含まれています。
pch.h/.cpp なし C++/WinRT、Windows、DirectX の一般的なインクルードが含まれています。

次のステップ

この時点で、DirectX ゲーム用の新しい UWP プロジェクトを作成する方法を示し、その中の一部を見て、そのプロジェクトをゲーム用の再利用可能なテンプレートの一種に変換する方法について考え始めました。 また、Simple3DGameDX サンプル ゲームの重要な部分をいくつか見てきました。

次のセクションでは ゲームの UWP アプリ フレームワークを定義します。 ここでは、Simple3DGameDX のしくみを詳しく見ていきます。