D言語によるマルチプラットフォームなゲームライブラリバインダ Derelict3の使い方

# 1. D言語コンパイラ（[Digital Mars D](http://dlang.org/download.html) / [GNU D Compiler](https://github.com/D-Programming-GDC/GDC) / [LLVM D Compiler](https://github.com/ldc-developers/ldc)）の最新版をインストール
　最初の一歩ですね。
D言語自体が初めてな方は公式かつWindows/Mac/Ubuntu/Debian/Fedora/OpenSUSE向けのインストーラが存在するDigital Mars D（DMD）が一番楽だと思われます。
　DMDの各OS向けチュートリアルはこちらです。[Windows](http://www.kmonos.net/alang/d/dmd-windows.html)/[Mac OSX](http://www.kmonos.net/alang/d/dmd-osx.html)/[Linux](http://www.kmonos.net/alang/d/dmd-linux.html)

# 2.Derelict3のビルド
1. [公式リポジトリ](https://github.com/aldacron/Derelict3 "aldacron/Derelict3")から最新のDerelict3ソースをダウンロード

2. `Derelict3/build`に移動

3. `dmd build.d`でビルドスクリプトをコンパイル（dmdの部分は使用するコンパイラによって変えましょう）

4. Windowsなら`build`、POSIX準拠OSなら`./build`でビルドスクリプトを実行すると`Derelict3/lib`にビルドしたOS向けの全ライブラリファイルが出力されます（`build -version=Shared`とすると共有ライブラリ形式で出力されます）

5. `Derelict3/import`, `Derelict3/lib`をコンパイラが参照しているimport, libディレクトリに移動するか、コンパイラの参照パスに追加しておく

6. Derelict3で参照したいライブラリのダイナミックライブラリファイルを用意する（動的バインダなので実行時に必須となりますが、逆にライブラリ側の準備はこれだけで終了です）

# 3.ソースコードを書く
　今回はシンプルに[SDL2](http://wiki.libsdl.org/moin.cgi/MigrationGuide)にしました。

```d:simpleSDL2.d
import derelict.sdl2.sdl;

void main()
{
	/+
		Derelict3でSDL2を初期化する。
		Derelict3/libのビルド時に参照ファイルがOSによって変わっているので、
		ユーザーソースやコンパイルスイッチ等での再指定は不要。
		ライブラリのバインドに必ずDerelictUtilが用いられているので、
		ビルド時にリンクを追加し忘れないことだけ注意。
	+/
	DerelictSDL2.load();
	/+
		以下でSDL2の関数をそのまま利用することができる。
		他のライブラリを用いる場合もimportを追加し、
		　DerelictSFML2.load()
		　DerelictGLFW3.load()
		のように書けば同様に利用可能
		ちなみにunload()はデストラクタで実行。
	+/

	SDL_Init(SDL_INIT_VIDEO);

	// デスクトップ中央にウィンドウを作成
	SDL_Window* window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED,
										  SDL_WINDOWPOS_CENTERED, 800, 600,
										  SDL_WINDOW_SHOWN);

	// イベントが来るのを待つだけの単純なループ
	bool running = true;

	while (running)
	{
		SDL_Event e;

		while (SDL_PollEvent(&e))
		{
			switch (e.type)
			{
				case SDL_KEYDOWN,SDL_QUIT:
					running = false;
					break;

				default:
					break;
			}
		}
	}

	SDL_DestroyWindow(window);
	SDL_Quit();

	return; // 無事終了
}
```

# 4.ビルドと実行
　コンパイラのimportディレクトリにDerelict3のimport/derelictフォルダが正しく指定されていて、カレントディレクトリにDerelict3のスタティックライブラリファイルがあることを前提にしています。ビルドコマンドは以下のようになりますがこのライブラリ名はMacの場合で、Windowsの場合はlibDerelictSDL2.aをDerelictSDL2.libのように変える必要があります。
　**また、各importファイルは内部でDerelictUtilをimportしてライブラリの読み込みに利用しているため、Derelict3を利用したプログラムのビルドにはDerelictUtilのリンクが必須となるので注意してください**

　　`dmd simpleSDL2.d libDerelictUtil.a libDerelictSDL2.a`

　またDerelict3は動的バインダなので当たり前ですが、SDL2のライブラリが存在しないとプログラムを実行出来ません。Macの場合はlibSDL2.dylibを`/usr/local/lib`に置くか、SDL2.Frameworkを同一app内の`/Frameworks`か、コンピュータの`/Library/Frameworks/`に置いておく必要があります。
　Windowsの場合はDerelict3のgithubリポジトリに置いてあるSDL2.dllをexeと同じフォルダに置くのが一番確実です。
　必要なファイルを用意した上でプログラムを実行します。

　　`./simpleSDL2`
　
　これで何かのキーを押すかウィンドウの×ボタンを押すと終了するだけのSDL2プログラムが動作します。D言語なのにウィンドウプログラミングに成功した時点で感慨深いでしょう。
Derelict3にはSDL2以外にもGLUTに代わるOpenGLフレームワークの[GLFW3](http://wiki.glfw.org/wiki/Roadmap_for_GLFW)、高品質フォントレンダラの[FreeType](http://www.freetype.org/)、OpenALベースのオーディオ再生ライブラリ[ALURE](http://kcat.strangesoft.net/alure.html)、オープンソースの物理演算エンジン[Open Dynamics Engine](http://www.ode.org/)、多数の3Dモデルフォーマットを読み込める[Assimp](http://assimp.sourceforge.net/)などゲーム開発に使えるマルチプラットフォームかつ実用的なライブラリのバインドに対応しているので、D言語でも今日からゲームプログラミングを始められます。

# 5.終わりに
　ここまでの文章を読んで気付かれた方も居るかと思いますが、SDL2は2013年1月現在まだ正式版ではありません。
SFML2もGLFW3も同じく正式版ではありません。
Derelict3自体もALPHAバージョンと断言しています。

　ですが、Derelict3は上記のように非常にシンプルな構文でD言語からC言語製のマルチメディアライブラリを利用可能で、入門も実用も兼ね備えた設計になっています。
Derelict3はOpenGLライブラリFreeGLUTの安定版2.8.0にも対応していますし、SFML2は現在RCバージョンで近いうちに正式版がリリースされます。そのため、ライブラリがバギーで使い物にならないと言ったこともほとんどありません。

　ゲームやマルチメディアアプリケーションを作りたいのでネイティブコードのD言語に興味があったけど、使えるライブラリが分からなくて触っていなかった。という方はDerelict3でD言語に触ってみてはいかがでしょうか。
本記事では触れていませんが、[D言語 Advent Calender](http://qiita.com/advent-calendar/2012/d)などを見るとネイティブコードを生成する言語としてはかなり高機能（ユニットテストも内蔵）でDオリジナルのライブラリも増えつつあることが窺えると思います。
　現在はVisual Studio（2005-2012）でD言語開発が行える[Visual D](http://www.dsource.org/projects/visuald)や、マルチプラットフォームIDEのMono Developで使える[Mono-D](http://mono-d.alexanderbothe.com/)が作られていて、最近流行りの[Sublime Text 2](http://www.sublimetext.com/)もD言語に標準対応しているのでコーディング環境も整っています。