https://alleg.svn.sourceforge.net/svnroot/alleg/bindings/dallegro/trunk/readme.txt の日本語訳。 これは、D言語のために配布される Allegroライブラリです。 VERSION ------- 4.2.2.0+ (SVN), for Allegro 4.2.2 必要要件 ------------ DMDコンパイラ 1.013以降 別のものとしてGDCコンパイラ0.24以降 もしTango( D言語の標準ライブラリphobos の後継となる標準ライブラリ)を利用しているなら より新しいバージョンのコンパイラを使うといいです。 デモのゲームDBlocks(D言語で書かれたテトリス)をビルドするには、最低限 DMD1.014またはGDC0.24が必要です。 DAllegroはまた DMDのバージョン2.x系列をサポートします。D言語(本体) は頻繁に更新されていますが、 少なくとも 2.012で動作しているようです。 D言語の2.013以降でビルドするためには コマンドラインに -d オプションを追加してください。 または volatile ラッパが-version=NoVolatile オプションで無効になります???? 後者の解決策は問題が発生する可能性がありますが、今のところでは問題には遭遇していません。 DAllegroは Phobos とTango(0.99.4〜0.99.7) 互換です。 現在のTangoの対応状況については サイトの更新情報を見てください。 サンプルプログラムのコンパイルに関して、 Windows環境では Bud または DSSS というビルドツールが必要です。 Unix環境では、GNU make が必要です インストール ------------ あなたは allegro ディレクトリを dmd/import ディレクトリに入れるか、 使いたいプロジェクトのあるディレクトリにコピーする必要があります。 dallegroディレクトリ内の他のディレクトリは DAllegroをビルドするのに必要ないので、そのままにしておいてください。 Windows: ライブラリファイルが dmd/lib内に来ます。 alleg42.dll and alld42.dll(デバッグ版)を あなたの作ったゲームの実行されるディレクトリにいれるか、 Windows/System32に入れてください。 後者(latter)の場合でインストールした場合、DallegroAPIを組み込んで作ったすべてのゲームから使う事が出来ます。 1. ftp://ftp.digitalmars.com/bup.zip をダウンロードして、解凍した implib.exe を任意のパスにおく. 2. 次のコマンドを実行 'implib /s alleg.lib alleg42.dll'. もし DAllegroの静的ライブラリが欲しければ make-lib.bat を使って作ることができます。 これを実行すると dalleg.libが作られるでしょう。 この方法では、Bud(ビルドツールの一種)は必要なく、GDCをサポートします。 さらに make-libに関する情報が必要なら make-lib help と打ち込みます。 Windows上でAllegroの サンプルプログラム、ツール、デモの実行させるためには 適切な名前のバッチファイルを使ってください。これらのバッチファイルは全てBud(というビルドツール)が必要です。 または、 DSSS(D Shared Software System D言語用のビルドツール) がインストールされている場合 'dsss build' とコマンドを打ってビルドしてください。 Unix: ライブラリにリンクさせるためには、最初に 正規のAllegroをコンパイルする必要があります。 どのようにするかは、Allegroのドキュメントを読んでください。 サンプルプログラムや他のプログラムをビルドするために単に引数を付けず 'make' を打ち込んで実行してください。 使い方 ----- 一つの例として、DBlocks(D言語のテトリス)というゲームのビルド方法を紹介します: bud dblocks\dblocks.d alleg.lib Budを使わないビルドするには、make-lib を使って作った .libファイルを使うことができます。 その作業をするためにdbocks のあるディレクトリに入ってください、そして: dmd dblocks board block blocktypes -I.. alleg.lib ..\dalleg.lib このようにbud は単純に 作成します。budは自分で必要なファイルを引いてきます。 コンパイルとリンク作業はすべて自動的に行われ、DAllegroのプリコンパイル版を必要としません。 D言語やDAllegroを始めるために、これらサンプルプログラムやDBlocksをよく調べてください。 D documentation starting points: http://www.digitalmars.com/d/1.0/lex.html http://www.digitalmars.com/d/1.0/phobos/phobos.html http://www.prowiki.org/wiki4d/wiki.cgi?LanguageSpecification/KeywordIndex Allegroと静的リンクする ------------------------------- Windows上でDMDを使って静的リンクを使用する場合、 DMC やDigital Mars C++ compilerでビルドしたAllegro が必要であります。 これは最も簡単にDMD互換な .lib ファイルを得る方法です DMCのサポートには Allegro4.2.2が追加されました。 DMCを使ってAllegroをビルドするために、'Allegro's build instructions'を見てください。 DMCでビルドされたAllegroライブラリを 静的リンクするために、必ず、DAllegroと あなたの作ったプログラムの両方に、 -version=STATICALLEGRO と -version=ALLEGRO_NO_ASM オプションを 付けてコンパイルしてください。 Windows上でGDC、または同じく Linux上で両コンパイラを使う環境で Allegroをリンクすると動作すると考えられます。 Windows上で DAllegroをビルドし、あなたのプログラムに -version=STATICALLEGROを付けると 反対に dllを除いたAllegro がリンクされます。   C言語と D言語のAllegroの違い ----------------------------------- DAllegroではAllegroにあった殆どの機能はC言語で使っているように動作します。 しかし一部違う点があります。 Allegro_id は char型の配列ではなく、char型のポインタとなります。 おそらく他の allegro_error, cpu_vendor, empty_string も同じです。 もし、あなたがこれを間違ってしまった場合でもコンパイラはそれを教えてくれます。 必要に応じてstd.string.toString() メソッドを使い、char型ポインタをD言語の String型に変換して下さい。 D言語の 文字列は通常 動的な文字配列です。 ALLEGRO_PLATFORM_STR, ALLEGRO_VERSION_STR, や ALLEGRO_DATE_STR は、読み出し専用の文字列配列型 'const char[]' として 宣言されます。 これらは、D言語1.0 , 2.0 共に '~' 演算子によって 連結することができます。 D言語の文字列をC言語の文字列に変換したい場合には .ptr属性を使うことができます。 D言語2.0 では char*(文字型ポインタ)でそれらをキャストすると C文字列が得られ、 定数としての性質(const-ness)は削除されます。 しかし、それらはまだC言語の文字列リテラルのように、読み取り専用変数として扱われます。 ほとんどのマクロは、ちょうど関数のように作られていて、殆どの場合においてうまく動作します。 その一つに、静的初期化のために compile-time functions(D言語 の普通の関数を実行時ではなく コンパイル時に実行する機能)として働く可能性があります。 Compile-time functions は DMD1.006で導入されました。しかし、幾つかの挙動は1.007でバグ修正される必要があります。 volatile として宣言された グローバル変数は D言語ではプロパティwrappersの中に格納されています。 これまで D言語では storage classとして volatile を持っておらず、文として持っています。 プロパティは、 getter と(または) setter 関数 から構成されますが、 変数構文として使うことができます。 その違いは、++ と -- 演算子が働かず、そのアドレスを取得する意味がないことです。 AL_RAND() は 標準C言語ライブラリから由来する rand() のエイリアスです。 もし D言語のstd.random.rand を使いたいなら違った範囲の結果が得られることに 注意(be aware)してください。 set_palette()は引数として、PALETTEの代わりに、RGB* をとるように宣言されています。 その後、 PALETTE を引数にとるD言語wrapperがオーバーロードされます。 これによって、あなたはC言語のようにそれを使うことができます。 al_long と al_ulong は、変数型のためのエイリアスで、C言語の long型 変数との相互互換性があります それは、Cライブラリを呼び出したり、C言語の long型変数を引数に持っている関数を定義する時に使います。 C言語の long型変数は環境により様々なサイズを持ち、D言語ではいつでも64bitです。 === エラーのチェック(Assert) === D言語では、'assert'はキーワードであり、例外処理システムと統合されて使います。 DAllegroは、Allegroライブラリの al_assert()は使わず、 D言語に付属した assert機能において排他的に依存します。 もし、Allegroの C言語デバッグ版をリンクしたければ、 まだ al_assert() を使っていることを心に留めておく。 ここに、D言語とAllegroのal_assert()も両方とも同じ方法でどのように扱うのかを示すコードを挙げます。 --- import std.string : toStringz; extern (C) int error_handler(char* msg) { /* allegro_messageを呼び出す前に、テキストモードを設定する必要があります( )*/ set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message(msg); exit(1); return 1; } int main(char[][] args) { try { // make al_assert call our error handler register_error_handler(&error_handler); /* ...ここに、何かコードを記述する... */ } catch (Object o) { // assertsを含めて、全ての例外をつかまえる。 error_handler(toStringz(o.toString())); } return 0; } --- If you don't do this, the uncaught exceptions will just get printed to stderr. Which is ok as long as there is a console available. プラットフォーム固有のAPIを使う場合 -------------------------------- === WINDOWS === Windows用のプラットフォーム固有のAPIを使うには、ただ allegro.winallegをインポートします。他にallegro.allegro します。 C言語版Allegroとは異なり、allegro.winalleg は windows APIをインポートしないので自分でする必要があります。 Phobos 付属の Windows ヘッダポート( std.c.windows.windows )は非常に不完全です。 このため、 allegro.winallegを使用したり、 Windowsに特化したテストを構築するには、そこから入手できる Windows APIヘッダポートをインストールする必要があります。 ここから入手できます: http://www.prowiki.org/wiki4d/wiki.cgi?WindowsAPI Tango では tango.sys.win32 パッケージ内のモジュールを使うことが推奨されています。 もし、推奨モジュールではない他のWindowsAPIモジュールを使うつもりなら、いくらかの型衝突が発生するかもしれないため、 allegro.winalleg を使うことが推奨されます。 もし、C/C++の WinMain 関数を使用する場合は、D言語で いくつかの初期化の追加とコードのクリーンアップが必要であります。 tests/win/ にあるサンプルプログラムでは、どのように DAllegroとWindowsAPIを起動させるかがわかります。 === UNIX === xwin_set_window_name 関数を得るには、allegro.xalleg をインポートして下さい。 C/C++ 言語からD言語へ移行する場合の雑多な事項(GOTCHAS ) -------------------------------------- === 文字列 === D言語の文字列リテラルは、デフォルトの動的な文字配列になっています。 それは、暗黙の文字ポインタを初期化子や関数の引数として使用されるときに変換されます。 ただし、これは、受け取る型が 引数のリストではなく、文字ポインタ と分かっている場合のみ働きます。 これはOK: puts("yeah"); //std.c.stdio(D言語のC互換モジュール)をimportし、C言語のputs関数を使う。 これは これはクラッシュする可能性(likely to)があります: printf("%s\n", "bummer"); // printf が参照を通して取り出した(dereferenceaaa)値は、ポインタではなく、文字列の長さを 代わりにこのようにして下さい: printf("%s\n", "yeah".ptr); // .ptr 属性は、データのポインタ。 D言語の文字配列は、一般にnull終端されていません。しかし、文字列リテラルは null終端されているので、 文字列の最後に手を加えてないなら、 null終端文字は、そのままであるでしょう。 別のケースでは、std.string.toStringz()を使う簡単な方法があります。 toStringzは文字列をコピーするので、高速に処理したい時に必要です。あなあは 文字列に自分でnull終端文字を 加えるだけです。: str ~= '\0'. D言語のwritefln()に char* を与えると、これは文字列代わりにアドレスを表示するのに注意して下さい。 だから適切なD言語の文字列に変換するために、std.string.toString() を使うことを思い出して下さい。 D言語の char[] の文字コードは utf-8です. もしユニコードの取得や扱いが必要なら、これらのページを読むとよいでしょう : http://www.prowiki.org/wiki4d/wiki.cgi?CharsAndStrs http://www.prowiki.org/wiki4d/wiki.cgi?DanielKeep/TextInD === エラー番号を示すグローバル変数(ERRNO) === Phobos(D言語標準ライブラリ(〜終息))を用いる場合、 std.c.stdlibをインポートし、getErrno() と setErrno()を使います。 Tango(Phobos後継となるD言語標準ライブラリ)ではtango.stdc.errnoをインポートし C言語と同じようにerrnoを使います。 Tangoの erron は int型ではありません、それは wrapperのプロパティのセットです。 そのため、そのアドレスを得る事は出来ません。 代わりに、プロパティ関数のアドレスを得るでしょう。 もし直接 install_allegro() を使いたいなら、errno_ptr 引数は使われないことに注意してください。 install_allegro()は、errono自身のアドレス取得の面倒をみるので、システム固有の方法で行う事ができます。 引数に 'null'を使うだけです。 === 静的な初期化 === もし、静的な初期化に依存(rely)するなら、 D言語では、すべてのものはゼロに初期化されると知っておいてください。 - 浮動小数点型がNaNに初期化されます。 - char 文字型は0xFF 、 wchar、dcharもまた、非ゼロのデフォルトの初期化子として初期化されます。 配列の要素全てをゼロで初期化するにはこのようにします: float[3] vector = 0; char[256] buffer = 0; いずれにせよ(In any case)、おそらくコードがその値に依存する場合において明示的に初期化するのに ベストな方法であります。 条件付きコンパイル(CONDITIONAL COMPILATION) ----------------------- ALLEGRO_NO_ASM Allegroにおいて、アセンブリコードはD言語に移植されていないが、このことはC言語のAllegroに与える影響は少なくしている。 これは グローバル定数やそれが '-version=ALLEGRO_NO_ASM' オプションを付けることによって有効にできます。 Allegroドキュメントに書かれてある通りに働くグローバル定数(Global constants): ALLEGRO_PLATFORM_STR ALLEGRO_VRAM_SINGLE_SURFACE ALLEGRO_CONSOLE_OK ALLEGRO_NO_ASM ALLEGRO_MULTITHREADED ALLEGRO_LFN OTHER_PATH_SEPARATOR DEVICE_SEPARATOR Allegroドキュメントに書いてある通りに働くバージョン識別子(Version identifiers): STATICALLEGRO ALLEGRO_NO_COMPATIBILITY ALLEGRO_NO_CLEAR_BITMAP_ALIAS ALLEGRO_NO_FIX_ALIASES ALLEGRO_NO_VHLINE_ALIAS グローバル定数は、条件付きコンパイルを遂行するために静的に使用することができます。 バージョン識別子は、OS環境や規格などの条件によって、含ませるコード を対応させるためのもので、バージョン設定文やコマンドラインから設定されます。 あるモジュールで設定されたバージョン識別子は、他のモジュールのコンパイルには影響しません。 Allegroの他の#defineのほとんどは、D言語の標準識別子によって変換されています。 DMDのための定義が、以下のページにリストされています: http://www.digitalmars.com/d/version.html. GDCはおそらくもう少し定義してます。 (原文の)クレジット ------- - Allegroライブラリを作った Shawn Hargreaves氏. - D言語とDMDコンパイラを作った Walter Bright氏. - Linuxにおいて Dallegroが動作する手助けしていただいた juvinious氏のおかげで 幾つかの例を翻訳してます。 - MacOSXのサポートを手伝っていただいた Anders F. Bjorklund氏. リンク ----- プロジェクトウェブサイト: http://www.dsource.org/projects/dallegro (原文の)作者: torhu at yahoo dot com http://alleg.sf.net http://www.allegro.cc http://www.digitalmars.com/d/1.0