NScripter講座:補講

ここでは主にBinary Heavenさんの「NScripter研究」への補足を書いていきたいと考えています。
Binary Heavenさんの講座内容は「Ver2.48」当時のものですが、
2010/11/06時点のNScripter最新バージョンは「Ver2.95」です。
この間、相当数行われたエンジンの更新にともなって、透過PNGや音声命令をはじめとして
当時からかなりの変化があるということを押さえておく必要があります。

イチからv2.95向けの講座サイトを作って公開することも考えたのですが、
車輪の再発明的な印象もあって、箇条書きで簡単に注釈を記す形にしました。
以下、引用部分は基本的に緑色≪こちらの色≫で記していきます。

(※H23/07/19改訂:リンク先をCOOL ONLINEのURLからミラーのURLへ変更)

はじめに

このページでは習得への道しるべでも記したように
「Binary Heaven」さんの「NScripter研究」を読んであることが前提となります。
Binary Heaven様Binary Heaven様(ミラー)
(※さらにもし習得への道しるべを未読の場合は、先にそちらにも目を通していただけると理解が深まります)

このページでは以下の項目について補足を行いました。
初級-準備をする  初級-立ち絵と画像タグ  初級-変数による分岐  初級-テキストウィンドウ  初級-音を鳴らす  初級-動画を流す  中級-文字列スプライト  中級-ボタン  中級-スプライトボタン/複合ボタン  中級-配列変数  中級-数値ラベル  実践-暗号化とアーカイブ化 


初級編 No.1 準備をする
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/01.htm

・環境 の項目  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/01.htm#env

動作環境にWindows 95/98/Me/2000/XP日本語版とありますが、
個人的に確認してあるところ、ver2.82〜最新ver2.95のNScripterは
Windows Vista/Windows 7のそれぞれ32bit/64bitマシンでも問題なく動作します。

・DLL の項目  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/01.htm#dll

「oggdec.dll」は古いogg再生プラグインですから、現在入手出来なくても問題ありません。
むしろ現在はもっと良いプラグインがありますので使わない方がよいです。


初級編 No.5 立ち絵と画像タグ
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/05.htm

png利用の準備

まず、「実行ファイル/DLL」フォルダにあるnspng.dllを確認してください。
それを、nscr.exeがある場所と同じフォルダに置くか、その直下の「dll」フォルダに配置します。
これでpngファイル利用準備は完了です。(ついでにnsogg2.dllも同じ場所に配置しましょう)

・画像タグ の項目  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/05.htm#gazoutag

このページは立ち絵を表示するld命令の説明文ですが、スプライト(lsp命令など)にも画像タグを利用できます。
特に、アルファチャンネル付きの「:a;」と、そのまま表示する「:c;」の2つを中心に使うことになります。


;立ち絵でのタグ利用例
        ld c,":a;tatie.bmp",1

;スプライトでのタグ利用例
        lsp 100,":c;cut_in¥sample.png",0,0

なぜ「:l;」形式が滅多に使われないかは後述します。

・透過形式 の項目の 「a」…(alpha)  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/05.htm#blend

アルファチャンネル付き画像の作り方は当時と違って現在2通りあります。
 1.透過させたい画像の右側に、グレースケールのマスク画像をくっつけます。(BMP,JPG)
 2.透過PNGの形式で作成します。(PNG)
それぞれ実作例はこうなります。
 1.画像例1
 2.画像例2
現在はPNGを利用できますので、透過PNGの方が簡単に画像を作ることができますね。
ちなみにPNGファイルを利用した時点で、透過度をもっていなくても2番と判断されますのでご注意ください。
PNG時に横にマスクを連結した画像を用意しても無意味です。

・定義による透過 の項目  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/05.htm#transmode

> 「transmode」命令で透過形式を指定することで、画像タグで透過形式を指定しなくてもその形式で透過してくれます。
> デフォルトではleftupになっています。

こちらも同様にld命令だけでなく、スプライト(lsp命令など)にも影響します。
transmode命令を利用せず、画像タグを使わない、デフォ状態のスプライトは左上の色を透過します。

leftup(左:元画像ファイル)leftup(右:Nスク上でのleftup状態表示)
このように「:l;」形式ではアンチエリアスの関係で隅に緑色の背景色が残ってしまいます。
ちゃんとマスクやαチャンネルを用意した「:a;」形式では綺麗に表示されますのでご安心ください。
そのため「:a;」形式、または、ベタ表示の「:c;」を中心に使っていくことになるわけです。


