setwindowについて考える。

NScripterで基本同然のコマンドでありながら、覚えるのも面倒臭いコマンドの筆頭はこのsetwindow(シリーズ)でしょう。理由は簡単。パラメータが多すぎるから。

setwindow 数字,数字…(計11個)…数字,#rrggbb,数字,数字,数字,数字
もしくは、
setwindow 数字,数字…(計11個)…数字,文字列,数字,数字

テキストウィンドウを指定します。
上は、透過度落としタイプ(色指定で色味を変えられます)
下は、画像ファイル名を指定して、それをウィンドウにするタイプです。
最初の11個は、左から順に、文字の左上座標X,Y,文字数横,縦,文字フォントサイズX,Y,字間X,Y,デフォルト表示スピード,太字フラグ(0普通1太字),影付きフラグ(0普通1太字)です。

上の場合は、順にウィンドウ色味,ウィンドウ左上X,Y,右下X,Y
下の場合は、順に画像ファイル名,ウィンドウ左上X,Y、です。
画像ファイルにはタグが使えます。

デフォルトでは、全画面の透過度落としタイプで、フォントは26x26ピクセル、字間は0,2、左上座標が8,16で、横23文字縦16文字、太字で影付き、スピードは20で、透過の色味は、#999999です。
命令に直すと、こうなります。
setwindow 8,16,20,23,26,26,0,2,20,1,1,#999999,0,0,639,479

しかも困ったことに、一つのコマンドで複数の引数の取り方があるため、安易なオーバーロードができないことも問題をややこしくしています。
仮に色指定を文字列指定してみると(例:mov $0,"#999999":setwindow 8,16,20,23,26,26,0,2,20,1,1,$0,0,0,639,479)、NScripterは#999999を画像タグとして解釈してしまうので、つまりは、barなどと同じで色を変数によって指定できない。(参考:barclear - 永字八法http://www.eiji8pou.net/download/bar.txt
これでNScripterに、eval的な機能や、あるいは外部ファイルを取り込むrequire/includeのような機能があればまだ(マシンへの負荷は大きくなるかも知れないが)スクリプトの省スペースが可能になるんですが。
と言う訳で、折衷案的なものを考えてみました。

ライブラリ

以下のライブラリを使うと、

  • setwindow_init(0)
  • setwindow_windowsize(2)
  • setwindow_windowsize2(4)
  • setwindow_width_height(2)
  • setwindow_fontsize(2)
  • setwindow_fontspace(2)
  • setwindow_fontbold(1)
  • setwindow_fontshadow(1)
  • setwindow_speed(1)
  • setwindow_imagetag(文字列1)
  • setwindow_imagetag_delete(0)
  • set_window(0)
  • set_window2(0)
  • set_window3(0)
  • getwindow_windowsize(2)
  • getwindow_windowsize2(4)
  • getwindow_width_height(2)
  • getwindow_fontsize(2)
  • getwindow_fontspace(2)
  • getwindow_fontbold(1)
  • getwindow_fontshadow(1)
  • getwindow_speed(1)
  • getwindow_imagetag(文字列1)

上記の命令が導入されます。カッコ内の数値はその命令が取る引数の数です。基本的に数値変数のみを引数に取ります。違うのはsetwindow_imagetagとgetwindow_imagetagの二つだけです。
このライブラリのキモは、テキストウィンドウのパラメータ指定と、実際の変更を別々にするところにあります。
普通のスプライト処理などで、色んなスプライトに色んな処理をしながら(位置を変え、透明度を変え、非表示を表示にしたり……)最後にprint命令で画面に反映させるように、setwindow_xxx系の命令でテキストウィンドウの各種パラメータを変更した挙句に、set_window/set_window2/set_window3で実際に変更するのです。

サンプルスクリプト

 *start
通常の画面
setwindow_fontsize 18,18 ; 文字のサイズをデフォルトの26*26から18*18に変更。
set_window ; それを画面に反映
テキストウィンドウそのものの大きさは変わらずに、文字だけが小さくなったのがわかるでしょうか。
\
end

備考

  • set_windowはsetwindowに対応しています。同様に、set_window2/set_window3は、setwindow2/setwindow3に対応しています。
  • デフォルトでは、windowの色身はデフォルトの#999999で固定されています。これを変更するには、プログラム自身を変更するしかありません。
  • テキストウィンドウに背景画像を指定したいならば、setwindow_imagetag命令を使ってタグ毎背景画像を指定してください。set_window実行時に自動的に判別します。
  • 背景画像を消したいならば、setwindow_imagetag_deleteを実行してください。
  • デフォルト状態に戻したいならば、setwindow_initを実行してください。その上で、set_window系を使うと初期状態に戻ります。
  • getwindow系の命令は、setwindow系の命令と対になる命令で、setwindowで指定した数値を取得することができます。あくまでsetwindow系で指定した数値であり、現在実際にテキストウィンドウに適用されている数値ではないのに注意です。

TO DO

んー。スペースまわりを変更するかも。現在のバージョンだと、文字の大きさを変えた場合、その分実際に文字に使われる面積は左上に詰まってしまうから、それが変わらないようにするか、あるいは変わらないようなコマンドを作るかするだろう。

ライブラリ本体

手ひどいエラーがあったので、完全作り直しの上setwindow - 永字八法に移行。