プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

DirectXのプロジェクト設定方法

DirectXのプロジェクト設定方法

※以前部活のためにHTMLで作ったものをそのまま乗っけたので情報が少し古いですしコードの部分がすごいことになってるのを確認しましたがご了承ください 。

対象


C言語を学び終えてC++も学び終えてかつゲームを作成してなおゲーム会社へ行きたい人もしくは技術の高い向上を
望んでいる人が対象となります。
Visual Studio 2015または2017を使用しての説明となります。





目的


 上を目指す人を対象としたDirectXの設定方法を説明します。





構成


No.1 DX9を扱うためのDirectX SDKのダウンロード
No.2 DX10以降を扱うためのWindows Kitのダウンロード
No.3 プロジェクトの設定







本編


 今回はDirectXを扱うための導入について説明します。ちなみに画像を多く使って説明します。





                  No.1 DX9を扱うためのDirectX SDKのダウンロード


 以下のURLからDirectX SDKをダウンロードしてください。

Download DirectX Software Development Kit from Official Microsoft Download Center

 というサイトへ移動してください。以下のようなサイトへ移ると思います。
違うようなサイトもしくはサイトがなかった場合は「DirectX SDK ダウンロード」と検索してダウンロードしてください。
1

 そのサイトにある「Download」を押して始めてください。以下は画像で説明します。

2

3

4

5

6

7

8



 ダウンロード済みなのでここからは端折りますが次へなどあればそのまま進んでください。
ダウンロードが終わりますと以下のディレクトリにMicrosoft DirectX SDK(June 2010)があるはずなので確認してください。


9


 これでダウンロードは終了です。





                  No.2 DX10以降を扱うためのWindows Kitのダウンロード


 Widnows Kitのダウンロードの説明をしますが、パソコンによっては既に入ってる場合があるのでまず確認してください。

19

 上の画像のような場所に移動してください。
C→Program Files(x86)→Windows Kit→10→Include→へ移ってください。

 人によって違うと思いますがその中にあるフォルダの名前を確認してください。
その中で一番バージョンが新しいものを覚えといてください。
画像の場合は「10.0.16299.0」です。

 以下のURLから移動してください。

Windows 10 SDK - Windows アプリ開発

 というサイトへ移動してください。以下のようなサイトへ移ると思います。
違うようなサイトもしくはサイトがなかった場合は「Widnows SDK」と検索してください。

20

 画像の赤の部分の数字を見てください。
そしたら先ほどのディレクトリで覚えてくださいといった数字があると思いますがそれと比較してください。
それでサイトのほうが新しいバージョンだった場合は下をそのまま進めてください。
もし、サイトと同じ数字だった場合はNo.3 プロジェクトの設定
へ飛んでください。


サイトの方が新しいバージョンだった場合の説明を始めます。
16

 そのサイトにある「.EXEをダウンロードする」を押して始めてください。以下は画像で説明します。

17

18



 ダウンロード済みなのでここからの細かい説明を出来ませんが次へなどあればそのまま言われた通り進んでください。


ダウンロードが終わりましたら先ほどと同じディレクトリへ移って最新バージョンが入っていることを確認してください。それでダウンロードは終了です。


 これでダウンロードは終了です。





                  No.3 プロジェクトの設定


 以下のサイトで勉強してください。私も最初はこのページからDirectXを始めましたし最初としてはいいサイトだと思います。

DirectX講座0回 - K3 計算技術研究会

 ですがバージョンや環境の古さが相まって大変なことになると思いましたのでNo.1またNo.2としてダウンロードを設けました。
DxLib同様DirectXにもプロジェクトの設定がいりますのでそれだけでも説明しようと思います。
ですが、上のリンクのページでそれらを学ぶのはありです。
また、先に話しますとこのサイトではDirectX SDKの導入の説明しかしておらずWindows SDKの説明はしていません。なぜ、私は導入をさせたか。なぜ、このサイトでは一切触れていないか。 疑問に感じると思いますので軽く説明しようと思いますが、とりあえずこのNo.3の目的を完遂したいので後で説明します。


 まず、Visual Studioを起動して新しいプロジェクトを作成してmain.cppを表示したところまでやってください。 お伝えしなおしますが今ページはC言語及びC++の最低限を学び終えDxLibでゲームを作成したことがある人が対象です。

