セリフを話すキャラクター名をメッセージ欄に必ず表示する

投稿者:            mini mosmoss 投稿日:2016/09/03 10:24

主にメッセージウィンドウについての記事になる予定です

こちらの質問http://rmake.jp/published_items/30449を見て
ユーザーにとって有益な質問だと思いちょっと調べてみようと思いました

役立つ情報を書けるかはわかりません

少なくともこれまで出てる情報のまとめになればいいかなと思っております

○基本的な情報○
Rmakeの基本のメッセージウィンドウは
speak関数や選択肢関数で使われているものです

基本的なspeak関数の使い方
関数リファレンス上の説明
メッセージウィンドウの枠の大きさを変えたり、表示場所を変えたりしたい
メッセージウィンドウ枠群のデフォルト値(どこかで見た気がするので探し中)
フォントのデフォルト値

簡単に書ける反面、フォントや枠を少しいじろうとするとその設定をするたびに関数をたくさん書く必要があります
この設定は入力支援が充実しているのでそれほど難しくはありません

speak文は簡単に書けるので使いやすいですが、その代わりにできないこともあります
・メッセージウィンドウを複数同時に表示できない
・メッセージ枠のデザインを変更できない
・スピーク文を表示中は全ての処理が一時停止する
(例えばRPGエディタならスピーク文を表示させながら主人公を動かしたりはできない)


ところで、画面上に文章を表示させる方法はspeak文だけではありません
テキストボックスという領域をあらかじめ設定しておき、
その中に表示する文章を更新していく、という方法もあります
関数リファレンス上は画面テキストと呼ばれています

自由な位置における画像や文字列の使い方
関数リファレンス上の説明

この画面テキストにはspeak文のような目に見える枠がありません
中に入れる文章がテキストボックスからはみ出すと
改行されたりはみ出た文が途切れて見えなくなります

この画面テキストは設定が面倒ですが
・画面上にいくつもテキストボックスを表示できる(多すぎると重すぎて動きが鈍くなる)
・文章を表示させながら他の処理ができる
という点が、speak文とは異なっています


○応用的な情報○
上であげたspeak文でできないことをできるようにするために
メッセージウィンドウを自作するユーザーもいます

メッセージウィンドウ自作の方法は、
文章表示には上であげた画面テキストを用いて、そこにメッセージウィンドウ画像を表示するというものです

簡単ウィンドウ表示関数の見本(とりかさん作)
とりかさんの簡単ウィンドウ表示関数のスクリプト↑)
画面上に複数同時に表示でき、枠の位置や大きさを調整できる、デフォルトやオリジナルのメッセージウィンドウ

オリジナル選択肢関数の見本(ラジアンさん作)
ラジアンさんのオリジナル選択肢関数のスクリプト↑
とりかさんの簡単ウィンドウを使って選択肢を表現できるようにしたもの
選択肢を二次元的に表現するなど、より使いやすそうな機能が実現されている
ループを使っているので、選択肢中はループ内以外の処理が一時停止する

ネーム付きメッセージウィンドウ(きゅうりさん作)
左上にネームタグがついたメッセージウィンドウ素材とそれを使う関数をセットで公開している

他にも、ノベルエディタ限定ですが、aoihikawaさんの日本語ノベルえでぃたも
自作メッセージウィンドウを使える装置です
[タグ日本語ノベルえでぃたについて]

このように、オリジナルメッセージウィンドウを実現する方法は公開されているのですが、
日本語ノベルえでぃた作品以外では、あまり多くの作品では使われていないという印象があります
スクリプトが長かったり複雑に見えたりすると、使うのまで難しそうに見えるのかもしれません

同じように長いスクリプトの「売ったり買ったりできるお店処理」などは
RPG作品でよく使われているので、単純に需要の問題かもしれません

画面テキスト設定に加えてスプライト画像設定まで絡むので
それだけで、ユーザー定義関数内のスクリプトは複雑で長くなります
枠の大きさなどの自由度を確保したり、スクロール表現を加えると更に複雑になります
公開されているスクリプトは大変貴重なものと言えるでしょう


○セリフを話すキャラクター名をメッセージ欄に表示する方法○
前置きが長くなりましたが、タイトルになっている本題はここからです


0、愚直に入力
画面に文章を表示して、キャラクターにセリフを話させる、
そして現在話しているキャラクターの名前を表示させたいという時、
入力を簡単にする方法は色々あれどその基本はこれだと思います

speak("王さま「勇者よ、よくぞ参った」")
speak("王さま\n「勇者よ、よくぞ参った」")
speak("王さま:\n勇者よ、よくぞ参った")

全てのセリフについて、そのセリフを言っている人の名前を書いていく、
という当たり前すぎる方法ですが・・・
詳しくは知らないのですが、ツクールなどでもこの方法ですよね?

\nを改行とみなすのがちょっと慣れない・・・という場合には
ヒアドキュメントを使うという書き方もあります
speak(>>EOS)
王さま:
勇者よ、よくぞ参った
EOS



1、ユーザー定義関数を作って少しだけ楽に
名前を書いて、\nで改行して「」をつけたりしてというのを全部やるのが面倒・・・
例えば、
hanasu("王さま","勇者よ、よくぞ参った")

と書いたら自動的にspeak文で

王さま
「勇者よ、よくぞ参った」

と表示させるようにできないもんかな〜というくらいだったら
def hanasu(name, text)
s=name+"\n「"+text+"」"
speak(s)
end

