透過ボタンの落とし穴。

NScripterは素では画像フォーマットとしてビットマップとJPEGしか取れない。BMPは非圧縮だからかさばるし、イラストをJPEGで扱おうとするとかなりみすぼらしいことになるのでやっぱりPNGを使いたい。そんなときに役に立つのがnscrpng。単にBMPの代わりとしてPNGが扱えるようになるだけじゃなく、アルファチャンネルを透過度として扱えるようになるのでとても有用。なお、ONScripterは標準でアルファチャンネル付きPNGを扱えるので、NScripterにこのプラグインを組み込んだ場合と同等の動作を期待できる。
けど、動作原理を見ていて気づいた。スプライトボタンを作るときに注意が必要。
このプラグイン、動作原理はこんな感じらしい。

  1. NSCR.exeからファイル名を指定して画像の展開要求がプラグイン
  2. プラグインPNGを展開、BMPを生成する。
    1. この際、アルファチャンネルが存在するならマスクを生成、展開したオリジナル画像の横に貼り付ける
  3. 展開したBMPを本体に返す。

注目するのはアルファチャンネルが存在する場合の挙動。NSCR.exeで透過度情報付きの画像を扱うには、次のような形式の画を与える必要がある。
[画像本体][モノクロ二値の透過度情報]
この形式で画像を返すため、このプラグインはアルファチャンネルから作ったマスクを横に貼り付けて返す。これによってNSCR.exeはマスクが横に付いたBMPを与えられたと思うわけ。
ここでスプライトボタンの作り方を考える。ボタンにmouseoverしたとき画像を変えたい場合、次のような画像を与えればよい。
[普通の時の画像][mouseover時の画像]
このスプライトボタンで、透過度を与えたい場合はさっきのやり方と組み合わせて次のような絵を与えなくてはいけない。
[普通の時の画像][普通の時の画像のマスク][mouseover時の画像][mouseover時の画像のマスク]
ところが。nscrpngは普通/mouseover時の画像が横に連なってるなんてことはわからないので、普通の一枚絵と思って次のような画像を返してしまう。
[普通の時の画像][mouseover時の画像][普通の時の画像のマスク][mouseover時の画像のマスク]
はい、これでは意図通りのスプライトボタンにならない。


以上のことから分かるように、nscrpng.spiを組み込んだ場合でもmouseoverで変わるスプライトボタンを作りたい場合はアルファチャンネル付きPNGを使ってはいけない。従来通りマスクを横に貼り付けたBMPを作るか、マスクを横に貼り付けて、アルファチャンネルがないPNGを作る必要がある。