下のスレをみて思いついたのですが、 Texture を暗号化できたらどうでしょうか。
http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/110-112
ogg ファイルは、ストリーム再生する関係上、暗号化困難のようです
(SDL_mixer にメモリ上のデータから再生する API がない)。
ご意見のほどよろしくお願いします。
--
Hajime Hoshi <hajim...@gmail.com>
> Texture#saveの引数に暗号化オプションを渡すなどで作成できて、
> Texture.loadでpngとの違いを意識せずに使える、となれば理想的ですね。
思ったのですが、暗号 / 復号モジュールをライブラリ側で提供したとして、
あまり役に立たないんじゃないかなーと。
理由は以下のとおり:
* 求められる暗号レベルはゲームによって異なる
* ライブラリ側で用意したものは復号アルゴリズムがばればれなので無意味
代わりに、「Texture.load の第一引数に IO オブジェクトを渡せる」ようにして、
暗号化、複合化をゲーム作る側が自由に定義できるようにすればよいと思いました。
例 1) 先頭に 1 バイトごみをつけるだけの暗号 (?) 化
読み込むときは 1 バイト読み捨てるだけで復号できます。
texture = open("hoge.png") do |fp|
fp.getc
Texture.load(fp)
end
例 2) 0xff で XOR かける暗号化
IO に対してフィルターをかける IO がほしいんですが、 Ruby だとどうやるのがいいんでしょう…。
class XorIO < IO
def initialize(io)
@io = io
end
def getc
(0xff ^ @io.getc[0]).chr # Ruby 1.8
end
# 他のメソッドもオーバーライドする必要がある
end
texture = open("hoge.png") do |fp|
XorIO.new(str) do |io|
Texture.load(io)
end
end
復号アルゴリズムが書かれているスクリプトは
どう隠蔽するのって問題にはなりますが、
それはおいおい考えていけばよいかなと思います。
とりあえず画像ファイルが直接開けなくなる、だけでずいぶん違うんじゃないかと。
> Texture#crypted?みたいなプロパティは必要なのかなぁ。
それはいらないんじゃないかと思います。
画像ファイルが暗号化できればいいのであって、
Texture オブジェクトはそのことに関与しない、でよいと思います。
--
Hajime Hoshi <hajim...@gmail.com>
> だんです。
>
> フォルダを開くと画像データが簡単に見えちゃうのがまずいわけですよね。
>
> 暗号化するかどうかは別として、複数の画像データファイルを1つのファイルに
> 合体させたらどうでしょうか。
>
> ゲームによっては画像ファイル数が数千とか数万といった数になるのですが、
> 総容量が少なくてもファイル数がやたら多いと配布時になにかと面倒なことがあります。
たしかに。
聞いた話では、 Windows は、ファイル数が多いと zip の展開が遅くなるらしいですね。
Texture.load が IO を取るようになればこれもできますね。
(ゲーム作る側が何らかの手段でファイルを分割して IO を作らなければなりませんが。)
> ファイルの連結なら音楽ファイルも大丈夫ですし。
なぜ大丈夫なのでしょう?
SDL_mixer の API にはファイル名を指定するものしかなかったと思いますが。
--
Hajime Hoshi <hajim...@gmail.com>
なるほど。それ採用しましょう。
キーの名前が "length" だと一般的過ぎる気がします。
"io_length" にするかもしれません。
ところで、 IO#getbyte というメソッドは見当たりませんが、
個々のファイルのサイズの整数と解釈して OK ですよね?
--
Hajime Hoshi <hajim...@gmail.com>
それは起動にやたら時間かかるとか、まだまだ難点がありそうな。
Texture.load の引数に IO オブジェクトをとる改造はそう不自然じゃないし、
むしろもうやってしまったのでいいかなと思うのですが。
--
Hajime Hoshi <hajim...@gmail.com>