タグのまとめ

NScripterのスプライトで、画像をどのように解釈するかはタグによって指定する。このタグの種類についてまとめてみる。

タグの書式

タグは省略できる。省略した場合は、デフォルトならばcタグ、define節でtransmode命令を使っていた場合はそれに従う。
タグを記述する場合は、ファイル名の前に

:(タグ種);

と記述する。:がタグ開始の記号であり、;がタグ終了の記号である。(sタグによる例外あり)

; 例
lsp 0,":c;sprite.bmp",100,100

タグの種類

c
コピー(copy)タグ。透過させずにそのままべた描きする。
l
レフト(left)タグ。スプライトの一番左上の座標の色を透過色と設定する。
r
ライト(right)タグ。スプライトの一番右上の座標の色を透過色と設定する。
a
アルファブレンド(alpha)タグ。読み込んだ画像を左右に分割し、右側半分をマスク画像とみなす。
m
マスク(mask)タグ。アルファブレンドの変形で、マスク画像を別に指定する。大きさは合わせなければならない。
s
文字列タグ。ファイル名のかわりに文字列を指定し、その文字列をスプライトにする。
  • transmode命令で使用可能なのは、 leftup, copy, alpha の三種類のキーワードのみ。それぞれ、タグを省略した場合:l;, :c;, :a;が自動的に補足される扱いになる。

filelog/fchkとの絡み

define節でfilelog命令を使用すると、一度読み込んだ画像のリストを(グローバルに)保存できる。
そして、ある画像を過去読み込んだかどうかチェックするには、fchk命令を使う。
※fchk命令は特別な命令で、if命令の条件式としての扱いをする。

if fchk "file.bmp" puttext "読み込んだことがある。"
notif fchk "file.bmp" puttext "読み込んだことがない。"

この場合、lsp等に与えた結果が同じでもタグが違えば違うファイルとして記録される。

transmode alpha
bg "alphablend.bmp",1
if fchk "alphablend.bmp" puttext "読み込んだことがある。1" ; 反応する。
if fchk ":a;alphablend.bmp" puttext "読み込んだことがある。2" ; 反応しない。
if fchk ":c;alphablend.bmp" puttext "読み込んだことがある。3" ; 反応しない。

※filelogとfchk命令は、bg命令のみに反応する。これらの命令は、ギャラリーモードなどで使われることを想定している。あるイベント絵を読み込んだかどうかを自動的に記録してくれるので、スクリプトを簡略化できる。

mov $thumbnail,"dummy.bmp" ; サムネイル画像を、未読のデフォルト画像にする。
if fchk "event01.bmp" mov $thumbnail,"thumbnail_event01.bmp" ; もし、イベント絵を見たことがあれば、サムネイル画像をイベントのそれに変更
lsp 100,$thumbnail,10,10 ; サムネイルを表示
; これをイベント絵の数だけ繰り返す

l/rタグの注意点

一律に透過色を設定してしまうので、少しでも違う色は全く透過しない。よって、立ち絵などに使うと境界部分でジャギるし、立ち絵の透過されたくない部分に透過色と同じ色があった場合、そこも無差別に透過してしまう。
かつて、テレビの重ね合わせ技術でブルーバックなる技法があり、イメージ的にはそれに近い。
あまり使いどころがないが、こういうのがあることは知識として知っておいてもいいかも知れない。

aタグの注意点

恐らく、一番使われるタグ。NScripterでは、左側に色のついた立ち絵、右側に白黒で立ち絵を塗り分けた画像が従来から使われてきた。この独自形式は、NScripterができた頃、透明度情報を持てる画像形式が普及していなかったと言う歴史的事情による。
例としては、http://homepage1.nifty.com/nekora/soft/png2njpg.htmlがわかりやすいだろうか。
NScripterが読み込める画像形式は、Susieプラグインによって増やすことができる。

; define節で
spi "ifpng.spi|png" ; "プラグイン名|プラグインの拡張子"

ただし、仮にこれでpng形式を読み込めるようになったとしても、アルファブレンド情報は拾われないため、bmpと同様に右側に画像をつけなければならない。
しかしながら、現在ではデフォルトでpngのアルファブレンドにも対応するようになったので、png目的でSusieプラグインを使う理由はなくなったと言ってもよい。
なお、この技法自体は(メーカーが画像の吸出しを妨害するために)独自の画像圧縮形式を作成した場合に使えるので、今でも使用を検討する価値はある。

