がりらぼ

WindowsRuntimeの応援ブログ

DirectXによるWindowsストアアプリゲーム開発入門vol.1 直線を描画する

前回、基本的なDirectXのプロジェクトファイルの全体像を学び、描画内容を変えるにはRedererBaseクラスを変更すればよいことがわかりました。

では今回のプロジェクトファイルをダウンロードしましょう。
garicchi/DirectXSample · GitHub

TestDirectX_1_Lineディレクトリ内のソリューションを開いて実行してみましょう。

真っ青な画面に左上から白い直線が斜め下にむかって徐々にひかれていきます。
f:id:garicchi:20131219111306p:plain

ではこのプロジェクトの中身を見ていきましょう。
RedererBase.hを見てみましょう

//ラインの長さ
float m_lineLength;

// ライン描画するためのリソース
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush>    m_lineBrush;

Float型のm_lineLengthとID2D1SolidColorBrushインターフェースのm_lineBrushインスタンスがあります。
ComPtrはスマートポインターなのでdeleteしなくてよいです。
つまり、ヘッダファイルでは、float型のラインの長さと、ID2D1SolidColorBrush型のブラシリソースが定義されていることがわかります。

RedererBase.cppを見てみましょう。
コンストラクタでは、m_lineLigthを0で初期化し、CreateDeviceDependentResourcesメソッドを呼び出しています。

RendererBase::RendererBase(const std::shared_ptr<DeviceResources>& deviceResources) :
m_deviceResources(deviceResources)
{
	m_lineLength = 0;

	//リソース確保
	CreateDeviceDependentResources();
}

基本的にはRedererで使用するリソースはCreateDeviceDependentResourcesメソッド内で定義し、ReleaseDeviceDependentResourcesメソッド内で解放が行われます。
m_lineBrushのResetメソッドで解放です。

//リソースを解放するメソッドです Mainクラスから呼ばれます
void RendererBase::ReleaseDeviceDependentResources()
{
	m_lineBrush.Reset();
}

ではRenderメソッドを見てみましょう

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

	//線を描画します (始点,終点,ブラシ,太さ)
	context->DrawLine(
		Point2F(0, 0),
		Point2F(m_lineLength, m_lineLength),
		m_lineBrush.Get(),
		5.0f
		);

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

DeviceResourcesから、ID2D1DeviceContextを取得しています。DeviceContextとは描画に関するさまざまなメソッドを持ち、Direc2Dでは、ID2D1DeviceContextのBeginDraw()メソッドから、EndDraw()メソッドの間にID2D1DeviceContextインターフェースのメソッドを記述し、描画を行います。

直線を描画するには、ID2D1DeviceContextインターフェースの、DrawLineメソッドを使います。第一引数に始点、第二引数に終点を入れます。Direct2Dでの点は、D2D1_POINT_2F構造体型を戻り値としてPoint2F関数で取得できます。
第三引数にはブラシ、第4引数には太さを入れます。

第二引数では、float型のm_lineLengthで終点を決めています。
ではUpdateメソッドを見てみましょう。

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

Updateメソッドではm_lineLengthをインクリメントしていますね。

UpdateメソッドとRenderメソッドは約60fpsで呼ばれ、ゲーム画面を更新していきます。
呼び出し順はUpdate→Renderです。
これは度のゲームプラットフォームにも共通していえることですが、基本的に更新処理の次に描画処理がよばれ、それらが高速に呼び出されることによってゲーム画面を更新します。なぜかというと、プレイヤーの入力やゲームの状態をすぐに描画に反映させるためですね。

つまりこの場合60fpsで直線の終点がインクリメントされているので、実行した結果となるのがわかります。