と開始スクリプトに書いておけば
hanasu("王さま","勇者よ、よくぞ参った")
hanasu("勇者","魔王が復活したというのは本当ですか")
hanasu("王さま","本当だ、至急魔王城に向かってもらいたい")

などと書けるようになります

2、きゅうりさん配布のネームタグ付きのウィンドウを使う

3、テキストでない方法で表現する(例:トットと魔法のスープ)

フリーゲーム界隈で顔グラと通称されるような、
しゃべっているキャラクタの顔の絵をメッセージと同時に表示する方法があります
Rmake作品ではあまり見かけませんが、alnyanさんのトットと魔法のスープでは
可愛らしいキャラクタのグラフィックに名前を描いてとてもわかりやすく表現されています

顔グラ表示関数をRmakeで実現すると次のようになると思います
#顔グラを表示、また表示内容を変更する関数
def kaogura(name,no) #nameは誰の顔グラか、noは何番目の絵を表示するかを表す

#キャンパスがビジブル状態になっているか否かの判定
#ビジブルでない場合、ビジブル状態にする
#RPGエディタで必要な確認
  if getCanvasVisible()
  else
     setCanvasVisible(true)
  end


#スプライトを作る画像idの選別
#名前に対応する画像idを変数spr(スプライト)に入れます
     case name
       when "salbia"
         spr=310360
       when "miranda"
         spr=310367
       when "corat"
       when "sister"
       else
         spr=0
     end

    sqr=96 #顔グラ一枚四方の大きさ #顔グラ一枚は正方形と想定
   #spr(スプライト)と紛らわしくてすみませんsquerスクエアのsqrです「q」「Q」
    x=28+20 #顔グラ表示位置x座標
    y=446+20 #顔グラ表示位置y座標
#上のsqr,x,yの3つの数値は使う素材や、表示させる場所に合わせて作者が適宜調整します

#ここからスプライト設定
    img_name = "kaogura" 
    #画像ハンドル名はkaoguraにしてみました
   #お好みで変えてください

    get_x = 0;    get_y = 0;    get_w = sqr;   get_h = sqr
    set_x = 0;    set_y = 0;    set_w = sqr;   set_h = sqr
    
    if no == 1
        get_x = 0;    get_y = 0
    elsif no == 2
        get_x = sqr;   get_y = 0
    elsif no == 3
        get_x = sqr*2;  get_y = 0
    elsif no == 4
        get_x = sqr*3;    get_y = 0
    elsif no == 5
        get_x = 0;   get_y = sqr
    elsif no == 6
        get_x = sqr;  get_y = sqr
    elsif no ==7
        get_x = sqr*2;  get_y = sqr
    elsif no ==8
        get_x = sqr*3;  get_y = sqr
    else
        get_w = 0;    get_h = 0
        set_w = 0;    set_h = 0
    end

    setVariable(img_name, createSprite(spr))    
    setSpriteRect(getVariable(img_name),
                  get_x, get_y, get_w, get_h, set_x, set_y, set_w, set_h)
    setSpriteZOrder(getVariable(img_name), 1002)
    setSpritePosition(getVariable(img_name), x, y) #顔グラ表示位置

#スプライトの描画
    drawCanvas()

end
インターネット上で公開されている顔グラ素材には形式があります
正方形の顔グラが横に4つ並び、それが2列、計8 枚の顔グラがワンセット(一枚絵)とされています
大手ゲームエンジンの仕様にかなっているためと推測されます
上の関数も、その形式に則った素材(一枚絵)を使用するという仮定の元に作られています
1234
5678
上のように場所と数値(no)が対応しています

RPGエディタで使う場合、上記関数を開始スクリプトに書き、
個々のイベントには例えば次のように書きます
使用例:
kaogura("salbia",3) #キャラクター"salbia"の3番目の顔グラを表示する
また、この関数で表示させた顔グラを消すときには次のように書きます
deleteSprite(getVariable("kaogura"))

コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2016/09/08 23:25, 履歴)
若干進捗があります
http://rmake.jp/games/30015/limited_play
ID 1234 PASS 1234
ウィンドウベースを8種類から選べる様にしたことと
顔グラの仕組みを作ったことです
         mini mifa(投稿日:2016/09/05 12:54, 履歴)
コメント失礼します。

統一しているつもりでも、カッコを忘れたり、妙なスペースが空いていたり、
ケアレスミスが目立つ部分かもしれません。毎度、直してる気がします。

ネームタグ付き、使ってみようかなぁ。
貴重な情報ありがとうございました。
            mini mosmoss(投稿日:2016/09/05 21:13, 履歴)
セリフの確認や直しなどはどのゲームエンジンでも避けられない作業ではあるのですが、
事前に手間を減らせる仕組みができれば30分くらいは儲けられるのでは・・・と思ってます

ウディタ用のメッセージウィンドウのフリー素材なんかもいいのがあるのですが、
とりかさんのスクリプトを読みこなして、Rmakeで使ってみたいです
Cdv30200 aoi icon mini aoihikawa(投稿日:2016/09/04 00:38, 履歴)
簡単に実装できる部分でも
ちょっと工夫をしようと思うと
難易度が極端に上がるのは
Rmakeの特徴のひとつかもしれませんね
 
こういった部分の纏め記事
非常に助かります
            mini mosmoss(投稿日:2016/09/04 07:57, 履歴)
何が簡単にできて何が簡単にできないかを
短い時間で判断する勘所が必要になりますね

自分と初級者用のまとめですが記事にする以上
何か新情報も載せたいなと思っております