◎特殊イベント(メッセージコントロール)講座◎ 2009.8.8更新


今回はVer3から追加されました「特殊イベント」で、RPGっぽいステータス画面を作ってみました。
「特殊イベント」を使用することで、クリックを受け付ける状態ならいつでもメインから外れて設定した専用チャートに跳べるようになりました。
ですが制限もありますので、その点を理解してご利用ください。

このプロジェクト・ファイルは「開発版ver.03.09.05.19」で動作確認しています(通常版での動作は保証しません)。
プロジェクト・ファイルは画像素材以外はご自由にお使いください。


 LiveMaker用プロジェクト・ファイル  特殊イベント製作例(zip圧縮) 824KB


○実行画面:通常画面
実行画面

○実行画面:特殊イベント(メッセージコントロール)実行画面 実行画面

上が通常のノベル風画面です。
メッセージウィンドウの右下にある緑色の◎をクリックすると、下の画面のようにRPG風のステータス画面が出てきます。
ヒットポイントを緑のバーで、最大ヒットポイントを赤いバー、体力・知力・敏捷度を3桁の数値で表示しています。
また、ステータス画面専用にメッセージボックスを作り、簡単な文章表示もさせてみました。


◎下準備
特殊イベントを設置するにはいくつかの下準備が必要になります。
メッセージボックスに特殊イベントへ跳ぶためのボタンを付ける「コントロールパネル」の製作、そして「特殊イベントを作りますよ」とLiveMakerに教えるための設定が必要です。

○メッセージボックスのコントロールパネル
当講座ではコントロールパネルについての説明はしたことがありませんので、簡単に製作手順を書いておきます。


コントロールパネルは、メッセージボックスに貼り付きます。
LivePreviewMenuで「画像選択」を製作してください。
メッセージボックスに合わせて「サーフェスサイズ」を決め、それぞれの「画像」を置いて行きます。
順番は特に決まっていませんが、「名前」だけはヘルプに従い、あらかじめ決められたものを使用してください。
「名前:閉じる」というのはメッセージボックスを一時的に非表示にするものです。
今回重要なのは「名前:イベント」です。
この「名前」だけはご自分で適当に付けてかまいません。
このボタンが押されたとき「特殊イベント」が起動します。



完成したPreviewNemuファイル(.lpm)をプロジェクトオプション→メッセージボックス→コントロールの「プレビューメニュー」の項目に登録しておきます。
余談ですが、わたしはこういったシステム面の画像やデータは管理しやすいように、グラフィックフォルダに「小道具」というフォルダを新規に作って入れております。

○プライオリティ
プロジェクトオプションを開いたついでに、「プライオリティ」を設定します。
プライオリティは過去に何度か説明していますが、簡単に言いますと「描画の優先度」です。
優先度が高いほうが画面の手前に表示され、小さいほど奥になります。


今回は下のような設定にしました。


背景の洞窟画像を「背景奥(プライオリティ数値0)、メッセージボックスは1100で固定、イベント画面はメッセージボックスより手前に表示させたかったので「ステータス画面」というプライオリティを新設し、値は1520としました(数値がハンパなのには意味はないです)。
下準備にはもう2つ大事な部分があるのですが、それは後述の「チャート」で説明いたします。


◎変数リスト


今回は難しい計算などはありませんので、表示したい項目を登録しているだけです。
RPGにありがちなパラメータの「ヒットポイント/最大ヒットポイント」「体力」「知力」「敏捷」の5項目です。
名前の頭に半角「f」がついているのはわたしのクセです。
テストプレイ時に変数リストを眺めやすいように統一した頭文字をつけているだけですので、「そうしなければいけない」わけではありません。


◎チャート
チャートはメインのノベル風場面と、特殊イベント専用のチャートの二つだけにしています。
まずはチャート・リストです。

「特殊イベント」は特別なので、わかりやすいように#を付けておきました。
名前は好きに付けても大丈夫です。

次にメインチャートと特殊イベント用のチャートです。

 

メインチャートはシナリオノードが二つだけです。

メインチャートの<シナリオ:初期設定>では透明画像を[画像表示]で登録して、システムメニューの許可などをしているだけです。
透明画像で[画像表示]しているのは、以降の画像を[画像変更]だけで行えるからです(表示していらなくなるたびに[画像表示][画像消去]をするのが面倒なので)。


