RPGツクールVVXAceで任意の位置に文字を表示する方法 / RPGツクールVXAce小技・Tips集
RPGツクールで任意の位置に文字を表示したいことは多々あるかと思います。
基本的なことですがこの文字表示が意外と曲者。
ここではその方法をご紹介します。
$win1 = Window_Base.new([(Windowの左端の)X座標], [左端のX座標], [幅], [高さ])
$win1.opacity = 透過度(0~255までの範囲で設定。数字が大きい方が色が濃い。)
$win1.contents.draw_text(window内のX座標, window内のY座標, 幅, 高さ, "表示したい文字", (行の揃え方))
●行の解説●
1行目は$win1という変数(入れ物のようなもの)にWindow_Base.newという新しいウィンドウを作るためのコード(呪文のようなもの)を入れています。
「$win1」の部分は$を先頭に付けてお好きな名前を付けてください。
$を付けないとイベントコマンドで行った際には一定時間が経つと文字は消えてしまいます。
グローバル変数を使用する際には名前が被らないようにしてください。
(グローバル変数についてはなるべく使用しない方が良いのですが、初心者のうちは直感的なコードの方が良いので、ここでは使用しています。)
ここでウィンドウを表示する位置やウィンドウの縦横の大きさを決めています。
1行目だけで新しいウィンドウが表示されます。
2行目は表示するウィンドウの背景の透過度を決めています。0~255の範囲で数字を入力してください。
3行目はウィンドウ内で表示する文章の表示範囲と表示位置、表示内容を決めています。
最後の(行の揃え方)については以下のように対応しています。
0:左揃え
1:中央揃え
2:右揃え
省略して書くこともでき、省略するとすべて左揃えになります。
◯サンプル◯
$win1 = Window_Base.new(20, 20, 504, 376)
$win1.opacity = 0
$win1.contents.draw_text(0, 0, 492, 364, "test")
少し説明が長くなるなるので先に結論だけいうと、
draw_textに入力する幅はウィンドウの幅の-12px、高さは21pxにしておけば1行であれば取りあえずは問題ない
ということです。
この文字の描画についてややこしいところはウィンドウの表示位置・大きさと文字を描画する位置・範囲の大きさが初めてだと把握しにくいという点です。
まずはopacity(透過度)なしで見てみます。
◯サンプル◯
$win1 = Window_Base.new(20, 20, 504, 376)
$win1.contents.draw_text(0, 0, 492, 364, "test")
実行結果
このように綺麗にウィンドウが出ましたが、これはウィンドウのサイズを綺麗に揃えたからです。
ウィンドウの大きさは白い太枠に黒い背景と色がついているので分かるのですが、テキストの表示範囲というのがこの図だとイマイチ把握できないかと思います。
テキストの表示範囲を赤く可視化するとこんな感じになります。
もっと可視化するとこんな感じです。
ウィンドウと文字を表示する範囲の12pxのずれはスクリプトエディタのWindow_Base方で「標準パディングサイズの取得」に初期設定されているパディングサイズ(余白)です。
ここで気を付けなければならないのは文字の表示範囲です。
普通の文字サイズは大体21px位なのですが、文字の表示範囲を20px以下にすると文字が途切れてしまいます。
例えば高さを変更し、18にすると以下のようになります。
◯サンプル◯
$win1.contents.draw_text(0, 0, 492, 18, "test")
実行結果
このように少し文字が途切れてしまうのです。
これを踏まえたうえで、この文字の表示の何がややこしいかというと、一つは上に揃えたい時でしょう。
このdraw_textメソッドには左右中央揃えはあっても行を上下に寄せるということはできないのです。
ですので、文字を上に寄せたい時は文字表示の高さを調節しなければなりません。
例えば高さを20にすると丁度良くなります。
◯サンプル◯
$win1.contents.draw_text(0, 0, 492, 21, "test")
実行結果
さらにもう一点。文字が長くなったときに文字の表示範囲の幅が足りないとそこでも切れてしまいます。
◯サンプル◯
$win1 = Window_Base.new(20, 20, 504, 376)
a = "寿限無寿限無五劫の擦り切れ海砂利水魚の水行末"
$win1.contents.draw_text(0, 0, 492, 22, a)
実行結果
このように上手く表示されていたのが、幅を492から200にすると・・・
◯サンプル◯
$win1 = Window_Base.new(20, 20, 504, 376)
$a = "寿限無寿限無五劫の擦り切れ海砂利水魚の水行末"
$win1.contents.draw_text(0, 0, 200, 22, a)
実行結果
このように文章がすべて入らずに見切れてしまうのです。
さらに十分な幅を取っていないと文字も横に小さくなり、可読性が低くなってしまいます。
こうして冒頭の結論
draw_textに入力する幅はウィンドウの幅の-12px、高さは21pxにしておけば1行であれば取りあえずは問題ない
に行きつきます。
たった文章を表示するだけですが、これだけ配慮することがあります。
面倒ですが、仕方ありませんね。
あとは上記のサンプルに
$win1.opacity = 0
を入れれば背景が完全に透明になり、文字だけが浮かび上がります。
また、文章を消す際は
$win1.dispose
$win1 = nil
の2行を入れてしっかりと消してください。
これを入れないとおかしな表示になる可能性があります。
ウィンドウが消されている状態でdisposeをするとエラーを吐く原因となるので、
if $win1
unless $win1
$win1.disposed?
$win1 = nil
end
end
とした方が良いです。
1行目のifでは$win1という変数が存在するがどうかを確認し、2行目のunlessではdiseposeされているかどうかを確かめています。
オリジナルシステムなどの製作依頼・相談があればプラグイン・マップ等個別製作依頼のページまでお願いします。