Haxeのゲームエンジン「Heaps」を使ってみる in HashLink


追記: bullet.hdll、bullet.lib、steam.hdll、steam.libのビルド方法を追記しました

先日の記事でHashLinkを使ってみた訳ですが、どうせならHeapsと一緒に使いたい!

という事で、Heapsリポジトリに載っているサンプルを動作させたいと思います。

Getting Started

Main.hx
package;

class Main extends hxd.App
{
  var bmp : h2d.Bitmap;

  override function init()
  {
    var tile = h2d.Tile.fromColor(0xFF0000, 100, 100);
    bmp = new h2d.Bitmap(tile, s2d);
    bmp.x = s2d.width * 0.5;
    bmp.y = s2d.height * 0.5;
  }

  override function update(dt:Float)
  {
      bmp.rotation += 0.1;
  }

  static function main()
  {
     new Main();
  }
}

HeapsをHashLinkで使用するには、hldxかhlsdlを併用する必要があります。
今回はhlsdlを使います。

build.hxml
-cp src
-dce full
-hl test.hl
-lib heaps
-lib hlsdl
-main Main


よし、コンパイルだ!

hl test.hl
src\module.c(311) : FATAL ERROR : Failed to load function sdl@gl_uniform_block_binding

んん?
なんか怒られてしまいました。

しかもmodule.cが原因とな。
私はHashLink 1.6.0のバイナリを直接ダウンロードして使っているのですが、そのバージョンに不具合があるみたいですね。


…仕方ねぇ。

自力でHashLinkビルドすっぞ!!!


HashLinkをビルドする

準備

そんな訳で、HashLinkを自分でビルドします。
そのうちリリースされるであろうHashLink 1.7.0では修正されるでしょうから、それまでのツナギです。

それに、Githubから入手できるバイナリは32ビット版のみ。どうせなら64ビット版が使いたいですし。

注: 今回の説明はWindows(x64)を使っている事が前提となっております。Linuxをお使いの方は、HashLinkリポジトリのREADMEを参考にしてください。

まず、HashLinkのビルドにはVisual Studioが必要です。Communityでも何でも良いので、インストールしてきてください。

次に、HashLinkの最新のソースコードをダウンロードします。
git clone https://github.com/HaxeFoundation/hashlink.gitしても良いですし、面倒ならzipで落としてきても良いでしょう。
今回は、~\Github\hashlinkにファイルがあるものとして進行します。

さて、このままではOpenALとSDL2のソースコードが不足しているので補充します。

OpenALの場合は、こちらのサイトよりopenal-soft-1.18.2-bin.zipを、
SDL2の場合は、こちらのサイトよりSDL2-devel-2.0.8-VC.zipを、それぞれダウンロードし、解凍します。

~\Github\hashlink\includeの中に、openalフォルダとsdlフォルダを作成しましょう。

そしてopenalフォルダに~\openal-soft-1.18.2-bin\include~\openal-soft-1.18.2-bin\libsを、
sdlフォルダに~\SDL2-2.0.8\include~\SDL2-2.0.8\libを、それぞれぶち込みます。

これで準備は終わりです。

ビルドする

さて、いよいよビルドに入ります。

とは言っても、普通にhl.slnをVisual Studioで開いて、x64向けにReleaseビルドするだけなんですけど。
32ビット版のWindowsを使っているのなら、Win32向けで。

少ししたらビルドが終了、~\Github\hashlink\x64\Releaseに下記のファイルが出力されているはずです。

ハイライトされているファイル以外は全部要らないので、消しちゃいましょう。
要するに.dll.exe.hdll.lib以外は消して構いません。

あと少し

~\Github\hashlink\x64\Releaseincludeフォルダを作成しましょう。
そして~\Github\hashlink\srcにあるhl.hhlc.hhlc_main.cの3つをぶち込みます。

最後に、HashLinkアプリケーションのパッケージ化に必要な幾つかのライブラリファイルを調達します。

まず、msvcr120.dll。これは必須です。
Visual C++ 2013 再頒布可能パッケージの中に含まれているdllで、インストール済みならC:\Windows\System32の中にあるはず。64ビット版Windowsだけどwin32向けにビルドしたよって人は、C:\Windows\SysWOW64にあるものを使います。。
msvcr120.dllを発見したら、~\Github\hashlink\x64\Releaseコピーしましょう。コピーですよコピー。大事なファイルですからね。
もしもmsvcr120.dllが見つからない場合は、Visual C++ 2013 再頒布可能パッケージをインストールする事で該当のパスに出現します。