「名前:特殊イベント」の画像は、プライオリティを前述の「ステータス画面(1520)」にしています。
「名前:背景」のプライオリティは「背景奥(0)」です。
<シナリオノード:メイン文章>は、メッセージウィンドウに文章を出しているだけです。
本来のゲームのメイン部分になるわけですが、今回は特殊イベントの紹介が主となりますので適当な文章を流すだけにしました。

続いて特殊イベントチャートです。
特殊イベントを呼び出すための最後の下準備は、チャートのプロパティにあります。
メインチャートの「#特殊イベント」にマウスを合わせ、右クリックをしてください。
メニューが出ますので「プロパティ」を左クリック。
「特殊用途」を「メッセージコントロール処理」に設定します(下画像)。



そしてプロジェクトオプションを開き、「特殊イベント」→「メッセージコントロール処理チャート」に、先ほどのチャート(#特殊イベント)を選択してください。



以上2点の設定を行わないと動作しませんのでご注意ください。
なお、「右クリック処理チャート」を「#特殊イベント」に設定すると、右クリックからも呼び出すことができます。
その他の項目に関してましては今回は見送ります。
ヘルプを参考にいろいろいじってみてください。
それでは今回の本題です。



二つありますシナリオノードは、「イベント背景の表示/消去」を行っています。

  

特殊イベントでは、シナリオノードによる文章表示はできません。
その他の機能も制約があるようですが、全てを検証していません。
今回のRPG風ステータス表示に関係する部分だけ調べたところ、「画像の表示/変更/消去」は問題なくできました。
LiveCinemaも使用可能です。
<シナリオ:イベント背景表示>で土台となる背景を表示したら、次はそれぞれのパラメータを表示します。
シナリオノード+計算ノードの複合でも表示は可能だと思いますが、LiveMakerVer3の計算ノードは緻密で、大概のことは計算ノードだけでまかなえるようになっています。
なので、今回は計算ノードだけでパラメータを表示させてみました。
なお、計算ノードは機能の拡張に伴い、従来までと大きく変わってしまいました。
操作に戸惑う方もいらっしゃると思いますが、こちらでは操作方法までは説明しません。
かわりに、簡単な操作方法を別窓でご紹介します→コチラをクリック

<計算:設定>の中身は以下のようになっています。



コマンドの「コメント」はただの注釈文なので説明を省きます。
個人的にはこのようなコメントを付けられると今後の手直し作業が便利になるので助かります。

○矩形サーフェス作成
「コマンド:矩形サーフェス作成」は、文字通り矩形を表示させる命令です。
ここで説明するのは、実行画面の特殊イベント画面でHitPointの最大値を表わしている赤いバーの部分です。
コマンド部分をダブルクリックして開いてみると、以下のような画面が出てきます。



テキスト入力ではなく、テンプレートがあるので初心者でも安心です。
「名前」は任意で付けてください。
わたしはなるべくわかりやすいほうが好きなので、表示したいパラメータに近い名前を付けています。
このさい、名前を""(ダブルクォーテーション)で囲むのを忘れないでください。
囲まないと変数名として判断され、その名前の変数がないとエラーになります。
逆に言うと、変数で指定ができるということですね。
「名前」はLiveMakerではとかく必要になりますので、付け忘れや重複にはお気をつけを。
「親」は指定しなくてもよいらしいのですが、今回は背景画像が決まっていますので指定しました。
上記の#特殊イベントチャートで背景として表示した「"特殊イベント"」という「名前」の画像を「親」にしてあります。
「親」を指定することにより「親」画像のプライオリティ(1520)が基本になりますので、この矩形もメッセージボックスより手前に表示されるようになります。
「X座標」「Y座標」はそのまま、矩形の始点(左上)の座標です。
「親」を指定した場合、「親」画像から見た座標になります。
「幅」は横の長さです。
式(変数)が使えますので、最大ヒットポイントを表す整数変数「fヒットポイント_max」に+1した数値分の長さにしました(+1は緑色バーの枠を考えてのものです)。
「色」は右にあるボタンでパレットを呼び出すことができます。
「プライオリティ」は「親」画像よりも前ということで+1しておきました。
その他の設定はデフォルトのままいじっていません。
設定が終わったら右下の「OK」を押して確定しましょう。
同様に、現在のヒットポイントを表わす「「fヒットポイント」も矩形サーフェスで表示させています。
最大ヒットポイントよりも画面手前になるようにプライオリティを指定することで、赤枠の上に緑ゲージが表示されるようにしました。

○画面キャプション作成
続いて「コマンド:画像キャプション作成」についてです。
画像キャプションは、シナリオノードにある「画像文字」と同じものです。
使い方もほぼ同じです。
例題は実行画面のStrengthの数値部分で、関連している変数は「f体力」です。
これもコマンドをダブルクリックすると以下のような画面が出てきます。



「名前」「親」は矩形サーフェスと同じなので説明を省きます。
「ソース」は画像文字に使う画像ファイルです。

  

グラフィックフォルダの「小道具」の中に入っているので、それを指定しています。
指定するときは""で囲むのを忘れずに。
「マップテキスト」は各文字がどの文字に該当するかを指定するものです。
今回は数字なので、画像の並びと同じ「0123456789」で指定しています。
最後に「z」がありますが、いちおう空白用に用意したもので、実際には使用していませんので作らなくてかまいません。
「1個の幅」は画像一文字分の横の長さです。
一文字あたり16ドット×24ドットの大きさになっていますので、素直に16と入れます。
「1個の高さ」は画像一文字分の縦の長さなので、ここも24で決定です。
「X座標」「Y座標」は表示する場所の始点です。
あとは「テキスト」に表示したい文字列を入力すれば、それに対応した画像文字が表示されます。
この欄も変数指定できます。
ここでは体力数値を三桁右詰めで表示させています。
赤枠内の「テキスト」に注目してください。
画像では途中で欠けていますので、下に式を書きました。

  StringOfChar(" ",3-Length(f体力)) ++ IntToStr(f体力)

なんだか難しい命令が並んでいます。
まずは使用している関数について一つずつ説明をしていきます。

「StringOfChar(a,b)」はbで指定した数だけaを並べた文字列を作る関数です。
「Length(a)」は文字(文字列)aの長さをバイトで返す関数です。
半角文字は1文字1バイト、全角文字は1文字2バイトです。
「IntToStr(a)」は数値aを文字列に変換する関数です。
オプションとして「IntToStr(a,b)」と書くと、bで指定した桁数になるよう、足りない部分を0で埋めてくれます。
例えば「文字列変数moji = IntToStr(54,6)」という式を作った場合、文字列変数mojiには「000054」という「文字列」が入ります。

以上を踏まえて、改めて「StringOfChar(" ",3-Length(f体力)) ++ IntToStr(f体力)」を見ていきましょう。
まずは「++」よりも左となる「StringOfChar(" ",3-Length(f体力))」からです。

「StringOfChar」で指定数まで" "(半角空白)で文字列を埋めます。
その指定数は、「3-Length(f体力))」。
「3-」でわかるとおり、最高3つまで空白で埋まります。
「Length(f体力)」は「整数変数・体力」の長さを調べています。
今回は体力に9が入っていますから、半角文字1文字、つまり1(バイト)です。

 「3-Length(f体力))」 → 「3-1」で空白は二個になります。

