〜九章〜 「システムカスタマイズについて」


さて、トップページで「入門者、初心者向けの講座」と銘打っておきながら、今回の内容は中級者向けです
とりあえずNScripterについての基礎事項、および書式などについてわかっていないと今回の内容はつらいと思います。
もしわからない場合、無理をする必要はありません。
まずは八章までや、他のサイト様の講座を読んで、ある程度基礎をわかってからまたここへ来ましょう。
そうすれば、おのずとわかるようになると思います。

さて、そもそも「システムカスタマイズ」とは何なのか?という事になりますが、喩えて言うならば「痒いところに手を届かせる」といった感じです。
例えば、クリック待ち時に右クリックするとメニューが出ます。
しかし、この右クリックメニューは項目を選ぶことはできても外見やエフェクトなどは選ぶ事ができません。
これはデフォルトである「右クリックしたらユーザーが選んだメニューをこういう形で出す」という「システム」が決まっているからです。
これはセーブやロード画面にも言えることで、これらには色気に欠けるなと思う人もいると思います。
いわばこれが喩えで出てきた「痒いところ」なわけです。

そんな「痒いところ」に手を届かせる。それが「システムカスタマイズ」と言いました。
具体的にはどういう事かといいますと、システムカスタマイズによってゲーム中におけるすべての挙動をユーザーが決めることができるようになります。
さらに具体的に言うと、本文内でクリック待ち(@、\)が行われると、ユーザーが指定したラベルにサブルーチンコールするという動作をするようになります。
そのサブルーチンの中に自分の理想の挙動を書いておけば、痒いところに手が届いたゲームシステムになるというわけです。

しかし柔軟性が高い分、力量もだいぶ必要となります。
今回中級者向けと言ったのはそのためです。
まず、見慣れない命令が多く出てきます。
また、システムカスタマイズだと使えなくなる命令があります。
代表的なものだとselect命令とかですね。
ただ、select命令は使えないと困るので代替のcsel命令があり、今回その説明もしますので、安心してください。

それでは、前置きが長くなりましたが、いざシステムカスタマイズの世界へ!


この章では、実際のシステムカスタマイズされたスクリプトを参照しながら説明していきたいと思いますので、このサンプルスクリプト高橋直樹様作のサンプルスクリプトを参照しながら続きを読んでください。
まず、システムカスタマイズすることによってどんな動作をするようになるのかというと、先に述べたように「本文内でクリック待ち(@、\)が行われると、ユーザーが指定したラベルにサブルーチンコール」します。
なので、このサブルーチンコールするラベルを指定する必要があります。


textgosub {*ラベル名}


定義ブロックこの命令を使用することで「このスクリプトはシステムカスタマイズで、@、\が来たら指定されたラベルに飛びます」という意味になります。
サンプルでは「textgosub *customrmenu」なので、クリック待ちされると*customrmenuというラベルに飛ぶという意味です。
これで、システムカスタマイズを宣言したことになります。

定義ブロックにはそのほかに特に説明が必要な命令はないかと思います。(ほとんどの命令の意味は高橋さん作のスクリプトに意味が書いてあるので、ここでは特に意味が難しい命令のみを扱っていくことにします。)

それでは次に、上で宣言されたシステムカスタマイズのラベルを見ていきましょう。
(高橋様のスクリプト→*text_lb、私のスクリプト→*customrmenu)
とはいっても、本来この先は自分で組み立てるものです。
これから説明することはあくまで参考であり、この説明にのっとらなければならないということは決してありません。
ただしここでは基本的にやったほうがいいことを掻い摘んで説明し、他のオリジナルの部分についてはどういうことをしているのかを説明します。
わかりにくいと困るので、色分けします。
基本的にやったほうがいいことと、オリジナルの部分です。

・erasetextwindow 0
始めにテキストウインドウが消えないように設定します。
これにより、「textbtnwait」などサブルーチン内のスクリプトでウインドウが消えたりすることを防ぎます。
なお、ゲームを通してテキストウインドウが出っ放しでいいならば、*startの直後にこれを実行すればここで実行する必要はありません。