プロジェクトの設定なので画像で簡単に説明します。


10

12

13

14

15

21

22

23

24


これで初期設定は終了です。

 それで設定がうまくいってるのかを確認するために以下のコードをひとまずコピペでテストしてください。
今は特に勉強してない段階、ただの設定の段階なので中身は無視しますがこの設定を終えたら中身の意味を全部理解してもらいます。




	// Direct3Dに必要なヘッダーとライブラリ

	#define D3D_DEBUG_INFO	// Direct3Dデバックフラグ
			
	#pragma comment(lib, "d3d9.lib")
	#pragma comment(lib, "d3dx9.lib")
	#pragma comment(lib, "d3dxof.lib")
	#pragma comment(lib, "dxguid.lib")
	#pragma comment(lib, "winmm.lib")
	#include <comdef.h>
	#include <d3d9.h>
	#include <d3dx9.h>
	#include <mmsystem.h>

	#include <Windows.h>
	#include <tchar.h>
			
	// ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う
	LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
		
		switch(msg){
			// ウィンドウが破棄されたとき
			case WM_DESTROY:
				PostQuitMessage(0);	// WM_QUITメッセージをメッセージキューに送る
				return 0;
		}
		// デフォルトのメッセージ処理を行う
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}
			
	// WinMain関数(アプリケーションの開始関数)
	// コンソールアプリケーションと違い、コンソールを開かない
	int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
	{
		const TCHAR* WC_BASIC = _T("BASIC_WINDOW");
		// シンプルウィンドウクラス設定
		WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,WndProc, 0,0,hInstance,
			(HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED),
			(HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), 
			(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL};
			
		// シンプルウィンドウクラス作成
		if(!RegisterClassEx(&wcex)) 
			return false;
			
		// ウィンドウ幅、高さはディスプレイに依存する。普通は4:3
		const int WINDOW_WIDTH = 640;
		const int WINDOW_HEIGHT = 480;
		// ウィンドウの作成
		HWND hWnd = CreateWindowEx(0,WC_BASIC,
			_T("Application"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
			CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);
			
		//      Direct3Dの初期化
			
		IDirect3D9*		pD3D9 = NULL;		// Direct3Dバイス生成用オブジェクト
		IDirect3DDevice9*	pDevice3D = NULL;	// Direct3Dのデバイス
			
		// Direct3D9オブジェクトの作成	
		pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);	
		// ディスプレイ情報取得
		D3DDISPLAYMODE Display;
		pD3D9->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &Display);
			
		D3DPRESENT_PARAMETERS	D3DParam = {			// スワップチェイン設定
			WINDOW_WIDTH,WINDOW_HEIGHT,Display.Format,1,D3DMULTISAMPLE_NONE,0,
			D3DSWAPEFFECT_DISCARD,hWnd,TRUE,TRUE,D3DFMT_D24S8,0,0,D3DPRESENT_INTERVAL_DEFAULT
		};			
		// HALモードで3Dデバイス作成
		if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, D3DParam.hDeviceWindow,
			D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
		if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DParam.hDeviceWindow,
			D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
		// REFモードで3Dデバイス作成
		if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, D3DParam.hDeviceWindow, 
			D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
		if (FAILED(pD3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, D3DParam.hDeviceWindow, 
			D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &D3DParam, &pDevice3D)))
		{
			// 3Dデバイス作成失敗
			pD3D9->Release();
			return -1;
		}
			
		// メッセージループ
		MSG msg = {}; 
		while(msg.message != WM_QUIT) {
			// アプリケーションに送られてくるメッセージをメッセージキューから取得する
			if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
				DispatchMessage(&msg);	// アプリケーションの各ウィンドウプロシージャにメッセージを転送する
			}
			// メッセージ処理をしていないとき
			else{
			//(ここにDirectXの処理を書く)
			
				// 描画開始
				if(SUCCEEDED(pDevice3D->BeginScene()))
				{
					DWORD ClearColor = 0xff808080;	// 背景クリア色
					// 背景クリア
					pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 );
				
					// 描画終了
					pDevice3D->EndScene();
				}
				// 描画反映
				pDevice3D->Present( NULL, NULL, NULL, NULL );
				}
			}
			// DirectXの変数は必ず後処理をすること
			pDevice3D->Release();
			pD3D9->Release();	
			return 0;
		}
		


 エラーなく実行できていれば設定はちゃんとできています。エラーが出た場合は何かしらでミスっています。


 以上で今回の説明は以上となります。




