suresuke製作日記

「Elfenis.」の製作日記、Gamemaker:Studioの小ネタなど。

【Elfenis.】システム - メッセージ【Gamemaker:Studio】

どうも、Twitterでは次の更新はないんじゃないかとか囁かれていましたが、なんと次の更新は今日でした。勝ち。

 

というわけで最近作成している部分である「メッセージシステム」について紹介していきたいと思います。メッセージウィンドウはそのゲームの特色というか、雰囲気がでますね。手が抜けないところだと思っています。

実際作っていて楽しい部分です。

f:id:sureiru-jwgs:20170109212815p:plain

昔作成していた「I wanna be the Stargazer」はこんな感じ。ただ、これだと距離が近いキャラクターが喋ったときに、どっちが喋ってるかが分からないことがありました。こういう形式をとる場合、メッセージの上に名前を表示させるとか、ある程度の工夫は必要なのかなという感じがします。

少し、製作的な話をしますと、このメッセージはstring_copy関数で文字列を順々に表示するように抽出しています。

最初は「(」次に「(こ」、次の「(ここ」、次に「(ここは」、次に…というように変数を利用して増加させていくことでメッセージ送りを再現していました。

ただ、この方法だと文章は全部くっついているので個々の色を変えたり、個々の文字をぶれさしたり、っていうのができないんですよね。

 

ということで、「Elfenis.」のメッセージシステムは文字列を1つ1つ分解して表示させるようにしました。こうすることで文章中にタグを設けることで個々の色の変更、メッセージのウェイト、文字のぶれなどを簡単に実装することができます。

今回実装した書式ルール

  • $  : 改行
  • ;x : 色変更。xで色を指定。gはc_green、rはc_red、など。
  • /n : 指定時間(n×20フレーム)メッセージをウェイトする。

例えば "わあ!/2 いい;rリンゴ;wですね!/2 $ぼくも食べたいです。$"

と入力すれば、画像のようになります。(ウェイトは画像ではわからないので後に載せた動画をご覧ください)

f:id:sureiru-jwgs:20170109215356p:plain

こういうメッセージの表示のさせ方は、難しそうで、言うほど難しくありません。

大雑把にやり方を載せると、

文字列を頭から1つずつ別の配列に代入していく。そのとき、個々の文字にパラメータを設定する。

この際、その文字がタグ(";" "/" "$")である場合、配列には代入せず、それぞれの設定を行う。例えば";"である場合、その後の一文字(色コード)を読み取り、その文字に応じてその後の文字に適応する色を変更する。"あ;rいう;wえお"という文字列の場合、「いう」は赤(r)、「えお」は白(w)になります。デフォルトは白なので「あ」も白です。"$"の場合は、その行をそこで終了とし、その後の文字は次の行となる、という風になります。

このアルゴリズムによって、個々の文字はそれぞれのパラメータを持ちます。color(その文字の色),wid(その文字までの幅),line(その文字が存在する行数),time(その文字でウェイトする時間)となります。

②個々の文字のパラメータに応じて一文字ずつ描画。

もっとスマートなやり方がありそうですが、とりあえず自分が実装したのはこんな感じです。これに加え、文字をぶれさしたり、文字をおっきくできたり、文字をホラーっぽく表示させたりというのを実装してみました。使う機会があるのかは分かりません…

ウェイトと色変更は絶対欲しい要素だったので、いい感じに実装できて結構うれしいです。これで、キャラクターの会話に臨場感が出せそうです。

 

今回、このシステムを実装するにあたって重宝した関数は、

です。string_copy関数は上で紹介したように、文字列を部分的に切り取ることができます。string_width関数は文字列を実際に描画したときの幅を知ることが出来ます。この関数は、関数実行時に適用されているfontで幅を測るので気をつけてください。

進捗動画

youtu.be

文章は適当です。それっぽい雰囲気だしてみたかっただけなので「あの男」が誰かは知りません。

 

以上になります!お読み頂きありがとうございます。

また、次の記事で!