・ispage〜getcursorpos〜print
システムカスタマイズにすると、デフォルトではカーソルも表示されなくなります。
この部分はカーソルを表示するためのもので、一つ一つの命令の意味は高橋さんのスクリプトに書いてあるので、割愛します。
もちろん、カーソルはいらないという場合はこの部分は必要ありません。
なお、これを使ってカーソルを表示するとき、定義ブロックで「windowback」を実行していないとテキストウインドウよりも下にカーソルが来てしまうので気をつけて下さい。
(スプライトの重なりの順番については四章を参照してください。)


・btn(spbtn)
これは高橋直樹さんオリジナルの部分です。(直接ではなく、gosubで飛んだ先にspbtnがあります。)
画面上に常にセーブやロード用のボタンを用意して、いつでもボタン一発でセーブやロードができるというシステムです。
*startのすぐ後でセル付きスプライトを読み込んで表示し、ここでスプライトボタンを定義し、その後の「textbtnwait」で押せる状態になります。
そしてまた次のクリック待ちで同じようにボタン化するので、つまりいつでもボタン一発でセーブが行えるのです。


・textbtnwait〜repaint〜if
これにより、ボタン待ちとともにクリック待ちを行います。
ただ私には、textbtnwaitとbtnwait2の違いがいまいちよくわかりませんが、とりあえずシステムカスタマイズのラベルではtextbtnwaitを使うと覚えてください。
「repaint」は、ボタンを押したとき、そのままだとボタン画像が押された画像のままになってしまうのでこれで直します。
画面上にボタンを置くタイプのシステムにするならば、必須です。
その後はセオリー通りにif文で分岐ということになるでしょう。

・texec〜saveon〜erasetextwindow 1
texcは通常クリック待ち(@)なら改行、改ページ待ち(\)なら改ページを行う命令です。必須です。
システムカスタマイズでは、このラベルに飛んできた時に自動的にsaveoff命令が実行されるので、このラベルをぬけるときにsaveon命令を実行する必要があります。これも必須です。
(必ずラベルの最後でなくてはならないというわけではありません)
erasetextwindow 1でテキストウインドウが消える設定(通常設定)にします。
なお、ラベルの始めで「erasetextwindow 0」をしないシステムならば、必要ありません。


とまあ、こんな感じです。
つまりまあ、私のスクリプトは特に珍しい命令は使ってないということになりますかね。
基本というか、システムカスタマイズしていない状態をシステムカスタマイズで実現するとすると、こんな感じです。

この流れを参考に、自分流のシステムを作ってください。


さて次に、選択肢カスタマイズについて説明しようと思います。
なぜ選択肢カスタマイズが必要なのか?
「select」命令では何がいけないのか?
と思う方がいらっしゃると思います。
考えてみてください、選択肢が表示されて選択を迫られます。
こんなとき、とりあえずセーブしてから選択するという人は、少なくないと思います。
さて、セーブしようと右クリック(画面上に常にセーブボタンがあるシステム場合は、セーブボタンをクリック)…おや、何もおきません。
どうしてこうなるかというと、「select」命令によって選択肢待ちをされている間は、システムカスタマイズのクリック待ちとは別のものです。
そのため、右クリックやボタンを押そうとしても、何も反応しないというわけです。

