唐突になにか作りたくなったのですが、「コレが作りたい!」っていうものはありません。
で、特に理由もなくD言語で3Dをやろうと思いつきました。
D言語は「ぼくのかんがえたさいきょうげんご」に最も近い言語なので好きなのですが、仕事で使うこともないので詳しくはないです。
3Dプログラムもさっぱりです。DXライブラリでMMDモデル読み込んで遊んだことがある程度。Seleneでもちょっと遊んだか。
で、最初DirectX使おうと思ってググってみて、すぐヒットした傾き指向プログラミングさんのD言語用DirectXモジュールを使おうとしたけど、サンプルのテトリスがどうにもビルドできなくてあっさり挫折。
dmdのバージョンが不味いのかなぁ。2.064.2なんだけど。
まぁこっちはまたいずれチャレンジするとして。
仕事としてAndroidが視野に入ってきたので、そっちで役立てられる可能性があるOpenGLを覚えよう!と思い立ち、まずSDLをやることにしました。
以下、環境設定その他の健忘録
まずはビルドに必要なモノを揃える
DMDをD言語本家から。現時点での最新バージョンは2.064.2。
DLしたら適当な場所に解凍しておく。
SDL.dllをSDL本家から。SDL1.2のRuntime LibrariesからSDL.dllを入手。
Development Librariesのほうはlibも入ってるけど、このlibはなぜか使えない(Not a Valid Library Fileって怒られる)ので使わない。
SDLのD用ポーティングモジュールを傾き指向プログラミングさんから。
DLしたら適当な場所に解凍しておく。
これにsdl.libとかも同梱されているので、こっちを使う。
コマンドラインは怠いのでVisual Dを使います。
Visual Dのインストールは上記リンク通りにやればOK.
うちはVisualStudio2010なので、以下ソレ用に書きます。
で、早速作り始める。
1.VisualStudioを起動して、[新しいプロジェクト]→テンプレートから[D]の[Windows Application]を選択して、ソリューション名等を決定する。
2.プロジェクトのプロパティで[構成プロパティ]→[Compiler]のAdditional Importsに、解凍したSDLポーティングモジュールの中のmodulesフォルダのパスを設定
3.プロジェクトのプロパティの[Linker]のLibrary Search PathにSDLポーティングモジュールの中のwindows\libフォルダのパスを設定。
4.[Linker]のLibrary Filesに、使用するlibを追加する。今回はSDL.libとopengl32.lib。
コードを書く。
下記コードは傾き指向プログラミングさんとこから丸パクリ。
ありがたやありがたや
module winmain; import core.runtime; import core.sys.windows.windows; import org.libsdl.sdl; import org.opengl.gl; extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result; void exceptionHandler(Throwable e) { throw e; } try { Runtime.initialize(&exceptionHandler); result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); Runtime.terminate(&exceptionHandler); } catch (Throwable o) // catch any uncaught exceptions { MessageBoxA(null, cast(char *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // failed } return result; } immutable int SCREEN_WIDTH = 640; immutable int SCREEN_HEIGHT = 480; int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* ... insert user code here ... */ //throw new Exception("not implemented"); if (SDL_Init(SDL_INIT_VIDEO) < 0) throw new Error("SDL_Init failed."); scope(exit) SDL_Quit(); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_OPENGL); if (screen is null) throw new Error("SDL_SetVideoMode failed."); glClearColor(0.0f, 0.5f, 0.0f, 0.0f); glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 1.0); for (;;) { SDL_Event event; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) return 0; } glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.5f, 1.0f); glVertex3f(100.0f, 100.0f, 0); glVertex3f(600.0f, 300.0f, 0); glVertex3f(50.0f, 400.0f, 0); glEnd(); SDL_GL_SwapBuffers(); } return 0; }
VSから実行する場合、ソースのある場所にSDL.dllを置くこと。
直接実行する場合は、実行ファイルと同じフォルダにSDL.dllを置く。
追記
上記ソースはDMD2.064.2だと24行目でコンパイルエラー(警告?)が出る。実行は可能。
一つ前の2.063.2だと出ないんだけど。
つかVisualDが生成するスケルトンコードなんだけどな。うーん。
さて、ここからだよなぁ。