リソースのパッケージング

俺は複数のことを同時に処理する。
というとかっこいいが、ほんとに同時に処理できるわけでもなく、数日単位でTSSしているような感じ。
切り替わるタイミングは、それに飽きたとき、もしくは、他のものに興味を持ったときだ。
集中力がないとも言う。
DXRubyも作ってから4年ほど止まっていたわけだが、数年単位でTSSしてたのかもしれない、とか考えると、またそのうち興味をなくして数年別プロセスから戻ってこないとか。
オープンソースプロジェクトは興味が原動力だから、自分が楽しいと思うことをするのが最も大事なことで、他の誰かのために作ると考えるのはよろしくない、と思う。
ボランティア精神に溢れていたらそれでいいのかもしれんけど、俺はそんな高尚な人間ではないから、そのときそのときで考えて楽しいことを考えるし、作って楽しいと思うものを実装するのだ。
要望の受付は、俺が気付かなかった楽しいことを気付かせてもらえるのを期待するだけで、人が必要としているものを作ろうという気構えではない。


さて、前置きが長くなってしまったが、今回は追加する機能についての考察。
DXRubyプロジェクトのチケットに登録されているのは現在4つ。
ソースの暗号化、リソースのパッケージング、疑似3D、ムービーだ。
このうち、疑似3Dについてはちょっとだけ進んだ。
ムービーは後回しだ。
ソースの暗号化は、やるならexerbに復号化機能を追加するとか、ocraを使うならRuby自体にそういうのを追加する必要がある。
まあ、例えばrequireやloadを上書きして、暗号化されたファイルを読み込んで復号化→evalというように作ればいいだけの話だが、結局のところDXRubyでサポートすべき話なのかどうかはよくわからない。


で、そのうちのリソースパッケージの話。
画像や音を1ファイルにまとめる機能のことだ。
いまの実装では、DirectXにファイル名を渡しているわけだが、これを別の形で渡せるようにする。
とりあえずImage.load系とSound.newが該当し、それらについてはDirectXはメモリオブジェクトからロードする機能が備わっているので、原理的にはできないことではない。
あとはどのようなメソッドとして追加するか、という話だ。


メソッドの追加はあまり望ましくない。
名前が思いつかないからだ。
が、同じメソッドでファイル名のところをIOオブジェクトやString(バイナリデータ)で渡せばいいとしても、サイズをどうやって表現するかで困る。
省略可能引数を追加するとして、Image.loadToArrayは縦横の数の後ろにバイト数を追加するのか。うーんイマイチ。でもそれしかないのかな。
ていうかImage.loadのほうがヤバい。位置、サイズが必須になってしまう。
結局のところ、メモリからロードする場合にサイズも必要であるとなれば、ファイル名を指定していたコードをそのまま使えるわけではない。
パッケージングするツールも必要だろう。
そんな機能を使おうという人なのだから、自分で作れるような気もする。
そのあたりはDXRubyに組み込むものではなく、基本機能だけを実装しておいて、気が向いたら作るなり、人が作るのを期待するなり、でいいだろう。


ところで、StarRubyではこういう機能をIOオブジェクト渡しとして実現している。
しかし困ったことに俺程度のレベルでは、こういうものをIOオブジェクトとしてどのように渡して使えばいいのかがよくわからない。
ライブラリを作る話ではなく、使うほうの話として。
もちろんこういうのを使う人ってのはそれなりにRubyにも詳しいはずで、きっとうまい使い方がピンと来るのだろうと思うわけなのだが、それにしても自分のレベルの低さにあきれ返ってしまう。
しょんぼりだ。
だから、俺でも使えるような低レベルな実装を考えてみたら、やっぱりStringでバイナリデータ渡しになるかな。
でもStringオブジェクト渡したらファイル名と区別が付かない気が。
やっぱりメソッド名を分けるか?
なんだか妙に厄介だぞ?