注
このトピックは、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 関数は、アプリのエントリ ポイントです。
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
CoreApplication::Run(winrt::make<App>());
}
App クラスのインスタンスを作成し (作成された App のインスタンスのみ)、静的 CoreApplication.Run メソッドに渡します。 CoreApplication.Run
このトピックの次の 2 つのセクションでは、IFrameworkViewSource と IFrameworkView インターフェイス
IFrameworkViewSource インターフェイス
App クラスは、以下のリストに示すように、実際に IFrameworkViewSource を実装します。
struct App : winrt::implements<App, IFrameworkViewSource, IFrameworkView>
{
...
IFrameworkView CreateView()
{
return *this;
}
...
}
IFrameworkViewSource
IFrameworkViewSource *this
が返されます。 つまり、App オブジェクトはそれ自体を返します。 IFrameworkViewSource::CreateView
IFrameworkView インターフェイス
IFrameworkView を
Windows では、IFrameworkViewのメソッドの
あなたの IFrameworkView
- 初期化
- の SetWindow
- 読み込み
- CoreApplicationView::Activated イベントが発生します。 そのため、そのイベントを処理するために (必要に応じて) 登録されている場合は、OnActivated ハンドラーがこの時点で呼び出されます。
- 実行
- の初期化解除
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 ファイルとパッケージ化の詳細については、マニフェスト デザイナーを参照してください。 ここでは、[機能] タブを見て、提供されているオプションを確認します。
グローバル ハイ スコア ボードの インターネット へのアクセスなど、ゲームで使用する機能を選択しないと、対応するリソースや機能にアクセスできなくなります。 新しいゲームを作成するときは、ゲームが呼び出す API に必要な機能を必ず選択してください。
次に、Simple3DGameDX サンプル ゲームに付属する残りのファイルを見てみましょう。
その他の重要なライブラリとソース コード ファイルを確認する
将来のプロジェクトの出発点としてそれを再利用できるように、一種のゲーム プロジェクト テンプレートを作成する場合は、ダウンロードした GameMain.h
プロジェクトから GameMain.cpp
と をコピーし、新しい Core App プロジェクトに追加します。 これらのファイルを調査し、実行内容を学習し、Simple3DGameDXGameMain.h
は GameRenderer.h
に依存します。 ファイルをさらに Simple3DGameDX
テンプレートを作成する場合に役立つ Simple3DGameDX のファイルの一部を簡単に紹介します。 いずれの場合も、Simple3DGameDX 自体の動作を理解することは、同様に重要です。
ソース ファイル | ファイル フォルダー | 説明 |
---|---|---|
DeviceResources.h/.cpp | 公共サービス | のすべての DirectX |
DirectXSample.h | 公共サービス |
ConvertDipsToPixelsなどのヘルパー関数を実装します。 ConvertDipsToPixels |
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 のしくみを詳しく見ていきます。