mタグの注意点

mタグを使用した場合、本体画像にpng画像を指定しても、その透明度情報は無視され、マスク画像に従う。
その記述はルールに則っているものの、その外見はあまり直感的ではない。本体画像名の前にマスク画像名が来るからだ。

lsp 0,":mmask.bmp;file.bmp",0,0 ; ":m(マスク画像);(本体画像)"

上記例では、file.bmpを使い、その透過情報はmask.bmpに求めている。file.bmpとmask.bmpの大きさは合わせるべきである。
もっとも、システム上は大きさが違っていてもエラーは起こらない。表示がおかしくなるだけである。

本体画像の方が大きい場合
マスク画像の外には、真っ黒い領域が広がっており、その部分に当たる本体画像は完全不透過として扱われる。
マスク画像の方が大きい場合
影響はない。形がずれる以外は。

このmタグは、立ち絵等で表情が変わっただけでポーズが変わらない場合、マスク画像を分離して使い回すことで容量の圧縮を図る技法として存在している(と思われる)。現在の富豪的情況ではどこまで必要かはわからないが。
ひねくれた使い方としては、本体画像として柄物塗り潰しを複数用意し、マスク画像を切り替えて千代紙の切り抜きのようなことも考えられる。

sタグの注意点

sタグの指定方法は独特だが、一度覚えてしまえば難しくはない。

lsp 0,":s/30,24,0;#FFFFFF文字列",0,0 ; 文字列と言うスプライトを作る。一文字の横幅は30ドット、高さは24ドット、文字間は0ドット、色は#FFFFFF(白)
; ":s"とタグ終了の";"の間に/(文字幅),(文字高),(文字間)がはいる。

フォントの指定は、spfont命令を使う。デフォルトでは、settextwindow命令で指定したフォントになる。spfont命令で文字の大きさ等まで指定した場合は、":s"までタグを省略してよい。

spfont "フォント名",(幅),(高),(文字間),(行間),(太字フラグ:1=太字),(影フラグ:1=有)
lsp 0,":s#FFFFFF文字列"

実は、こうやってフォント名を指定することはできるが、実際にそのフォントが使えるかどうかはわからない。なお、その環境に存在しないフォント名を指定したとしても、エラーにはならない。
使えるフォント名の取得は、手前味噌ながらその環境にインストールしてあるフォントのリストを取得するDLL - 永字八法と言う方法もある。
プロポーショナルフォントを指定しても文字の幅は一定になる。これは一方で、文字列の長さがわかれば完成するスプライトの大きさも事前に計算できることを意味する。
プロポーショナルフォントを使用したい場合は、手前味噌ながらスプライト操作DLLwrite命令で作成することはできる。影などがつけられない不完全なものでよければ、だが。
色の指定は、タグ終了後に#FFFFFFの形で与える。この時、複数の色コードを並べると、色コードの数だけセルを分割される。同じ内容で、色だけが違うセルが作られる。スプライトをボタンとして使用する場合は、「通常時」「マウスオーバー時」「クリック時」などの色を指定するとよい。

セルとアニメーション

mタグを除いて、スプライトは複数のセルに分割できる。sタグでは色コードを並べることで分割できたが、他のタグでは別にやり方がある。(なお、mタグで無理矢理分割しようとしてもエラーコードが出て止まる)
やり方は初級編 No.7 アニメーションに詳しい。
文字列スプライトの場合は、セルの分割はできるがアニメーション指定はできない。
ボタンとして使う場合はアニメーション指定はしないようにしておくのが吉。

塗り潰し長方形との絡み

ファイル名を指定する部分に、かわりに特定の書式に則った文を書くと、NScripterが自動作成した単色塗り潰しの長方形画像を読み込む。

lsp 0,":c;>640,480,#FFFFFF",0,0 ; 画面と同じ大きさの白い長方形
lsp 1,":a;>1280,480,#FFFFFF,#888888",0,0 ; 画面と同じ大きさの四い長方形。ただし、透明度半分
lsp 2,":m>640,480,#888888;>640,480,#FFFFFF",0,0 ; 上と同じものを別の書き方で。

手前味噌ながら、塗りつぶし長方形とタグの関係その2 - 永字八法も参照のこと。