これに、「++ IntToStr(f体力)」で整数変数・体力を文字列に変換した「9」が「++(文字列を合体させる演算子)」で連結します( 「空白」は見えないので、ここでは「_」で代用します)。

  __9

これが「StringOfChar(" ",3-Length(f体力)) ++ IntToStr(f体力)」で得られる解答です。
難しいかもしれませんが、覚えておくとRPGやSLGを作るときの見栄えに便利かと思います。
知力、敏捷につきましても同様の処理をしていますので、プロジェクトファイルをご覧ください。

なお、「横の揃え」で右詰めや左詰めの指定ができますが、これは複数行にわたる場合の指定だそうです。
一文だけの場合は上記の方法で行ってください。


○メッセージボックス作成
メッセージボックスはシナリオノードでもお馴染みのテキストを表示する場所です。
特殊イベントでは、テキスト文章を表示するにはシナリオノードではなく計算ノードでメッセージボックスを作り、次の「コマンド:テキスト挿入」で実際の文章を書きます。
まずはコマンドをダブルクリックして表示される画面をご覧ください。



「名前」「親」は「矩形サーフェス作成」と同じ内容ですので説明をとばします。
「X/Y座標」はメッセージボックスの左上の座標で、「幅」と「高さ」はボックスの大きさを表わします。
なお、右半分はプレビュー画面となっています。
ホームページの都合上、全体を表示しますと大きすぎるのでプレビューエリアを縮小しています。
灰色のバックにかすかに見える白い四角が、ボックスの位置と大きさになっています。
こちらをマウスで直接操作しても設定ができますのでお試しください。
「アルファ」はボックスの透過度らしいのですが、ボックスを塗りつぶす方法がわからないので今回は適当に設定して放置しています(設定しなくてよい)。
「フォント名」「フォントサイズ」「行間」「フォント色」「フォントの影の位置」「フォントの影の色」「アンチエリアス」はその名のとおり文字の設定・修飾です。

