がりらぼ

WindowsRuntimeの応援ブログ

DirectXによるWindowsストアアプリゲーム開発入門vol.0 最初のDirectXプロジェクト

最初に、何もしないDirectXプロジェクトをダウンロードしましょう。
DirectXSample GitHub
TestDirectX_0_EmyptyProjectディレクトリ内のソリューションファイルを開きましょう。
このプロジェクトは、VisualStudioによって生成されるDirectXのテンプレートとよく似ていますが、何もしない、ただ青色の画面がでるだけのプロジェクトです。


DirectXを学ぶ最初のステップとして、何もしないプロジェクトを理解し、徐々に機能を付け加えて理解していきましょう。
f:id:garicchi:20131218200450p:plain


プロジェクトをビルドして実行すると何もない青い画面が表示されます。

では、プロジェクトの中身がどのようになっているのか見ていきましょう。
ソリューションエクスプローラーでファイルを見てみるとこのようになっています。

f:id:garicchi:20131218200744p:plain

f:id:garicchi:20131218201855p:plain

この中で重要なのはTestDirectXMainとRendererBaseです。
TestDirectXMain.hを見てみましょう

// デバイス リソースへのキャッシュされたポインター。
std::shared_ptr<DeviceResources> m_deviceResources;

// TODO: これを独自のコンテンツ レンダラーで置き換えます。
std::unique_ptr<RendererBase> m_rendererBase;

// ループ タイマーを描画しています。
DX::StepTimer m_timer;

DeviceResourcesとRendererBase、StepTimerの3つのインスタンスを所有しています。
このshared_ptrやunique_ptrはスマートポインターと呼ばれ、newしてもどこからも参照がなくなったらdeleteしてくれるポインターなのでdeleteしなくてよいもの。と覚えるとよいです。

TestDirectXMainはRedererBaseのインスタンスを所有し、UpdateメソッドとRenderメソッドでRendererBaseの更新、描画を行っています。

// アプリケーション状態をフレームごとに 1 回更新します。
void TestDirectXMain::Update() 
{
	// シーン オブジェクトを更新します。
	m_timer.Tick([&]()
	{
		// TODO: これをアプリのコンテンツの更新関数で置き換えます。
	
		m_rendererBase->Update(m_timer);
	});
}

// 現在のアプリケーション状態に応じて現在のフレームを描画します。
// フレームが描画され、表示準備が完了すると、true を返します。
bool TestDirectXMain::Render() 
{
	// 初回更新前にレンダリングは行わないようにしてください。
	if (m_timer.GetFrameCount() == 0)
	{
		return false;
	}

	auto context = m_deviceResources->GetD3DDeviceContext();

	// ビューポートをリセットして全画面をターゲットとします。
	auto viewport = m_deviceResources->GetScreenViewport();
	context->RSSetViewports(1, &viewport);

	// レンダー ターゲットを画面にリセットします。
	ID3D11RenderTargetView *const targets[1] = { m_deviceResources->GetBackBufferRenderTargetView() };
	context->OMSetRenderTargets(1, targets, m_deviceResources->GetDepthStencilView());

	// バック バッファーと深度ステンシル ビューをクリアします。
	context->ClearRenderTargetView(m_deviceResources->GetBackBufferRenderTargetView(), DirectX::Colors::CornflowerBlue);
	context->ClearDepthStencilView(m_deviceResources->GetDepthStencilView(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);

	// シーン オブジェクトを描画します。
	// TODO: これをアプリのコンテンツのレンダリング関数で置き換えます。
	
	m_rendererBase->Render();

	return true;
}


つまり、DirectXでゲームをつくるにあたって重要なことは、RedererBaseのようなRendererクラスを自分で作って、その中に描画したいものや更新処理を入れ、TestDirectXMainクラスから呼び出してやればよいのです。


RedererBase.cppを見てみましょう。
Updateメソッドには何も記述してあらず、Renderメソッドでは描画開始と終了命令はありますが、実質なにも描画していません。

//更新処理です 定期的に呼ばれるので変数の制御などはここでおこないます
void RendererBase::Update(DX::StepTimer const& timer)
{
	
}

// フレームを画面に描画します。
void RendererBase::Render()
{
	//デバイスコンテキストの確保
	ID2D1DeviceContext* context = m_deviceResources->GetD2DDeviceContext();
	
	context->BeginDraw(); //描画開始

	//この中に描画処理を書きます

	
	context->EndDraw();	//描画終了
	
}

したがって、このアプリケーションはなにも描画せず、ただ青い画面を表示するだけのプロジェクトなのです。

まとめ

DirectXは[プロジェクト名]Mainクラスと、Renderクラスが重要で、
Renderクラスを自分で定義し、[プロジェクト名]Mainクラスがから呼び出すことによって、描画内容が決定される。