2016年2月11日木曜日

立ち絵付き会話の共通コモンイベント

前回の予告の通り、立ち絵付き会話の共通コモンイベントを実装していきます。
ウディタのデフォルトの機能として、顔表示の機能があるのですが、やはりおもらしゲーである以上、出来るだけ全身を映して恥ずかしく濡らしてしまった衣服を晒したいものです。

さて、実装方法です。初めは車輪の再発明は宜しくないということで、誰かが作って公開しているコモンイベントを使おうと思っていたのですが、結局やめました。理由は以下の3点です。
  1. ゲームデザインに対し最適な抽象度でなければ共通化するメリットが薄い
  2. 充分なドキュメントが得られない算段が高く、そうなった場合は結局ソースと向き合うことになるので、手間の軽減の意味合いが薄い
  3. カスタマイズの必要が生じる算段が高く、以下同上


特に上記の1は、考え得る共通コモンイベントの使い方のイメージと、共通化せずにイベント内で処理記述する場合の手間を比較した時に強く意識されました。

主人公一人の場合の立ち絵付き会話をイベント内に記述すると以下のようになります。
これで以下のように表示されます。

現状でもそこそこ簡潔ですが、会話は今後多く実装するイベントであるため、少しでも効率化したいです。これをさらに効率化する共通機能が必要です。
(但し、これは最も簡単なパターンであり、また画像の表示に詳細な設定があります)


<画像の表示に関して付記>
実は、これだけの画像を表示するのも楽ではありませんでした。
思うような表示サイズや解像度にならなかったり、ジャギが出たりしました。
検証の結果、何故か拡大率が50%である場合に等倍で表示されることが分かり、
上記の設定にすれば、画像のピクセル数に関わらず正常に表示されることを確認しました。
<付記おわり>


検討の中で、このゲームは主人公が1人である前提なので、立ち絵付き会話の殆どは1人か2人であることが想定されることに気付きました。3人以上を想定する場合、共通コモンイベントに渡さなければならない情報が増え、使用の手間が大きくなることもあり、1~2人の会話のみに対象を限定し、以下のような仕様に決定しました。

・以下の3フェーズに分けて使用する。
  1. 会話の開始。画像ファイルをシステムDBのキャラ画像から選択する。
  2. メッセージの表示。発言者以外は暗転する。
  3. 会話の終了。表示されていたものが消える。

・会話開始時に2つの画像の指定の有無によって、以下のようにモードを切り替える
画像1画像2モード
なしなしぬいモノローグ
なしありぬいと他キャラの会話
ありなし他キャラモノローグ
ありあり他キャラ同士の会話



長くなりましたが、ここから実装に入ります。

まずはコモンイベントの入力を設定します。
「処理区分」で、上記の3フェーズを切り分けます。これはプルダウンで入力できるようにします。

「キャラ画像_1」は右側のキャラの画像です。システムDBに登録されたキャラクター画像からプルダウンで選択できるように設定します。なお、この引数は「処理区分」が"表示開始"の場合のみ評価されます。
左側のキャラの画像である「キャラ画像_2」も同様です。

「発言者」はどちらの左右どちらのキャラが話しているのかを表す引数で、「処理区分」と同様にプルダウンから選択できるようにします。これを指定することで、立ち絵の暗転によってどちらが話しているキャラなのか明らかになります。この引数は「処理区分」が"表示開始"であり、かつ2人で会話するモードの場合にのみ評価されます。

「メッセージ」はウィンドウに表示するメッセージです。そのままなので説明は割愛します。


さて、あとは内部処理を仕様通りに実装するだけと思いましたが、ここから先がなかなかの鬼門でした。
この部分、この4行を書くのに4時間くらいかかりました。



まず、曲者なのがDBからの入力です。コモンイベントを呼ぶ側のイメージはこんな感じになります。
なお、システムDBの設定はこんな感じです。
これで引数として受け取った変数にファイルパスか、DBの当該データを参照を表す値である"1308000200"が格納されるのであればもう少し話が早かったのですが。
実際には"2"が格納されます。

そこで必要になったのが、上2行の処理です。定数としてDBの0件目のデータの参照を表す定数を変数に格納し、その後に入力値の100倍を加算しています。(三桁目がデータ番号を表すため)
特にキモなのが、この一行目の処理です。
ここでは、ポインタ操作のような処理が必要になります。"参照によって取得した値"ではなく"参照を表す値"を操作したいのですが、「データを呼ばない」にチェックを入れることで、これが実現できます。(これに気付くのに2時間くらいかかりました)

続いて、3行目の文字列操作処理です。
ここでは文字列型の変数にファイルパス格納しています。参照しているのは、先の処理でシステムDBのデータの参照を格納した変数の参照です。参照によって取得した値を更に参照として扱って値を取得してくれるかどうか心配でしたが、どうやらその通りに動いてくれました。(この実装方法に辿り着くのにも2時間くらいかかりました)

これでようやく、引数入力からファイルパスを取得できました。これで表示する画像を指定することができます。
では、上手く行ったところで使用例を紹介していきます。


①ぬいモノローグモード
この記事の最初のほうで上げたスクショとほぼ同じですが、共通コモンイベントで実装しています。
このように画像を指定しない場合、暗示的に主人公のぬいちゃんの画像が指定されます。画像の表示位置は右下基準の固定ですが、右側の余白の幅を調整することでコード修正をせずに表示位置を調整できます。


②ぬいと他キャラの会話
2つ目の画像のみを指定した場合、ぬいとそのキャラの会話になります。2つめの画像は自動的に反転して元画像の右下(反転後の左下)基準に固定配置されます。反転時のキャラ配置も非反転時と同様に画像右側の余白の幅によって調整可能です。(非反転状態のキャラと反転状態のキャラの各画面端からの距離は同じになります)
キャラの暗転の切替はメッセージ表示(2行目と3行目)でそれぞれ指定している「発言者」によって切り替えています。


③他キャラモノローグ
1つ目の画像のみを指定した場合、そのキャラのモノローグになります。画像は左下基準の固定配置されます。立ち絵を左下基準の配置するのはここだけなので、画像左側の余白の幅を調整することでコード修正をせずに表示位置を調整できます。


④他キャラ同士の会話
両方の画像を指定した場合、それら2キャラの会話になります。1つめの画像が右側のキャラになります。



さて、なかなか大変でしたが、使用頻度の高そうな共通機能が一つ完成しました。今後も改良すべき点が出てくるかも知れませんが、ひとまずこんなもんでしょう。

キャラ絵が出るようになったら、ドット絵をデフォルト素材の普通の女の子で代用しているのも寂しいように思えてきました。
次回はドット絵を制作しようと思います。なお、私はドット打った経験は無いので、これもなかなか大変な作業になるのではないかと思っています。

0 件のコメント:

コメントを投稿