初級編 No.10 変数による分岐
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/10.htm

・変数の利用 の項目  http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/10.htm#riyou

>  また、「条件が正しくなかったら命令を実行させる」という「notif」命令もあります。
とありますが、notifは出来るだけ利用しないようにしましょう。
→(その理由はnotifの落とし穴(senzogawaのNな日々さん)を参照のこと)


if %0 == 10 goto *good ;10ならば   goto *good
if %0 != 10 goto *good ;10でないなら goto *good

if %0 >= 10 goto *good ;10以上ならば goto *good
if %0 < 10  goto *good ;10未満ならば goto *good

上記のように、ifのまま評価式を逆にするだけでnotifが不要になります。この方が明快でミスもありません。


初級編 No.11 テキストウィンドウ
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/11.htm

setwindow命令を記述した次の行には必ずtextspeeddefault命令を書きましょう。
→(その理由は初級者向けTipsの2番を参照のこと)


初級編 No.12 音を鳴らす
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/12.htm

ここは大きく変更のある部分ですからBinary Heavenさんに書かれている内容は忘れてください。
原因のはっきりしているバグは単純にスクリプト打ちのミスですが、
原因不明なバグの主要因はほとんどがサウンド周りです。
次いで体験版頒布時によくあるDL失敗でのファイル破損などが挙げられます。(MD5のチェックで確認可)

利用できるサウンドファイルの種類

というわけで、環境バグ対策のためにまず利用するファイルを限定する必要があります。
当サイトではoggファイルのみの利用を強く推奨します。
MIDI/CD-DAはまだ利用できるようですが、環境依存が大きいので避けましょう。
mp3も利用できますが予期せぬ環境依存バグの主要因になりますので極力避けましょう。
BGMにはoggファイルを、効果音にはwav・oggファイルを、ボイスにはoggファイルを利用します。
(追記:bspのsタグ時の特定ファイル時対策のため、効果音でもwavを含めずogg統一した方が安全です)

ogg再生の準備

まず、「実行ファイル/DLL」フォルダにあるnsogg2.dllを確認してください。
それを、nscr.exeがある場所と同じフォルダに置くか、その直下の「dll」フォルダに配置します。
これでoggファイル利用準備は完了です。(ついでにnspng.dllも同じ場所に配置しましょう)

サウンド再生の方法

bgm命令、dwave命令を利用します。使い方は下のとおりです。


;<再生方法一覧>
bgm "bgm¥test.ogg" ;    BGM再生(基本)
bgm "(5.37)bgm¥test.ogg" ; BGM再生(ループポイント設定する場合)

dwave 0,"voice¥sample_voice.ogg" ; ボイス

dwave 1,"se¥sample1.wav" ; 効果音
dwave 49,"se¥sample2.ogg" ; 効果音(oggも大丈夫)

bgmには一つの曲しか割り当てられません。
bgm再生中にbgm命令を入れると、それまでのものを止めて新しい曲を鳴らします。
bgmは自動でループ再生します。セーブ・ロード後はセーブ時のbgmが自動復帰します。

dwave命令ではDirectSoundによる再生を行うことができます。
BGMとは全く別個に、チャンネル0〜49の計50チャンネルが同時に利用できます。
つまり怖いBGMをバックに、雨降りの環境音を流しながらドアを開く効果音を出したりすることができます。
ただし、NScripterではチャンネル0番は特別にボイスに対して割り当てられています。
btntime2btime命令で便利に状況を判断することが出来ますので、
dwave 0番はボイス専用の番号であると考えてください。


;各効果音の長さを2秒だとします
        dwave 1,"se¥se_A.wav" ; 効果音Aを1番で再生する
        wait 1000 ;       1秒待つ
        dwave 1,"se¥se_B.wav" ; 再生途中の1番効果音Aを止めて、効果音Bを1番で再生する
        wait 1000 ;       1秒待つ
        dwave 2,"se¥se_C.wav" ; 効果音Cを2番で再生する。チャンネルが違うので1番の効果音は止まらない
        wait 1000 ;       1秒待つ
        dwavestop 2 ;      2番チャンネルの音声を停止する

;(このように複数チャンネルを同時に鳴らすことができます)

BGMに関する命令は、「再生」「停止」の2つを覚えておきましょう。


;再生
        bgm "bgm¥test.ogg"
;停止
        bgmstop

