Help us understand the problem. What is going on with this article?

【dxlib-d】DXライブラリをDに移植してみた【3.21f対応】

これまでも何度かDに移植されてきたDXライブラリですが
最新版のDXライブラリに対応したポーティングライブラリがないので作成しました。

githubに上がっているのでご自由にお使いください。
dxlib-d自体の作成手順もリポジトリに同梱しています。

dxlib-d利用手順

必要なもの

  • DMD
    • LDCやGDCでの動作は未確認です
  • VisualC++
    • ライブラリファイルが必要です
  • 本家DXライブラリ本体
    • ライブラリファイルが必要です
    • VisualC++用のファイルを入手してください
    • 軽量化パッケージでも動きます
  • dxlib-d
    • dxlib.dが必要です

ビルド方法

ysnr氏によるdxlib4dや羽流布氏によるD言語版DXライブラリと違い、
スタティックライブラリを直接リンク(64ビット)する方式をとっています。
なお、3.16fの頃はUnicodeビルドを使用していましたが
3.21f時点でマルチバイト(UTF-8)に限定しています。
関数名は本家及びdxlib4dに合わせています。

  1. sc.iniの設定
    64ビットでのコンパイルができるように
    VisualC++のライブラリパスを指定してください

    [Environment64]
    LIB=(DMD自体のライブラリのパス)
    LIB=%LIB%;(VisualC++のライブラリのパス)
    
  2. ご自身のソースとdxlib.d、DXライブラリのlibファイル群を指定してコンパイル

    dmd -m64 source.d dxlib.d DxDrawFunc_x64 DxLib_x64.lib ...
    

    必要なlibは

    dir *x64.lib | findstr -v "_vs20 W_ DxUseCLib_"
    

    などで抽出できます。
    もっとも、pragma libを使用するなりMakefileを書くなりしたほうが良いでしょう。
    pragma libを使用したサンプルがリポジトリに同梱にしてありますので参考にしてください。

dxlib-dに使用されているD言語の最新(?)の技術

D2.066.0からextern(C++, namespace)が実装されたことにより劇的に自動変換を行いやすくなりました。
ただnamespace付きのexternを複数置くとconflictが発生してしまうので今後の修正に期待です。

3.21f対応にあたって

totoki-keiさんの記事を参考にさせていただきました。
https://gist.github.com/totoki-kei/7ff79c4bcac9f583771fdff57c073066

いずれ

  • DrawStringとかに.toStringzをつけなくても動作できるようにしたい
  • GetHitKeyStateAllなどの引数をubyte[256]でも受け付けるようにしたい

終わりに

まだまだ検証は行われていません。
コンパイルができることを目標にしたのでスクリプトの質もかなり雑です。
(予約語に近い変数名が出てきたらバグる可能性大です)
致命的なバグやもっといい変換方法がある場合はぜひ教えてくださいませ。
htodのアプデはよ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away