DirectX Tool Kitでゲームプログラミングを始めよう

DirectXTKの入門記事があんまりないので．
DirectX11，Windows 10，Visual Studio 2015を使用しています．多分VS2013でも状況に応じればいけると思います．
初心者向けの内容（[DirectXTK Wikiのチュートリアル](https://github.com/Microsoft/DirectXTK/wiki/Getting-Started)の焼き直し）となってます．

# DirectX Tool Kit(DirectXTK)とは？
プログラミング初心者にとっては超難しいと評判のDirectX 11を，少し使いやすくしてくれるライブラリ．
XNAと大体同じような手触りでゲーム制作ができるらしいです（XNA使ったことないけど）．

# 前準備
## DirectX Tool Kitをダウンロード
[ここから](https://github.com/Microsoft/DirectXTK)ダウンロードできます．

## VSIXファイル(雛形)をダウンロード
[ここから](https://github.com/Microsoft/DirectXTK/wiki/The-basic-game-loop)ダウンロードできます．「Setup」のとこです．
そのまま実行してください．


# とりあえず実行！
新しいプロジェクトを作成し，`Direct3D Win32 Game`を選択します．
名前は適当につけましょう（今回はそのままの名前にしました）．
![directx1.png](https://qiita-image-store.s3.amazonaws.com/0/94457/c46a4dc6-3884-92d3-256f-70fcc0749eba.png)

Ctrl+F5とか何かで適当に実行すると…
![directx2.png](https://qiita-image-store.s3.amazonaws.com/0/94457/1a0f13aa-d347-95fc-c412-7b5075537249.png)

青い画面が登場しました！
次はDirectXTKを使う準備をしましょう．


# DirectX Tool Kitのビルド！
ダウンロードした`DirectXTK`を解凍し，`DirectXTK_Desktop_2015.sln`を開いてください．
ソリューションから`DirectXTK_Desktop_2015`を選択してください．

## Debug状態でのビルド
Debug状態で，メニューバーより`ビルド > DirectXTK_Desktop_2015 のビルド`を選択してください．
すると，解凍したフォルダに`Bin\Desktop_2015\Win32`というフォルダが展開されます．
この中にある`DirectXTK.lib`を`DirectXTK_d.lib`にリネームし，適当な場所（`C:\mylib\lib\DirectXTK_d.lib`とか）に置きます．

## Release状態でのビルド
「Debug状態でのビルド」とほとんどおなじ．
ソリューションの構成をRelease状態にして，同様にビルド．
今回はリネームせずに適当な場所（`C:\mylib\lib\DirectXTK.lib`とか）に置きます．

## ヘッダーファイルの設置
`Inc`フォルダを適当（`C:\mylib\Inc`とか）な場所に設置します．


# 試しに画像を動かそう
先ほど作ったプロジェクトで，画像を表示して動かしてみましょう．
![hito.png](https://qiita-image-store.s3.amazonaws.com/0/94457/33768d8b-569e-e431-1cb1-ab36a1f89a10.png)
↑を`hito.png`として作ったプロジェクトに保存してください．

## パス通し
`プロジェクト > [プロジェクト名]のプロパティ`を選択し，構成を`すべての構成`にします．
続いて`構成プロパティ > C/C++`にある`追加のインクルード ディレクトリ`に，先ほど置いたヘッダーファイルのパスを書きます，(先の例だと`C:\mylib\Inc`)
そして`構成プロパティ > C/C++`にある`追加のライブラリ ディレクトリ`に，同じく先ほど置いたライブラリファイルのパスを書きます．(先の例だと`C:\mylib\lib`)

## いんくるーでぃん！
`pch.h`に以下のソースを追記してください．

```cpp:pch.h
#ifdef _DEBUG
#pragma comment(lib, "DirectXTK_d.lib")
#else
#pragma comment(lib, "DirectXTK.lib")
#endif

#include "SpriteBatch.h"
#include "WICTextureLoader.h"
#include "SimpleMath.h"
```
`SpriteBatch.h`は2D画像を表示し，`WICTextureLoader.h`はjpgとかpngとかを読み込むやつです．`SimpleMath.h`はそのまま．

## ソースコードを書いていこう
`Game.h`のprivateにメンバ変数を追加．

```cpp:Game.h
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_texture;
std::unique_ptr<DirectX::SpriteBatch> m_spriteBatch;
DirectX::SimpleMath::Vector2 m_pos;
```
ちなみに，`unique_ptr`や`ComPtr`とかいうやつはスマートポインタとかいう便利なポインタです．

`Game.cpp`の`CreateDevice`メソッドに，以下のソースコードを追加．

```cpp:Game.cpp
m_spriteBatch = std::make_unique<SpriteBatch>(m_d3dContext.Get());
ComPtr<ID3D11Resource> resource;
DX::ThrowIfFailed(
	CreateWICTextureFromFile(m_d3dDevice.Get(), L"hito.png", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf())
);

ComPtr<ID3D11Texture2D> texture;
DX::ThrowIfFailed(resource.As(&texture));

CD3D11_TEXTURE2D_DESC textureDesc;
texture->GetDesc(&textureDesc);
```

`Game.cpp`の`OnDeviceLost`メソッドに，以下のソースコードを追加．

```cpp:Game.cpp
m_texture.Reset();
m_spriteBatch.reset();
```

## いざ，動かす
`Game.cpp`の`Update`メソッドに，以下のソースコードを追加．

```cpp:Game.cpp
m_pos.x += 4.f;
m_pos.y += 2.f;
```

`Game.cpp`の`Render`メソッドに，以下のソースコードを追加．

```cpp:Game.cpp
m_spriteBatch->Begin();
m_spriteBatch->Draw(m_texture.Get(), m_pos);
m_spriteBatch->End();
```

**お疲れさまでした:flushed:．** あとはCtrl+F5とか何かで適当に実行すると…
![directx3.png](https://qiita-image-store.s3.amazonaws.com/0/94457/97928cf1-c45f-d90a-2e71-1738b8fdd8cf.png)
※赤線は加工
おっちゃんが動きます．

おわり

# 最後に
[DirectXTKのWiki](https://github.com/Microsoft/DirectXTK/wiki)では，今回書いたチュートリアルも含め，3Dオブジェクト，入力処理，オーディオなどいくつかのチュートリアルを閲覧できます(Englishだけど)．

また気が向いたらオーディオ関係とかシェーダー関係とか公式Wikiだけじゃ分かりにくい所の解説記事を投稿します．