さてこの選択肢カスタマイズですが、「ぶっちゃけいままでどおりの体裁でいい」という方は、高橋さんのスクリプトをコピペしましょう!(笑
はっきり言って、ややこしいですコレ。
とりあえず、システムカスタマイズ用選択肢命令の書式と、「*customsel」ラベルで何をしているのかを解説してみようと思います。


csel "{選択肢1}",{*飛び先ラベル1},"{選択肢2}",{*飛び先ラベル2},…


命令が「csel」になっただけで、他は「select」命令の書式と同じです。
何が「select」と「csel」の違いなのか?
選択肢をカスタマイズする事の意味、上ではクリック待ちの兼ね合いだと述べましたが、もう一つ大きな理由があります。
それは、プレイヤーに選択を求める方法(インターフェースと言うべきでしょうか)すらも自分で決めることができるという事です。
「select」命令を使って選択を求める場合を思い出して下さい。
文章に続いて選択肢が表示されるという、ごく普通のインターフェースで選択を求めます。
いじることができるのは色だけで、フォントサイズ、位置などを変えることは不可能です。
このインターフェースに満足している方は、前述の通り高橋さんのスクリプトを数値だけいじってコピペすれば、それで問題なしです。
しかし、もう少し自分好みのインターフェースにしたいという方、ぜひカスタマイズに挑戦しましょう。
カスタマイズすることによって、例えば選択を求めるときに選択肢ウインドウが画面中央に出て、そこに選択肢が表示されるとか、そういったことができるようになります。

それでは、選択肢カスタマイズの一連の流れを説明します。
まず、「csel」命令が実行されると、それと対になっている「*customsel」という特殊ラベルにgotoジャンプします。(システムカスタマイズのようにgosubジャンプではないので注意してください)
ここから選択肢表示処理に入るので、「skipoff」でスキップを止めています。
この後はシステムカスタマイズと同じく、テキストウインドウが消えないモードにして、セーブやロード用のボタン定義を読み込んでいます。
さて、ここからが選択肢カスタマイズの核になります。
まずは「getcselnum」命令により、このラベルに飛んでくる飛ぶ前の「csel」でいくつの選択肢があったかを取得します。
そして「cselbtn」命令により、指定した位置に選択肢ボタンを作成します。


cselbtn {セレクト番号},{ボタン番号},{X座標},{Y座標}


指定されたセレクト番号の選択肢を、指定された座標に表示する命令です。
このスクリプトでは、従来通り文の続きに選択肢が表示される方式なので、「getcursorpos」命令を使用して現在の文末の座標を取得、そこに選択肢ボタンをおいています。
つまり「getcursorpos」せず、この座標を決まった値にしておけば、いつでも同じ位置に選択肢が出るというシステムが作れるという事です。
そしてその後、もしも選択肢が3つ以上あるようなら(if %0>2 …)、三つ目の選択肢ボタンを配置、さらにあるならもう一個…と続けています。
ここに出てくる「add %2,22」というのは、もしも全部同じ座標に置いてしまったら選択肢にはならないので、縦に22ピクセルずらしているというだけです。
ので、従来通りの選択肢表示システムにするとしても、この「22」の値をフォントサイズに合わせて変えないといけません。
なお、このスクリプトはここで5つ分を定義していますが、この場合本文で「csel」を使用したとき、選択肢が6つ以上あると6つ目以降は表示されず、選択肢にならないので気をつけて下さい。
そしてやっとボタン定義が終わったところで「selectbtnwait」命令を使用します。
この命令により、このラベルのはじめに読んだセーブやロード用のボタンと、先ほど定義した選択肢ボタンがボタンとして押せるようになります。
「selectbtnwait」で返ってくる値は「btnwait」と同じで、ボタン番号が返ってきます。
あとはif命令により分岐をして、セーブなどではなく、選択肢が選ばれた場合、最後の「cselgoto」命令を実行します。


cselgoto {セレクト番号}


指定されたセレクト番号の飛び先ラベルにgotoジャンプします。
これで「csel」命令から始まる、「*customsel」ラベルの一連の流れが終わり、また本文へと戻ります。

さて、ここまで来てなんですが、「セレクト番号って何?」と思っている方が多いかもしれません。
なぜ初めのほうに説明しなかったのかと言うと、「csel」「cselbtn」「cselgoto」の三つの命令のつながりを絡めて説明したかったので、あえてここで説明することにしました。
さて、下のイメージを見てください。



毎度ながら適当な図でスミマセン…

これでセレクト番号についてはわかっていただけると思います。
この図では選択肢が2つしか書かれていませんが、選択肢が増えていくとセレクト番号も0から始まって1づつ増えていくと覚えてください。


システムカスタマイズとは実に奥が深いもので、本当にいろいろなことができるようになりました。
このページでは基本の基本について説明しましたが、これに則る必要はどこにもありません。
自分の思ったものを作れるのがシステムカスタマイズです。
何度でも言いますが、人の考えに則る必要はどこにもないのです。

八章へ
「NScripter」Top  Top Page