SDLのD言語ポーティング
SDL 1.2.14ベースです。
OpenGLも入れておきました。
人間の手で作業している部分も多いので、使っていて何かおかしいと思ったら大体変換がおかしいと思います。
可能な限り直したいと思いますので、「ここなんか動かない」とか教えていただけると助かります。
ビルド環境は各自でご用意願います。
例えばビルドする場合はSDLのライブラリが必要です。(OpenGLを使う場合はOpenGLのも)
Windowsですと、本家のSDLに含まれるBorland.zip内のSDL.libが必要です。
OpenGLのlibはWindows SDKに含まれますが、COFF形式なのでcoff2omfで変換する必要があります。
coff2omfは昔はDigital Marsで無償ダウンロード出来たと思うのですが、
今は有償になったかリンクが切れてるかしているようです。
実行環境についても各自でご用意願います。
WindowsならばOpenGLの実行環境はあるはずなので、
SDL本家のWindows用DLLをダウンロードするだけだと思います。
モジュールについては下記のような簡単なサンプルプログラムだけは試しました。
| 1 | import core.runtime; |
|---|---|
| 2 | import std.c.windows.windows; |
| 3 | import org.libsdl.sdl; |
| 4 | import org.opengl.gl; |
| 5 | |
| 6 | //-------------------------------------------------------------- |
| 7 | // D言語でWindowsアプリを作るときの基本処理 |
| 8 | |
| 9 | extern (Windows) |
| 10 | int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
| 11 | { |
| 12 | void exceptionHandler(Throwable e) |
| 13 | { |
| 14 | throw e; |
| 15 | } |
| 16 | |
| 17 | int result; |
| 18 | try |
| 19 | { |
| 20 | Runtime.initialize(&exceptionHandler); |
| 21 | scope (exit) Runtime.terminate(&exceptionHandler); |
| 22 | |
| 23 | dmain(); |
| 24 | } |
| 25 | catch (Throwable o) |
| 26 | { |
| 27 | MessageBoxA(null, cast(char*)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); |
| 28 | result = 1; |
| 29 | } |
| 30 | |
| 31 | return result; |
| 32 | } |
| 33 | |
| 34 | |
| 35 | //-------------------------------------------------------------- |
| 36 | // メインの処理 |
| 37 | |
| 38 | // 画面サイズ |
| 39 | immutable int SCREEN_WIDTH = 640; |
| 40 | immutable int SCREEN_HEIGHT = 480; |
| 41 | |
| 42 | void dmain() |
| 43 | { |
| 44 | if (SDL_Init(SDL_INIT_VIDEO) < 0) |
| 45 | throw new Error("SDL_Init failed."); |
| 46 | scope(exit) SDL_Quit(); |
| 47 | |
| 48 | SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); |
| 49 | SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_OPENGL); |
| 50 | if (screen is null) |
| 51 | throw new Error("SDL_SetVideoMode failed."); |
| 52 | |
| 53 | glClearColor(0.0f, 0.5f, 0.0f, 0.0f); |
| 54 | |
| 55 | glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 1.0); |
| 56 | |
| 57 | for (;;) |
| 58 | { |
| 59 | SDL_Event event; |
| 60 | while (SDL_PollEvent(&event)) |
| 61 | { |
| 62 | if (event.type == SDL_QUIT) |
| 63 | return; |
| 64 | } |
| 65 | |
| 66 | glClear(GL_COLOR_BUFFER_BIT); |
| 67 | |
| 68 | glBegin(GL_TRIANGLES); |
| 69 | |
| 70 | glColor3f(1.0f, 0.5f, 1.0f); |
| 71 | |
| 72 | glVertex3f(100.0f, 100.0f, 0); |
| 73 | glVertex3f(600.0f, 300.0f, 0); |
| 74 | glVertex3f(50.0f, 400.0f, 0); |
| 75 | |
| 76 | glEnd(); |
| 77 | |
| 78 | SDL_GL_SwapBuffers(); |
| 79 | } |
| 80 | } |
実行結果

ちなみに私はDirectX派です。
Windowsのみ対応で良いならDirectXのほうが慣れてて使いやすいなぁと思います。