• D言語でSDL

    2011年03月12日 14時23分
    稀に需要があるようなので置いておきます。

    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をダウンロードするだけだと思います。


    モジュールについては下記のような簡単なサンプルプログラムだけは試しました。
    1import core.runtime;
    2import std.c.windows.windows;
    3import org.libsdl.sdl;
    4import org.opengl.gl;
    5
    6//--------------------------------------------------------------
    7// D言語でWindowsアプリを作るときの基本処理
    8
    9extern (Windows)
    10int 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(nullcast(char*)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION);
    28        result = 1;
    29    }
    30
    31    return result;
    32}
    33
    34
    35//--------------------------------------------------------------
    36// メインの処理
    37
    38// 画面サイズ
    39immutable int SCREEN_WIDTH = 640;
    40immutable int SCREEN_HEIGHT = 480;
    41
    42void 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のほうが慣れてて使いやすいなぁと思います。
  • ありがとうございます
    稀にダウンロードしてる者 2011年03月23日 22時38分 [編集]
  • バグってたりしたらこっそり教えてください。
    クロ 2011年03月24日 15時54分 [編集]
  • 2chでも書きましたが、ubuntu64bitで実行時にセグメンテーションエラーが出る不具合がありました。
    構造体についてたalign(4)を全部消したら正常に動きました。
    DirectXだけじゃなくて、ちゃっかりSDL+OpenGLもよろしくお願いいたします。
    こっそりじゃなくて申し訳ありません 2011年04月06日 00時49分 [編集]
  • たぶんorg.libsdl.sdlをimportすると他がpublic importされて一通りの機能がまるっと使えるのが正しいと思うんですが
    どうもちょいちょいimportされてないのがあるようです。keyboardとか。
    (CだとSDL.hからSDL_events.hがincludeされて、その中でincludeされている)

    個別にimportすればいいだけなので困りはしないんですが、一応報告させていただきます。
    wagi 2011年04月06日 08時21分 [編集]
  • お二方ともありがとうございます。
    ちょっとなおしてみます。
    クロ 2011年04月06日 19時07分 [編集]

コメントを書く

名前
本文
編集用パスワード
管理者のみ閲覧