我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

DirectX11と戦ってみた【1日目】

ブログを書くのはかなり久しぶりです、八宝菜です。シャカイに入門してから自分の時間というのがほとんど持てなくなり、このままだとどんどん業務プログラミング(JAVAとかJAVAとかJAVAとか)に冒されていきそうなので、頑張ってコードとブログを書いて自我を保とうというのがこの記事の目的です。

なので、せっかくならガッツリしたやつでもやろうかと思い、DirectX11に手を出してみようと思います。




なんで今さらDirectX??

というのは至極真っ当な意見です。

近頃はゲームを作るときは何かしらのゲームエンジンを使って作るというのがだいぶ一般的になりました。

UnityやUE4などの超優秀な開発環境が無料で手に入るご時世、これらを使わない手はないわけです。マルチプラットフォームですし。

ただゲームが作りたいならこれらを触ればいいわけですね。なのでゲームが作りたいわけではないです。

大学の頃の先輩がDX11とC++でゴリゴリエンジンを書いていてカッケェーとなったというのが理由の7割です。
後の2割はDirectX Tool Kitという面白そうなライブラリを見つけたから。

directxtk.codeplex.com

色々DX11について検索してたら、どうやらこれを使おうぜというのが公式の見解だそうで。じゃあ使ってみようじゃないの、というわけで使ってみます。
後の1割は冒頭のとおりです。あれ、冒頭で言った割には低い?まあどうでもいいや

まあ、一応技術記事なので自分語りはこの辺にして本題へ。

まず何をすればいいのん??

あ、プラットフォームはWindowsです。一応。

ということはWINAPIを使うことは避けられません、というわけでまずはWINAPIのHello Worldをします。

Main.cpp

#include <Windows.h>

#include "Defs.h"

HRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wpara, LPARAM lparam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASS wc = { 0 };

	wc.hInstance = hInstance;
	wc.lpfnWndProc = wndproc;
	wc.lpszClassName = defs::CLASSNAME.c_str();
	wc.style = CS_HREDRAW | CS_VREDRAW;
	
	//ウインドウクラスの登録
	if (FAILED(RegisterClass(&wc))) {
		MessageBox(nullptr, TEXT("Failed Register Window"), TEXT(""), MB_OK | MB_ICONERROR);
		return E_FAIL;
	}
	//ウインドウスタイルを設定
	//基本的に窓の大きさは変えないので、WS_OVERLAPEDWINDOWから
	//ウインドウサイズの変更に関するフラグを消します。
	DWORD style = WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME | WS_VISIBLE;

	//ウインドウを生成。実は生成しただけでまだ表示してない。
	auto hwnd = CreateWindow(wc.lpszClassName, 
					TEXT("DirectX11 Test"), 
					style,
					0, 0, 1280, 720, //X座標、Y座標、Width、Height
					NULL, 0, hInstance, 0);
	
	if (hwnd == NULL) return 1;

	//ここでやっと表示
	ShowWindow(hwnd, SW_SHOW);

	MSG msg = {0};

	//メッセージループ
	while( WM_QUIT != msg.message)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}


	return 0;
}

//ウインドウプロシージャ
HRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch (msg)
	{
	case WM_CREATE:

		return 0;
	case WM_DESTROY:

		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hwnd, msg, wparam, lparam);
	}
}
Defs.h
#pragma once
#include<string>

namespace def
{
	using tstring = std::basic_string<TCHAR>;
	const tstring CLASSNAME = TEXT("DIRECTX11TEST");
}

これをVisual Studioでビルドして実行すると、白い画面が表示されます。されますよね!?
これからこいつに色々付け足していくわけですが、実はMain.cppにはこれからあまり手を加えません。
というわけで全くDirectX感のなかった1日目ですが、次回は地獄のデバイス作成をしてみようと思います。

それでは。