※補足1
 めんどくさいことをさせてしまった結果、困ったことに陥れやすい可能性があると思うので補足をします。

25

例えば、「d3d9.h」をインクルードさせようとすると上の画像のように二つ出てしまうと思います。理由としてはWindows KitとDirectX SDKを設定したためです。 ですが、Windows KitのほうではDirectX9を標準搭載していません。なので上のように二つ出てしまった場合はそれがどっちの「d3d9.h」なのかを確認してから インクルードしてください。それで上記のサイトで学ぶためDirectX9を扱う場合は「DirectX SDK」のほうでインクルードさせてください。お兄さんとの約束だぞ。


※補足2
 確か「No.3 プロジェクトの設定」でのちに説明するといった話があったと思います。それを説明および補足します。

 まずDirectX SDKについて説明します。
 みなさんに最初に導入させた「DirectX SDK」があると思いますが、あれはもう更新もされなければ扱っている人はほぼいません。 それについてまず説明すると、DirectX SDKWindows SDKに統合されました。それに伴ってDirectX SDKは本来必要ありません。
 ですが、みなさんに導入させた理由としては「DirectX9」を使って勉強してもらうためです。 では、統合された「Windows SDK」のみで「DirectX9」が扱えるとまず疑問に思うはずですがそれにもお答えします。
 みなさんが使っているパソコンのOSはWindows10だと思います。単刀直入に言いますと、その「Windows10」ではDirectX9のゲーム及びソフトは起動できません。 では、逆に起動してるのはなぜかと思いますが、それはDirectX9のためのランタイムライブラリを入れているパソコンだからです。標準では入っていないのが現状です。 実際、ゲーム会社に送ったゲームがDirectX9で作られていたため起動できずひと手間必要となり減点された例があると聞きます。
 ここまででわかると思いますが、そんな環境の中で「Windows SDK」にはDirectX9で開発するためのものは入っていません。ただそれだと補足1が嘘をついてるとなるので細かく言うと DirectX9をサポートするものはWindows SDKに入っています。ただそれだけで完璧に作れません。加えて言うとWindows Vistaが終わっている今、DirectX10もそのうち消えます。
 じゃあ!なんでDirectX9をやらせんだよ!!って思うと思いますが補足4で説明します。


※補足3
 次にWindows SDKについて説明します。
 これを導入する際にみなさんにディレクトリを確認させてバージョンを見てもらいました。
Windows Kitはみなさんのパソコンに何かしらのバージョンが入っていたと思います。
なぜ入ってたかと申し上げるとVisual Studioを導入した際にWindows Kitが入れられています。C/C++に関する項目を入れた際に入れられているはずです。
ですがバージョンが低い可能性もあったので上の項目でWindows SDKの導入をさせました。
 それでWindows SDKを入れさせてバージョンを最新にさせた理由ですが、個々人でDirectXの11/12を勉強する際にすぐとっかかれるようにと配慮しました。 つまり今回DirectX9を勉強してそれで終わりでいい人にとっては不必要なことをさせました。


※補足4
 先に指定したページではDirectX9を使った2Dのゲームを作ってもらいます。

 加えて今回使うDirectXはDirectX9です。2017年現在ではDirectX11が市場で出ています。開発としてはDirectX12を扱える状態です。
ですが、初めてDirectXを使う人にとってはDirectX9以降だと困惑することや初期化の内容がDirectX9を学ぶより多いのでDirectX9で行ってもらいます。
これを完璧にしたらDirectXに強くなります。完璧というのはやってる処理の内容を全部把握して関数や構造体の意味を理解するという意味です。いや、もっとそれ以上かもしれないですが。


あと本当に補足すると指定したサイトが一番DirectXを始めて勉強するのに適していると感じたからです。私もDirectXはそこ出身です。



ただここまで説明しても納得いかず独自で勉強しようと思う人がいるかもしれませんが別にそれでもかまいません。特にお助けできませんが。
いや、でも実際いろいろな場でDirectXを勉強することに関してバージョンのことで討論はよくなされています。DX9から始めるのかDX11から始めるのかなど。 なので一概には言えないのが現状です。ただ、私はDX9から勉強始めるのを強く勧めます。