;(※ dwaveで代用できますのでbgmonceを覚える必要はありません)

効果音(とボイス)に関する命令は、「単発再生」「ループ再生」「停止」の3つを覚えておきましょう。


;単発再生
        dwave 1,"se¥test.wav"
;ループ再生
        dwaveloop 1,"test.wav"
        dwaveload 1,"test.wav":dwaveplayloop 1 ; (上と同じ動作。ファイルサイズが大きい場合はこちらを推奨)
;停止
        dwavestop 1

;(※ 今のバージョンですとループ再生はwav限定でなくoggもいけます)

注意:ループ効果音はセーブ・ロード後に復帰しません。
システムカスタマイズを行うことで対応することができます。
ここが気になる方はシステムカスタマイズの導入を検討してください。

音量調整の方法

BGMはbgmvol命令で音量を変えられます。
ボイス(dwave 0番)はvoicevol命令で変えられます。
効果音(dwave 1〜49番)はsevol命令で全て変えられます。
この3つの命令はサウンド再生前でもサウンド再生中でも効果があります。

効果音音量を一個一個指定したい場合は、当該効果音を再生中にchvol命令を使ってください。
chvolはサウンド再生中にしか効果がありません。再生を終えると各チャンネル音量は元のsevol音量値に戻ります。


;chvol使用例1
        dwave 1,"se¥test.wav":chvol 1,50

;chvol使用例2
        dwave 2,"se¥test.wav"
        for %0 = 99 to 0 step -1:chvol 2,%0:wait 10:next
        ;(2番効果音を1秒かけてフェードアウト。これを非同期にしたい人はLuaを試してみよう)

ほかにも、bgmではフェード時間を設定することもできます。
bgmfadein・bgmfadeout命令をマニュアルで確認してみてください。
たとえば、bgmfadeout 1000と設定した上でBGMをstopすれば、1秒かけて音楽をフェードアウトします。

現在使うべきではないサウンド関連命令

サウンド周りでは古い命令が特に多いため注意が必要です。
ボイス再生にmvなどを使ってしまうとBGMが止まってしまうなど色々と弊害がありますので、
bgm命令系、dwave命令系以外は利用を控えましょう。


cdfadeout
chkcdfile
chkcdfile_ex
dsound
loopbgm
loopbgmstop
mp3
mp3fadein
mp3fadeout
mp3loop
mp3save
mp3stop
mp3vol
mv
play
playonce
playstop
v
wave
waveloop
wavestop

初級編 No.13 動画を流す
http://binaryheaven.ivory.ne.jp/o_show/nscripter/syo/13.htm

現在はmovie命令がありますので、そちらを利用しましょう。


中級編 No.2 文字列スプライト
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/02.htm

Binary Heavenさんに書かれています
> lsp 8,":s#FFFFFFあいうえお",50,100
という書き方ではなく


lsp 8,":s#FFFFFF"+"あいうえお",50,100

という書き方をするように統一してください。この癖がつくと、
> lsp 8,":s#FFFFFF$0",50,100
こういう時にも自然と下のような書き方になりますので、


lsp 8,":s#FFFFFF"+$0,50,100

文字スプライトで予期しない動作が起きる可能性が減ります。
→(その理由は文字列スプライトで文字変数の値が正しく表示されない。(SGPさん)を参照のこと)

さらにこの癖がつくと、変数エイリアスを設定した場合にも効果があります。
> lsp 8,":s#FFFFFF$test",50,100
このままだとうまく動きませんが下のような書き方ならば問題なく通ります。


lsp 8,":s#FFFFFF"+$test,50,100

これで通るのは初級Tips28で書いたことと同様の理由からです。

サイズを指定した文字スプライトを作る

ちなみに文字スプはサイズの指定が可能です。
基本的に幅,高さを指定できるこちらを中心に使うことになるでしょう。セーブ・ロード画面の自作などで便利です。


lsp 1,":s/40,40,0;#FFFFFF"+"文字列スプライト",100,100

私は、いつも初級に書いた上記のスクリプトをコピー&ペーストして数値を書き換えています。
よく使う命令文は、ご自身でこのようなコピペ用の命令リストを作成しておくと便利かもしれませんね。


中級編 No.3 ボタン
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/03.htm

こちらのボタン命令はほとんど利用されることはないと思います。
画像を作っている時間が無いときに少々便利なくらいでしょうか。
次の「No.4 スプライトボタン」の方が重要です。制作時にはそちらを頻繁に使うことになるでしょう。

