唐突になにか作りたくなったのですが、「コレが作りたい!」っていうものはありません。
で、特に理由もなく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が生成するスケルトンコードなんだけどな。うーん。
さて、ここからだよなぁ。