吉里吉里への道>「吉里吉里/KAG」実験室>タイプライターのような音を出す

タイプライターのような音を出す

 タイプライターのような音を出すスクリプトを書いてみました。

; first.ks -----------------------------------------------------------------

; タイプライター -----------------------------------------------------------
@macro name=type
@call target=*loop
@endmacro
;---------------------------------------------------------------------------

@type text="This script was written by Taro."
@s

;---------------------------------------------------------------------------
*loop
@seopt volume=&intrandom(90,100)
@playse storage=key cond="kag.skipMode<1&&mp.text[0]!=' '"
@ch text=&mp.text[0]
@wait time=&intrandom(0,500)*random+25
@eval exp="mp.text = mp.text.substr(1, mp.text.length-1)"
@jump target=*loop cond=mp.text.length>0
@return
;---------------------------------------------------------------------------

 一応、順を追って説明してみましょう。まず、

; タイプライター -----------------------------------------------------------
@macro name=type
@call target=*loop
@endmacro
;---------------------------------------------------------------------------

の部分で、マクロを定義しています。このマクロは、*loop というラベルを呼び出すだけのマクロです。

 次に、

@type text="This script was written by Taro."
@s

の部分では、先ほど定義した type マクロを呼び出しています。ここでは、type マクロに text 属性を指定して使用していますが、先ほどのマクロ内では、text という属性は使用していません。ここには注意が必要です。これはどういうことかというと次の部分で明らかになります。

 さて、その次の部分というのは、

;---------------------------------------------------------------------------
*loop
@seopt volume=&intrandom(90,100)
@playse storage=key cond="kag.skipMode<1&&mp.text[0]!=' '"
@ch text=&mp.text[0]
@wait time=&intrandom(0,500)*random+25
@eval exp="mp.text = mp.text.substr(1, mp.text.length-1)"
@jump target=*loop cond=mp.text.length>0
@return
;---------------------------------------------------------------------------

という部分です。これは、type マクロによって呼び出されるラベルの中身です。この中で、mp.text という変数を使用していますが、これが、本来マクロ内で使うはずの text 属性です。このように、マクロの中から、ラベルを呼び出した場合に限り、呼び出し先のラベルでは、マクロに対して指定した属性を使用することができます。これは、なかなかおいしい裏技です。

 このラベルの中身も詳しく説明しておきましょう。まず、

@seopt volume=&intrandom(90,100)

の部分では、SE のボリュームを 90〜100の間でランダムに設定しています。良く分からないという人は、KAG3 ドキュメントのエンティティの部分と intrandom の部分を読んでみてください。

 次の、

@playse storage=key cond="kag.skipMode<1&&mp.text[0]!=' '"

の部分では、key という音声ファイルを再生しています。ただし、スキップ中や、テキストが半角スペースの場合は、音が鳴らないようにしています。これは、KAG3 ドキュメントの cond 属性の部分を読んでみてください。

 次の、

@ch text=&mp.text[0]

の部分では、テキストの内、最初の1文字を表示しています。これも、先ほどのエンティティを使っています。また、「mp.text[0]」としているのは、mp.text という文字列の1文字目という意味です。

 次の、

@wait time=&intrandom(0,500)*random+25

の部分では、ランダムな時間でウェイトを取っています。なぜランダムにしたかというと、人間らしさを出すためです。「intrandom(0,500)*random+25」というのは、私が適当に調整した結果です。

 次の、

@eval exp="mp.text = mp.text.substr(1, mp.text.length-1)"

という部分では、テキストの最初の1文字以外を切り取っています。つまり、最初の1文字を削除しています。最初の1文字は、もう先ほど表示したので、必要がなくなったわけです。マクロの属性は、単なる変数なので、このように色々な操作をすることが可能です。substr という関数は、KAG3 ドキュメントの substring の部分に説明があります。

 さて、次の、

@jump target=*loop cond=mp.text.length>0

という部分では、*loop ラベルに戻っています。ただし、表示する文字が無くなった場合は、ここは無視されて次に進みます。それで、

@return

で、マクロ内から「@call target=*loop」としてラベルを呼び出した部分に戻り、マクロが終了します。

 以上で、説明は終了です。

 このスクリプトは、シルクさんの管理されている吉里吉里サンプル&プラグインに置かせてもらっているので、ダウンロードしたい方は、そちらからどうぞ。

吉里吉里への道>「吉里吉里/KAG」実験室>タイプライターのような音を出す