以降は使用するライブラリに応じて必要となるファイルです。全部入れておくと安心。
ただし、Heapsを使うにはhldxかhlsdlのどちらかを併用する必要があるのでご注意を。

  • D3DCompiler_47.dll
    • hldxを使う場合に必要。.NET Framework 4.7に含まれています。
  • msvcp120.dll
    • hlsteamを使う場合に必要。Visual C++ 2013 再頒布可能パッケージに含まれています。
  • OpenAL32.dll
    • hlopenalを使う場合に必要。こちらのサイトからダウンロードできるOpenAL 1.1 Windows Installer (zip)に含まれています。

上記3つは、該当のプログラムがインストールされていればC:\Windows\System32(32ビット版の場合はC:\Windows\SysWOW64)にあるはずです。

  • bullet.hdllbullet.lib
    • hlbulletを使う場合に必要。~\Github\hashlink\libs\bullet\bullet.slnをビルドすると出力されます。
  • SDL2.dll
    • hlsdlを使う場合に必要。HashLinkをビルドした後に、~\Github\hashlink\include\sdl\lib\x64に残っているはずです。32ビット版なら~\Github\hashlink\include\sdl\lib\x86です。
  • steam.hdllsteam.lib
    • hlsteamを使う場合に必要。hlsteamをビルドすると出力されます。
  • steam_api.dll
    • hlsteamを使う場合に必要。Steamworks SDKの中に入っています。

上記を全て導入すると、↓のようになるはずです。

終わりです。

~\Github\hashlink\x64\Releaseを適当にリネームしたりどこかに移動させて、PATHでも通しておきましょう。
残った~\Github\hashlinkのファイルは要りませんので煮るなり焼くなりしてください。

完成!

お疲れ様でした。これで冒頭のサンプルプログラムが動作するはずです。


いやぁ、サンプル動かすだけでこんな大変な事になるとは思いませんでした。
HashLink 1.7.0でこの問題が改善されている事を願います。

ちなみに、普通に使う分には.hdllと.dllだけで事足りるはずなのですが、どこかのページに「HashLinkは動的ライブラリ使うけど、静的ライブラリを使うように設定する事もできるよ。OpenALはライセンス上できないけどね」みたいな事が書いてあった気がするんですよね。
なので、.libも念の為に残してあります。


追記

hlbulletとhlsteamを使用するには、それぞれのライブラリを自分でビルドする必要があります。

hlbulletを使用する

Bullet3のリポジトリから、ソースコードをダウンロードします。安定性を考えると、cloneするよりも最新のリリース(現在は2.87)を使う方が良いかもしれません。

~\bullet3-2.87\src~\Github\hashlink\include\bulletにコピーします。

後は~\Github\hashlink\libs\bullet\bullet.slnをVisual Studioでビルドするだけなのですが、そのままビルドしようとするとエラーを吐きます。
これは、Visual Studioがhllib.hを見つけられないのが原因です。

「プロジェクト」→「プロパティ」を開き、「リンカー」→「全般」→「追加のライブラリディレクトリ」に、ビルド済のHashLinkのパスを追加します。

これでビルドすれば、bullet.hdllとbullet.libが出力されます。

hlsteamを使用する

hlsteamのリポジトリからソースコードをダウンロードします。

Steamworksにサインインし、あれこれするとsteamworks_sdk_142.zipをダウンロードできます。

~\hlsteam\setup.batを実行、指示に従って操作します。
Enter path to Steam SDK root:にはsteamworks_sdk_142.zipを解凍して出てきたsdkフォルダのパスを、
Enter path to hashlink root:にはビルドしたHashLinkのパスを入力すれば良いです。

後は~\hlsteam\bullet.slnをVisual Studioでビルドするだけなのですが、そのままビルドしようとするとエラーを吐きます(またか

bulletの時のhllib.hに加え、今度はsteam_api64.dllの場所も教えてあげなければなりません。
さっきと同じく「プロジェクト」→「プロパティ」→「リンカー」→「全般」→「追加のライブラリディレクトリ」に、ビルド済HashLinkのパス、そして~\steamworks_sdk_142\sdk\redistributable_bin\win64を追加します。

上手くビルドできれば、steam.hdllとsteam.libが出力されます。