• D言語用 SDLモジュール version 1.2.15.0

    2012年03月16日 20時33分
    SDLが1.2.15にバージョンアップしていたので合わせて更新しました。

    sdl_1_2_15_0.zip


    SDL本体以外のモジュールも更新しています。
  • SDLモジュール (dmd 2.055対応)

    2011年09月28日 00時54分
    dmd 2.055でコンパイル出来るように修正しました。

    SDL for D version 1.2.14.6
  • SDLモジュールをさらに更新

    2011年04月13日 23時15分
    情報をいただいたので修正しました。

    SDL for D version 1.2.14.4

    • ttfのUnicode系関数の引数をUint16からwcharに変更しました
    • mixerとimageのenumにaliasを追加しました
  • SDL_imageとSDL_ttfとSDL_netを追加

    2011年04月12日 00時25分
    あと使いそうなのがimage、ttf、netあたりでしょうか。とりあえず入れておきました。


    SDL for D version 1.2.14.3


    3つ同時に試したのでごちゃごちゃしてますが、
    一応基本的なとこは動くのを確認しましたってことで。
    1import core.runtime;
    2import std.c.windows.windows;
    3import org.libsdl.sdl;
    4import org.libsdl.image;
    5import org.libsdl.ttf;
    6import org.libsdl.net;
    7
    8extern (Windows)
    9int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    10{
    11    void exceptionHandler(Throwable e)
    12    {
    13        throw e;
    14    }
    15
    16    int result;
    17    try
    18    {
    19        Runtime.initialize(&exceptionHandler);
    20        scope (exit) Runtime.terminate(&exceptionHandler);
    21
    22        dmain();
    23    }
    24    catch (Throwable o)
    25    {
    26        MessageBoxA(nullcast(char*)(o.toString() ~ '\0').ptr, "Error\0".ptr, MB_OK | MB_ICONEXCLAMATION);
    27        result = 1;
    28    }
    29
    30    return result;
    31}
    32
    33// 画面サイズ
    34immutable int SCREEN_WIDTH = 640;
    35immutable int SCREEN_HEIGHT = 680;
    36
    37void dmain()
    38{
    39    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    40        throw new Error("SDL_Init failed.");
    41    scope(exit) SDL_Quit();
    42
    43    SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE);
    44    if (screen is null)
    45        throw new Error("SDL_SetVideoMode failed.");
    46
    47
    48    // 画像の読み込みと解放
    49    SDL_Surface* image = IMG_Load("hoge.png");
    50    if (image is null)
    51        throw new Error("IMG_Load failed.");
    52    scope(exit) SDL_FreeSurface(image);
    53
    54
    55    // SDL_netの初期化と解放
    56    if(SDLNet_Init() != 0)
    57        throw new Error("SDLNet_Init failed.");
    58    scope(exit) SDLNet_Quit();
    59
    60    // ホスト名からIPアドレスを取得
    61    IPaddress address;
    62    if(SDLNet_ResolveHost(&address, "ku6.jp\0".ptr, 80))
    63        throw new Error("SDLNet_Init failed.");
    64
    65    // TCP接続のオープンとクローズ
    66    TCPsocket socket = SDLNet_TCP_Open(&address);
    67    if (socket is null)
    68        throw new Error("SDLNet_TCP_Open failed.");
    69    scope(exit) SDLNet_TCP_Close(socket);
    70
    71    // HTTPリクエストを送信
    72    string message = "GET /SDL_net.txt HTTP/1.0\r\n\r\n";
    73    SDLNet_TCP_Send(socket, message.ptr, message.length);
    74
    75    // 結果を受信
    76    char[] buffer = new char[64 * 1024];
    77    SDLNet_TCP_Recv(socket, buffer.ptr, buffer.length - 1);
    78
    79    // 各行の先頭ポインタを収集しつつ改行コードを文字終端とする
    80    char*[] lines = [buffer.ptr];
    81    for (uint i; i < buffer.length - 1; ++i)
    82    {
    83        if (buffer[i] == '\r')
    84        {
    85            buffer[i] = 0;
    86            if (buffer[i + 1] == '\n')
    87                lines ~= &buffer[i + 2];
    88            ++i;
    89        }
    90        else if (buffer[i] == '\n')
    91        {
    92            buffer[i] = 0;
    93            lines ~= &buffer[i + 1];
    94        }
    95    }
    96
    97
    98    // TTFの初期化と解放
    99    if(TTF_Init() != 0)
    100        throw new Error("TTF_Init failed.");
    101    scope(exit) TTF_Quit();
    102
    103    // フォントの取得と解放
    104    TTF_Font* font = TTF_OpenFont("ipam.ttf", 16);
    105    if (font is null)
    106        throw new Error("TTF_OpenFont failed.");
    107    scope(exit) TTF_CloseFont(font);
    108
    109    // 各行のテキストサーフェスの作成
    110    SDL_Color color = SDL_Color(128, 255, 128);
    111    SDL_Surface*[] textSurfaces;
    112    foreach (line; lines)
    113        textSurfaces ~= TTF_RenderUTF8_Solid(font, line, color);
    114
    115
    116    for (;;)
    117    {
    118        SDL_Event event;
    119        while (SDL_PollEvent(&event))
    120        {
    121            if (event.type == SDL_QUIT)
    122                return;
    123        }
    124
    125        // 画像の表示
    126        SDL_BlitSurface(image, null, screen, null);
    127
    128        // テキストの表示
    129        SDL_Rect rect;
    130        for (uint i; i < textSurfaces.length; ++i)
    131        {
    132            rect.y = cast(short)(18 * i);
    133            SDL_BlitSurface(textSurfaces[i], null, screen, &rect);
    134        }
    135
    136        // 画面の更新
    137        SDL_UpdateRect(screen, 0, 0, 0, 0);
    138    }
    139}


    SDL_Netがイマイチ使い方よくわからんのですが、一応上のコードで動いてはいます。


    あと、SDL_xxxをいっぱい足していったら、DLLが15個も並びました。
    なんかドキドキします。
  • SDL_mixerを追加しました

    2011年04月10日 00時32分
    時代はSDLなんでしょうか。
    最近SDLの話をよく見かける気がします。



    乗るしかない このビッグウェーブに



    SDLは音声再生にSDL_mixerを使うものらしいので追加してみました。


    SDL for D version 1.2.14.2


    次の様な単純に再生するコードのみ動作を確認しています。

    1import core.runtime;
    2import std.c.windows.windows;
    3import org.libsdl.sdl;
    4import org.libsdl.mixer;
    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// 画面サイズ
    35immutable int SCREEN_WIDTH = 640;
    36immutable int SCREEN_HEIGHT = 480;
    37
    38void dmain()
    39{
    40    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    41        throw new Error("SDL_Init failed.");
    42    scope(exit) SDL_Quit();
    43
    44
    45    // SDL_Mixerの初期化と終了
    46    Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096);
    47    scope(exit) Mix_CloseAudio();
    48
    49    // ファイルの読み込みと解放
    50    Mix_Music* music = Mix_LoadMUS("hoge.ogg");
    51    scope(exit) Mix_FreeMusic(music);
    52
    53    // 再生と停止
    54    Mix_PlayMusic(music, 0);
    55    scope(exit) Mix_HaltMusic();
    56
    57
    58    SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE);
    59    if (screen is null)
    60        throw new Error("SDL_SetVideoMode failed.");
    61
    62    
    63    for (;;)
    64    {
    65        SDL_Event event;
    66        while (SDL_PollEvent(&event))
    67        {
    68            if (event.type == SDL_QUIT)
    69                return;
    70        }
    71    }
    72}



    SDL_mixer.libが例によってcoff形式でありますが、
    omf形式の物を所持していなかたので変換する必要がありました。

    そこで探してみたのですが、変換するプログラムがきちんとありました。
    digitalmars.D.announce - coffimplib tool
    COFFIMPLIB - Digital Mars

    ダウンロードはこちら (Digital Mars FTP)

    coff2omfとの違いがはっきりとはわからないのですが、
    coffimplibはインポートライブラリ専用の簡易版のようです。

    とりあえずSDL_mixer.libについては無事変換出来ました。

    みんなLinuxだからこの辺り困ってないのかな?