〜四章〜 「画像ファイルを扱おう!」


5月26日追加分

今回は基本的な画像ファイルの扱い方について説明しようと思います。

まず一言に画像ファイルと言っても、NScripterにおいては下の三つに分かれます。

背景
立ち絵
スプライト

「背景」は、そのままの意味で、バックグラウンドの画像のことです。一度に一つの絵しか表示できません。
「立ち絵」とは、よくキャラクターの絵が出てくるときに使われるものです。一度に3つまで表示できます。
「スプライト」が一番厄介で、簡単に言うと「自分の好きな座標に貼れて、それを動かしたり、表示/非表示の切り替えが出来る絵」といったところでしょうか。万能ですが、扱いはなかなか難しいです。最大で50個まで表示できます。

次に扱える画像フォーマットですが、今のところ「bmp」形式と「jpg」形式が扱えます。
一昔前は「jpg」形式を扱うにもプラグインが必要だったりして、んでプラグインを使うとちょっとシステムが不安定になったりして大変だったんですが、最近ではプラグインが無くても読めるようになったようです。

NScripterでは、画像を扱う上で重要な「エフェクト」という概念があります。
エフェクトとは画像を表示する際の効果のことで…このへんは習うより慣れろ的に考えたほうが楽かもしれません。
デフォルトであるエフェクトの一覧を下に載せます。(「NScripterマニュアル」の「effect」の項より抜粋)

エフェクト番号効果
1瞬間表示。時間指定はいりません。
2左シャッター
3右シャッター
4上シャッター
5下シャッター
6左カーテン
7右カーテン
8上カーテン
9下カーテン
10ピクセル単位のクロスフェード
11左からスクロール
12右からスクロール
13上からスクロール
14下からスクロール
17モザイクイン

もう一つ重要な概念として「画像タグ」というものがあります。
詳しくは「NScripterマニュアル」の「グラフィックファイルの説明」の項を見てください。
私の解説ではよくアルファブレンド(:a;)とコピー(:c;)を使用します。

ではお膳立てが済んだところで、まず「背景」から説明していこうと思います。
NScripterはデフォルトの画面サイズは640×480pixcelなので、それにあわせたサイズで作るといいと思います。
なお、サイズが大きかったり小さかったりした場合、左上揃えではなく中央表示になるので注意してください。
背景を表示する命令はこんな感じになります。


bg "{表示する画像ファイル名}",{エフェクト},{エフェクトにかける時間}


まず「bg」の後に表示する画像ファイルのパスを「"」で囲み、記述します。
(ファイルパスは絶対パスでも相対パスでもいいですが、普通相対パスを使うことになります。)
そして{エフェクト}の部分に上で書いたようなエフェクト番号を記述します。
最後の{エフェクトにかける時間}の部分には、その名の通りエフェクトにかける時間をミリ秒*1で記述します。

*1…秒[s]とミリ秒[ms]は次の関係。

ミリ秒
1[s] 1000[ms]


背景を表示するスクリプト例(背景ファイル名は"haikei.bmp")

*define

game
*start

背景を表示します。\

bg "haikei.bmp",6,1000

背景を表示しました。@

end



では次に「立ち絵」について説明します。
冒頭で言ったようにこの機能は主にキャラクターを表示する時に使われます。
よって、右、中央、左、の3つの場所に表示することができます。
立ち絵を表示、及び消去する命令はこのようになります。


;表示
ld {位置},"{表示する画像ファイル名}",{エフェクト},{エフェクトにかける時間}

;消去
cl {位置},{エフェクト},{エフェクトにかける時間}


ほとんどが背景のときと一緒ですが、立ち絵は「ld」(または「cl」)命令の後に、向かって左、中央、右のどこに表示(または消去)するのかを記述する必要があります。
{位置}の部分に入る文字は、以下の対応表を参照してください。

中央 全部(消去のみ)
ld(cl) l,〜 ld(cl) c,〜 ld(cl) r,〜 cl a,〜


立ち絵を表示するスクリプト例(立ち絵ファイル名は"stand.bmp"で、アルファブレンド済み)

*define

game
*start

立ち絵を表示します。@
右@
ld r,":a;stand.bmp",7,1000

左@
ld l,":a;stand.bmp",6,1000

中央@
ld c,":a;stand.bmp",10,1000

立ち絵を消去します。@
右@
cl r,6,1000

左@
cl l,7,1000

中央@
cl c,10,1000

end



最後は「スプライト」についての説明です。
前述したとおり、スプライトは万能ですが、扱いが少々難しいです。
まず、スプライトには「スプライト番号」というものがあります。
複数のスプライトを表示するときはそれぞれ違うスプライト番号で定義する必要があります。
スプライト番号は0番から49番までが指定できます。つまり最大で50個表示できるというわけです。
nscr.exe Ver 2.33現在、スプライト番号は0〜999番まで使用可能のようです。
また、スプライト同士が重なり合うときは、スプライト番号が若い方が上に表示されます。
(つまり、0番が最前列で、999番が最奥ということになります。)

また、立ち絵と重なる場合は、デフォルトでは25番以降が立ち絵の奥に表示されます。
(ちなみにこのパラメータは「humanz」という命令で変えることができます。マニュアルを参照。)

では、スプライトを実際に扱ってみましょう。
処理の高速化のため、スプライト関連の命令は「定義(lsp,vsp,msp,csp)」→「表示(print)」という段階を踏む必要があります。