手順

「btndef "test.jpg"」でボタン画像を読み込み。「btn」でボタン定義。
「btnwait」でボタン内容を取得して「if」でそれぞれ分岐。
使い終わったら「btndef ""」でボタン定義とボタン画像を消します。


中級編 No.4 スプライトボタン
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/04.htm
中級編 No.5 複合ボタン
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/05.htm

スプライトボタンと複合ボタンの違いは「spbtn」か「exbtn」かだけですので一緒に扱いましょう。
しかも「spbtn」「exbtn」は同時に使えます。これはもう分けて考える必要はありませんね。

・「lsp」「lsph」でボタン用のスプライトを読みこむ の項目

ボタンにつかう画像ですが、透過付き画像を利用したい場合は、
「初級編 No.5 立ち絵と画像タグ」を思い出してください。

こちらも当時と違って2通りの作り方があります。
 1.透過させたい画像の右側に、グレースケールのマスク画像をくっつけて、横に二つ並べる。(BMP,JPG)
 2.透過PNGの形式で作成して、横に二つ並べる。(PNG)
それぞれ実作例はこうなります。
 1.ボタン例1
 2.ボタン例2
現在はPNGを利用できますので、透過PNGの方が簡単に画像を作ることができますね。
ちなみにPNGファイルを利用した時点で、透過度をもっていなくても2番と判断されますのでご注意ください。

手順

「lsp」でボタン画像を読み込み。「spbtn」「exbtn_d と exbtn」でボタン定義。
「btnwait」でボタン内容を取得して「if」でそれぞれ分岐。
使い終わったら「btndef clear」でボタン定義を消して、さらに「csp」でボタン用の画像を消します。

新ボタン命令

現在は更新によって更に性能のよい新画像ボタン命令が用意されています。
→(命令一覧はリファレンス(NScripter Scripting Factoryさん)を参照のこと)
ほぼ全てのキーボード内容を取得できたり、右クリックなどの感知性能が格段に上がったりしています。
先の、spbtnとexbtnが分かりやすく統合されていますので、是非こちらの命令に切り替えましょう。

手順も今までのボタンと同じです。ただ命令文が違うだけです。

「lsp」でボタン画像を読み込み。「bsp」でボタン定義。
「bexec」でボタン内容を取得して「if」でそれぞれ分岐。
使い終わったら「bclear」でボタン定義を消して、さらに「csp」でボタン用の画像を消します。


中級編 No.8 配列変数
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/08.htm

配列を必要とする方はプログラミング経験のある方だと思われますので、その前提で補足します。
・はっきりいって使いづらいのでNScripterで用意されている配列の利用はやめましょう。
 代入方法はmov・movlのみで、命令の返値を配列で受け取るとエラーという致命的残念さです。
・ぶっちゃけNスク標準装備の数値変数と文字列変数はそのまんま配列なので、
 一次元でいいならば普通の変数を配列として使ってしまいましょう。
 %%0$%0 という文法が許されている時点で、そういう想定がなされていると取ってOKかと。
 また、Nスクにはsplit命令がありますので、文字列を弄れば二次元配列もいけます。
・Luaの利用が可能ですので、もっと多次元だったり本格的に使いたい場合はそちらでどうぞ。
 Luaの配列というかテーブルは死ぬほど便利なので、他言語経験者ならきっとニヤつけます。

→(NScripterで用意されている配列については、dimの考察(永字八法さん)に詳しい)


中級編 No.10 数値ラベル
http://binaryheaven.ivory.ne.jp/o_show/nscripter/tyuu/10.htm

prnum命令は「マニュアル」フォルダに入っている「良くあるご質問.txt」に書かれている通り
今では使えなくなっています。文字列スプライトで代用しましょう。3桁制限もなく便利です。
(例:文字列スプライト → lsp 1,":s/20,40,0;#FFFFFF"+"987654",100,100


実践編 No.2 暗号化とアーカイブ化
http://binaryheaven.ivory.ne.jp/o_show/nscripter/jissen/02.htm

nscmake.exeは変わりないのですが、データのアーカイブ化の方ではツール自体が変わっています。
当サイトの初級者向けTIPSの21番に書いてありますのでこちらを参照してください。


その他 No.4 画面表示の上下関係
http://binaryheaven.ivory.ne.jp/o_show/nscripter/sonota/04.htm

ここは重要なので忘れずに読み込んでおきましょう!