SDLが1.2.15にバージョンアップしていたので合わせて更新しました。
sdl_1_2_15_0.zip
SDL本体以外のモジュールも更新しています。
-
D言語用 SDLモジュール version 1.2.15.0
2012年03月16日 20時33分comment (0) -
SDLモジュール (dmd 2.055対応)
2011年09月28日 00時54分 -
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つ同時に試したのでごちゃごちゃしてますが、
一応基本的なとこは動くのを確認しましたってことで。1 import core.runtime; 2 import std.c.windows.windows; 3 import org.libsdl.sdl; 4 import org.libsdl.image; 5 import org.libsdl.ttf; 6 import org.libsdl.net; 7 8 extern (Windows) 9 int 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(null, cast(char*)(o.toString() ~ '\0').ptr, "Error\0".ptr, MB_OK | MB_ICONEXCLAMATION); 27 result = 1; 28 } 29 30 return result; 31 } 32 33 // 画面サイズ 34 immutable int SCREEN_WIDTH = 640; 35 immutable int SCREEN_HEIGHT = 680; 36 37 void 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
次の様な単純に再生するコードのみ動作を確認しています。1 import core.runtime; 2 import std.c.windows.windows; 3 import org.libsdl.sdl; 4 import org.libsdl.mixer; 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 immutable int SCREEN_WIDTH = 640; 36 immutable int SCREEN_HEIGHT = 480; 37 38 void 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だからこの辺り困ってないのかな?