;定義
lsp {スプライト番号},"{表示する画像ファイル名}",{X座標},{Y座標}
lsph {スプライト番号},"{表示する画像ファイル名}",{X座標},{Y座標}

;表示/非表示の切り替え
vsp {スプライト番号},{0(非表示) or 1(表示)}

;移動
msp {スプライト番号},{X方向に移動する値},{Y方向に移動する値},{透過度に加算する値}

;消去
csp {スプライト番号}

;表示
print {エフェクト},{エフェクトにかける時間}


ではまず定義方法から説明したいと思います。
スプライトの定義方法は「lsp」と「lsph」の二種類があります。
共にメモリ上にスプライトを呼び出す命令ですが、違うところは初期の表示状態です。
「lsp」は表示モードでの呼び出し、「lsph」は非表示モードでの呼び出しです。
…と言っても、言葉だけではわかりにくいと思うので、次のスクリプトを実行してみてください。
(実行の前に100×100pixcelくらいの"sp.bmp"というファイルを作っておいて下さい。)


*define

game
*start

lsp 1,":c;sp.bmp",100,100
lsph 2,":c;sp.bmp",300,100

print 10,1000

一つしか表示されません。@
これは2番のスプライトが非表示モードで呼び出されているからです。@
では2番のスプライトを表示するにはどうしたらいいか?\
ここで「vsp」命令を使います。@
br
vsp 2,1
print 10,1000@
br

vsp 2,1
print 10,1000

これで表示されました。@
「lsp」と「lsph」命令にはこのような違いがあります。@

end


「vsp」命令については特に難しいことは無いと思います。
指定したスプライト番号のスプライトの表示/非表示を切り替えるという命令で、スプライト番号の後に「1」を指定することによって「表示モード」に、「0」を指定することによって「非表示モード」になります。
つまり「lsp」と「lsph」の違いは、「vsp」命令で言うところの「1」か「0」かの違いという事です。

次に「msp」命令です。X,Y増分についてはわかると思いますが、新しく透過度という概念がでてきました。
NScripterでは、0〜255までの256段階の透過度があります。
透過度の値が小さくなるにつれてだんだん画像が透明になっていき、透過度が0の時、画像は完全に透明になります。
これは余談ですが、アルファブレンドというのは実はグレースケール(白黒256諧調)の画像を使って元の画像のそれぞれの部分の透過度を表すという方法なのです。

最後に「csp」命令の説明です。
「csp」命令は指定したスプライトをメモリ上から消去する命令です。
また、スプライト番号ではなく「-1」を指定すると、今呼び出されている全てのスプライトを消去する命令になります。
勘違いしやすいのですが、「vsp」命令で画像を非表示にしてもメモリ上には呼び出されたままになっています。
しっかりと「csp」命令を使って消去しましょう。


最後にですが、スプライト系の命令は定義した後かならず「print」命令を行うことを忘れないで下さい。
これを行わないと、内部的にはスプライトは動いていますが、表示の上では何も変わりません。

ちなみに「bg」命令でも代用できますが、この場合は背景が切り替わると同時にスプライト画像が表示される事になります。
場合によって使い分けましょう。



5月26日追加分

エフェクト番号15と18について、補講を行います。
「NScripterマニュアル」にはそれぞれ次のように説明してあります。

エフェクト番号効果
15マスクパターンによるフェード
18マスクパターンによるクロスフェード

さて、これだけ見てもさっぱり分かりません
しかしこれらのエフェクトは、私的に一番実用に向くのでは?と思うエフェクトなので、是非修得してください。

さて、まず「マスクパターン」って何よ?と思っている方々。
それこそが今回の肝なのです。
まず「マスク画像」というのがありまして、これはグレースケール(白黒256諧調)で描かれた画像のことです。
そしてエフェクト15及び18で「マスク画像」を参照してえられるエフェクトを「マスクパターン」と言います。
具体的にどういった動作をするかと言うと、マスク画像において、黒に近ければ近いほど早く、白に近ければ近いほど遅く表示されます。

…う〜ん、我ながら分かりにくい。
というわけで恒例の習うより慣れろノリで行きましょう。

まず、これをダウンロード、解凍して「Nscr.exe」と同じ場所に保存してください。
そして「0.txt」に以下の内容を記述してください。

*define

game
*start

;エフェクト15でeff.bmpを使って背景1を表示
bg "bg1.jpg",15,1000,"eff.bmp"
click

;エフェクト15でeff.bmpを使って背景2を表示
bg "bg2.jpg",15,1000,"eff.bmp"
click

;エフェクト18でeff.bmpを使って背景1を表示
bg "bg1.jpg",18,1500,"eff.bmp"
click

;エフェクト18でeff.bmpを使ってブラックアウト
bg black,18,1500,"eff.bmp"
click

end


エフェクト番号15と18を使う場合は、エフェクトにかける時間の後にマスク画像を指定します。
この「eff.bmp」は右から左にかけて、黒から白へグラデーションする画像です。 つまり、黒いほうから表示されていくので、背景も右から左に流れるように変わるわけです。
エフェクト15と18の違いは、エフェクト1と10の違いみたいな物だと思ってください。
18の方がなめらかな表示になります。(が、マシンへの負担も大きいです)

三章へ    五章へ
「NScripter」Top  Top Page