○テキスト挿入
上記で作成したメッセージボックスに表示するテキスト文章を作ります。
普段のシナリオノードとは異なり、ホームページを作成するときに使うhtmlのような「タグ」を使用して文章を書きます。
使用できるタグにつきましてはLiveNovelのヘルプをご覧ください。



「表示先」はどのメッセージボックスに表示するかを決めます。
「履歴対象」は表示したテキストを履歴に残すかどうかです。

以上で#特殊イベントチャートの<計算:設定>の中身についての簡単な説明を終わります。
続いて#特殊イベントチャートの<計算:待機と画像削除>についてです。



使用されているコマンドは「コメント」「ウエイト」「コンポーネント削除」です。
「コメント」は前述されていますので、「ウエイト」からいきます。

○ウエイト


現状のまま待機させる命令です。
「待機条件」を満たしていると待機します。
ただし、条件を満たしていても「タイムアウト時間」が経過すると待機を終了します。
今回の条件は「マウスの右か左ボタンが押されていなければ現状のまま待機する」、逆に言いますと「マウスの右か左ボタンが押されたら先に進み」ます。

  待機条件:Not(@LClick)&Not(@RCLick)

傍目には何が何やらの条件です。
まず「@LClick(@RCLick)」ですが、これはマウスの左(右)ボタンが押されたかどうかを調べる「システム変数」です。
そして「マウスの右か左ボタンが押されていなければ現状のまま待機する」という条件の、「〜が押されていなければ」という否定文にあたる部分が、Not(TRUEとFALSEを反転して返す「関数」)です。
説明するとややこしくなりますが、そもそも「ウエイト」命令は「条件を満たすとき(条件がTRUEのとき)待機を実行する」というものです。
条件が常にTRUEでないと「待機」してくれません。
ですが単純にシステム変数「@LClick」のみで判定しますと、左ボタンが押されたときはTRUE(真)を返しますが、押されていないとFALSE(偽)を返してしまい、条件を満たせなくなります。
そこで関数「Not」を使うことで、FALSEをTRUEに変換するのです。
逆にボタンが押されたときはTRUEであるはずの答えが「関数Not」を通すことでFALSEとなり、条件を満たせないので先に進みます。
次に二つのボタンをつなぐ「&」の意味ですが、条件文において「&」は、両辺のどちらも条件を満たせばTRUEを返し、どちらか(もしくは両方)がFALSEであればFALSEになります。
わかりづらいですが、下の表を参考にしてください。

ボタン@LClickNot(@LClick)@RCLickNot(@RCLick)Not(@LClick)&Not(@RCLick)
右クリックonFALSETRUETRUEFLASEFALSE
右クリックoffFALSETUREFLASETRUETURE
左クリックonTRUEFALSEFALSETRUEFALSE
左クリックoffFALSETUREFLASETRUETURE


○コンポーネント削除
「ウエイト」から抜け出すと、「コマンド:コンポーネント削除」が実行されます。
コンポーネントとは「構成要素」を指す言葉で、ここでは単純に作成した画像やらメッセージボックスを指していると思ってください(わたしもどう説明していいかわかりません)。
削除したい「名前」を指定すれば消えてなくなるということです。
消えてしまうので、また使いたいときは今までの手順と同じことを繰り返して製作しないといけません(一時的に消すということはできません)。

こうしてすべて削除したのち、<シナリオ:イベント背景消去>でイベント用ステータス画面の背景を透明画像に変えて見えなくし、<終了>です。
<終了>前にいろいろ設定することで、メインシナリオにそのまま戻るのではなく、別のチャートに移動したりできるそうです。
これについては説明いたしませんので、試してみたい方はヘルプを参考にがんばってみてください。


以上、特殊イベントでRPG風ステータス画面を表示させてみるプロジェクトの解説を終わります。
とっつきが難しいかもしれませんが、思ったほど計算ノードの設定は複雑ではないので興味がありましたら利用してみてはいかがでしょうか。
今回も長々とありがとうございました。



    ホームへ戻る