クラスまみれのゲームプログラミング入門

36:ライブラリにしてみよう

 いいかげん、この「クラスまみれのゲームプログラミング入門」のネタも尽きてきました。これは逆に言えば追加するような機能がもうほとんど残っていないともいえますので、これまでに制作してきたプログラムファイルをDLLファイルにして、様々なゲームプログラムで即座に使えるようにしましょう。ライブラリにすることで、新しいゲームを開発するたびにCGameObject.cppやCBGMusic.cppなどをコンパイルする手間を省けるので、導入の簡素化も実現できます。

プロジェクトを作成する

 Visual Studioの「新規作成→プロジェクト」を選択し、一覧の中から「Win32 プロジェクト」を呼び出します。その後表示されるアプリケーションウィザードでは、アプリケーションの種類に「DLL」、追加オプションに「空のプロジェクト」を選びます。

プロジェクトにファイルを追加する

 これまでに作成してきたクラスファイルをプロジェクトに追加します。間違って「winmain.cpp」を追加しないように。

定義ファイルを追加する

 DLLファイルにクラスに関する情報を格納するための宣言を行います。プロジェクトに「ClassGameDef.h」ヘッダを追加し、以下のように記入します。

ClassGameDef.h
#pragma once

#ifdef CLASSGAME_EXPORTS
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif

#pragma warning(disable:4251)

 もしDLL作成のプログラムからこの定義ファイルが呼び出されたのであれば、DLLにデータを埋め込む処理を、それ以外のプログラムから呼び出されたのであれば、DLLからクラスデータを取り込む処理を行わせるようにしています。また、3行目にある「CLASSGAME_EXPORTS」は作成したプロジェクト名によって変わりますので、どの名称を使うかはプロジェクトのプリプロセッサプロパティで確認してください。


 STLをDLLの一部にしようとすると、エクスポートをするように警告が出されるのですが、この解決法は「std::vector」のみに用意されており、「std::list」などではどのようにしても警告をなくすことはできません。幸いSTLのリストはDLL内で完結しており、エクスポートをしないことによる問題は発生しないので、9行目でエクスポート警告を出力しないように設定しています。


高速モバイル通信がこんなに安い!【イー・モバイル】月々1,000円〜

定義をクラスに埋め込む

 「ClassGameDef.h」で記述した定義をDLLにしたい定義に埋め込みます。まずは「GameObject.h」ファイルの先頭に「ClassGameDef.h」をインクルードします。他のファイルには「GameObject.h」がインクルードされており、従って「ClassGameDef.h」も自動でインクルードされるので、「ClassGameDef.h」のインクルードはこの1回のみで問題ありません。

GameObject.h
#pragma once

#include "ClassGameDef.h"

#include <tchar.h>
#include <windows.h>

#include <list>
using namespace std;

#include <dxerr9.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "dxerr9.lib")

#if _DEBUG
#include <crtdbg.h>
#define new  new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#endif

/* 以下省略 */

 続いて、DLLに出力したいクラスすべてに「DECLSPEC」を埋め込みます。

class DECLSPEC CGameObject ...
class DECLSPEC CBGMusic : public CGameObject ...
class DECLSPEC CDxFont : public CGameObject ...
class DECLSPEC CTexture : public CGameObject ...
 後はコンパイルをしてlibファイルとdllファイルが出力されればライブラリの完成です。