gameswf動きませんでした

いや、正確にはSDLがダメだったのかもしれないですが、gameswfがちゃんとしてくれませんでした。gameswfはあのGnashのベースになっているswfごにょごにょプログラムで、なんとPublic Domainなわけですが、VC8でコンパイル、実行したところ、初期化部分でこけたりしてうまく動いてくれませんでした。なわけで、失敗とはいえど備忘録。

まずDownloadsに書かれてるsvnリポジトリからソースをがっつり落としてきます。

   tu-testbed
    ├ base, demos, docs, fonts, ...
    └ gameswf
        ├ extensioins, gameswf_as_classes, ...
        └ win32
            └ VC7, VC8, VC9

ってなソースツリーになってると思います。tu-testbed/gameswf/win32/VCnに.slnファイルが入ってるので、お好みのVisualStudioで起動できます(うちはVC8で)。で、これを開くとサンプルとなるgameswf.vcprojや、メインのライブラリとなるlibgameswf.vcprojなどが開かれます。さらに調子に乗ってCtrl+Shift+Bなど押してしまうと、大抵はヘッダが見つからないなどでコンパイラに怒られます。

libgameswfは結構な数の外部ライブラリに依存してるので、それらをなんとかしなければなりません。というわけで、SDLやらffmpegやらをガリガリ落としてたんですが、途中でそれらがまとめて手に入ることに気づきました。Linuxでもないのに、いちいち探してくるのは面倒ですからね。というわけでSourceForgeからdependenciesをzipで取ってきます。この中に、各種ライブラリのヘッダ、リンク用のlib、そしてDLLがまとまって入っています。わざわざソースから取ってくる必要もありませんでしたね。てかffmpegのヘッダのパスがおかしいあたりで気づいてほんとよかったです。危うく全部自分でビルドするところでした。

これらに対して、libgameswfプロジェクトなどから適切にパスを通してやります。dependencies/includeに通せば十分かと思ってしまうところですが、なぜかSDL関連だけは#include などと指定されていたりするので、そこだけSDLに直で通さなければなりません。あと、ビルド前に知っておいたほうがいいと思うのですが、これらのライブラリは好き勝手な場所にファイルを出力します。libmysqlなんかは、ライブラリの出力パスが/windows/system32/なんてことになってます。これは気持ち悪いですね。肝心のlibgameswfも/libgameswf/に出力されるので気をつけましょう。

パスさえ通ればビルドは出来ると思います。これで動けばよかったんですが、なぜかSDL_SetVideoModeで止まってしまいました。残念。gameswf自体はちゃんと動いてるんじゃないかなと思います。少なくともswfを読み込むこと自体はできてるみたいだし。

ちなみにSDLはgameswfのレンダラの中の1つで、他にもDirectX用やXBOX用(?)もあるらしいです。gameswf::render_handlerという構造体(gameswf内にクラスは多分無い!)がインタフェースの役割を果たしていて、これをレンダリングに使うライブラリに応じて実装する形になります。SDLについては、render_handler_oglという構造体があります。_sdlではなく、_oglです。つまり、OpenGLです。この実装を得るために、create_render_handler_ogl()という関数が用意されています。これと並んでcreate_render_handler_xbox()とcreate_render_handler_d3d()もあるんですが、詳細は不明です。

そんなわけで、やろうと思えば自力でレンダラが実装できるようです。begin_display()やらdraw_mesh_strip()やらdraw_bitmap()やらをゴリゴリ実装していくだけです。また、画像についてもgameswf::bitmap_infoというインタフェースが提供されていて、仮想化されています。

しかしこれだけのコードがPublic Domainとはびっくりしました。OSSでswf再生といえばGnashぐらいしか浮かばなかったんですが(C++に限った話です。AS3ならもちろんこれ)、その源泉たるgameswfも知っておいたほうがいいなぁと思いました。というかPublic Domainだし、好き勝手いじるにはこっちのほうが向いてそうです。