DXライブラリでゲームを作るぞ！【1.準備編】

## ０．はじめに
そうだ、C++でゲームを作ろう。どうせなら勉強になりそうだし、3Dゲームを作ろう。
そう思い立ち、アウトプットをしながら進めるとモチベーションにもなるかと考え、記事を執筆する。


## １．動作環境
+ Windows11
+ Visual Studio Community 2022 17.12.4
+ DXライブラリ Windows版 VisualStudio( C++ )用(最新暫定版)

## ２．VisualStudioのインストール
+ [Visual Studio インストーラー](https://visualstudio.microsoft.com/ja/vs/older-downloads/)をダウンロード
+ 上記インストーラーに従い、インストール

## ３．DXライブラリのインストール
+ [DXライブラリのダウンロードページ](https://dxlib.xsrv.jp/dxdload.html)にて「ＤＸライブラリ Windows版 VisualStudio( C++ )用」をダウンロード。
+ ダウンロードしたzipを展開し、展開して作成された「DxLib_VC」を任意の場所に移動（私はCドライブ直下に配置）

※注意※
Visual Studio Community 2022 17.12.3Ver以上だと、DXライブラリをインクルードするとIntelliSenceが動作しないという不具合があるらしい。その場合は暫定最新版を使用する。以下のリンクから取得可能。
https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5726

## ４．プロジェクトの作成
+ Visual Studioを起動
+ 「新しいプロジェクトの作成」押下
+ 「空のプロジェクト」押下後、「次へ」を押下
+  任意の「プロジェクト名」、「場所」、「ソリューション名」を記入し、「作成」を押下

## ５．プロジェクトの設定
+ 「ソリューションエクスプローラー」の「ソースファイル」を右クリックし、[追加][新しい項目]を選択し開く![スクリーンショット 2025-02-09 014952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/80226142-a6e7-3141-807c-5bd1f604072a.png)
Main.cppを作成する
![スクリーンショット 2025-02-09 015030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/98203c95-f172-660d-4e54-6676743bdc8e.png)
+ [構成プロパティ][C/C++][全般]の「追加のインクルードディレクトリ」に、DXライブラリのインクルードディレクトリパスを追加
※Cドライブ直下に展開した場合、C:\DxLib_VC\プロジェクトに追加すべきファイル_VC用
![スクリーンショット 2025-02-09 015223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/01d31c96-6467-5a2b-1ce3-864fd0253140.png)
+ [構成プロパティ][リンカー][全般]の「追加のライブラリディレクトリ」に、先ほどと同じDXライブラリのライブラリディレクトリパスを追加
![スクリーンショット 2025-02-09 015306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/068374e9-c191-326b-5b3a-6f5821ca4008.png)
+ [構成プロパティ][リンカー][システム]の「サブシステム」を、Windows(/SUBSYSTEM:WINDOWS)に変更
![スクリーンショット 2025-02-09 015337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/3dd9af05-93ec-4fcb-a40e-07ad5c08b88c.png)

## ６．動作確認
　まずは設定用モジュールとして、ProjConf.hを作成する。
「ソリューションエクスプローラー」の「ヘッダーファイル」を右クリックし、[追加][新しい項目]を選択し、追加する。
![スクリーンショット 2025-02-09 015410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/f1220ee4-6422-98f5-79c6-617b8426e85e.png)
![スクリーンショット 2025-02-09 015438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/5836130b-535e-6a2f-a61c-39e865adfa7c.png)

　ProjConf.hではウィンドウ設定の定数を定義。
```cpp:ProjConf.h
#pragma once

/*** ウィンドウ設定 ***/
#define WIN_MAX_X 660			// ウィンドウの横幅
#define WIN_MAX_Y 450			// ウィンドウの縦幅
#define WIN_POS_X 0				// ウィンドウの初期位置X
#define WIN_POS_Y 0				// ウィンドウの初期位置Y
```

　次に、メインモジュールとしてMain.cppを作成する。
![スクリーンショット 2025-02-09 014952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/35428d4b-7dc1-a6a5-84b6-c27225868cc6.png)
![スクリーンショット 2025-02-09 015030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/ef4e853a-0e5a-155f-8b0b-9fcfa91d972b.png)

Main.cppは、

+ メイン関数（wWinMain）
    * ウィンドウの初期化
    * メインループ処理（今は何もしない）
    
を実装する。

```cpp:Main.cpp
/*** Header File ***/
#include "DxLib.h"
#include "ProjConf.h"

int APIENTRY wWinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR ipCmdLine,
    _In_ int nCmdShow) 
{

	ChangeWindowMode(TRUE);							// ウィンドウモードで起動
	if (DxLib_Init() == -1)							// ＤＸライブラリ初期化処理
	{
		return -1;	// エラーが起きたら直ちに終了
	}

	/*** Window Init ***/
	SetWindowText(L"TEST GAME");					// ウィンドウのタイトル
	SetWindowInitPosition(WIN_POS_X, WIN_POS_Y);	// ウィンドウの位置
	SetGraphMode(WIN_MAX_X, WIN_MAX_Y, 32);			// ウィンドウのサイズ
	SetBackgroundColor(255, 255, 255);				// ウィンドウの背景色
	SetDrawScreen(DX_SCREEN_BACK);					// 描画先画面を裏画面にする
	SetAlwaysRunFlag(TRUE);							// ウインドウ非アクティブ状態でも処理を続行する

	/*** ループ処理 ***/
	while (ScreenFlip() == 0 &&		// 裏画面の内容を表画面に反映
		ClearDrawScreen() == 0 &&	// 画面を初期化
		ProcessMessage() == 0)		// ウインドウのメッセージを処理
	{

		/* 本処理 */

	}

    WaitKey();

	DxLib_End();					// ＤＸライブラリ使用の終了処理

	return 0;						// ソフトの終了 
}
```

　F5キーでビルドをして、ウィンドウが無事起動すればDXライブラリの導入に成功している。
![スクリーンショット 2025-02-09 020853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491151/5a2718e3-f991-aae9-85bb-109f756d8a3c.png)

## ７．さいごに
　今回の記事では、とりあえずDXライブラリを導入してみた。次回から、本格的にゲーム制作に入っていきたい。

余談
　WinAPIのエントリーポイントとしてWinMainとwWinMainが使用できるが、この二つの違いは文字列の扱いにある。前者はANSI文字列が、後者はUnicode文字列が引数として渡されるらしい。
　Windowsが標準でUnicodeを使用するようになった現在ではwWinMainが推奨されているため、この記事ではwWinMainを使用した。
　でもぶっちゃけどちらを使ってもあまり変わらないと思う（WinMainを使っている記事の方が多く見受けられるし）


## ８．参考にさせていただいた記事
https://qiita.com/nekoshiki0904/items/7a948220da0ac6f1677f

https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/winmain--the-application-entry-point