【RPGツクールVX Ace】動くタイトル画面を作ろう!(ウィンドウ編)【初心者向け】
どうも、つい最近自転車を撤去された莞爾です。以後気を付けます、もとい、以後お見知りおきを。
さて、デフォルトのタイトル画面には「ニューゲーム、コンティニュー、シャットダウン」のコマンドがありますが、「ウィンドウの位置を変えたーい」とか、「選択肢を中央揃えにしたーい」とか、「ウィンドウを消して選択肢だけにしたいてー」とか、「オリジナルのコマンドをつけくわえたいロドリゲスー」とか、いろいろやりたいことはあると思います。
それとこれは独自の見解ですが、何かと疎まれがちなツクール感はここから出ているような気もします。何て言ったって一番最初にプレイヤーが見る画面ですから。
……と、前置きはさておいて、早速動かしていきましょう。
目次
■ウィンドウの位置を変える
■ウィンドウの大きさを変える
■選択肢を中央揃えにする(行間の長さを変える)
■ウィンドウを消して選択肢だけにする
■選択肢を横に並べる
■オリジナルのコマンドをつけくわえる
■ウィンドウの位置を変える
まず、デフォルトのウィンドウの位置はclass Window_TitleCommandのupdate_placementというメソッドの中で決められています。このメソッドはinitializeというクラスを読み込んだ時に一度だけ実行されるメソッドから呼ばれています。
ではさっそく、数値の変えていきましょう。デフォルトのXは(ゲーム画面の横幅(Graphics.width、デフォルトでは544)-このウィンドウの横幅)÷2となっており、Yのほうは(ゲーム画面の縦幅(Graphics.height、デフォルトでは416)×1.6-このウィンドウの縦幅)÷2となっています。
では、試しにこの位置設定の部分を#でコメントアウト(該当の部分を評価しないこと)してみましょう。すると、ほかにこのウィンドウの位置を設定している箇所がないため、ウィンドウX・Yはデフォルト設定の0になります。つまり、こうです。
さて、では次にこのウィンドウを任意の位置に持っていきましょう。例えば、右に50下に300のところに持っていきたいというなら、
こうです。そしてこうすると……
こうなります。だいぶ雰囲気が変わりますね。
ちなみに、Xの数字は数学みたく正のほうに増えるにつれて右のほうにずれ、負のほうに増えると左にずれていきますが、Yは正のほうに増えるにつれて位置が下がっていき、負のほうに増えるにつれて位置が上がっていきます。
X=30,Y=-15の場合の図。
それと、数字で直接指定していると、Graphics.resize_screenで画面のサイズを変えたときや、このウィンドウのサイズを変えたときなんかに、ウィンドウが思ってた位置よりずれてしまうことがあります。
先ほどちょっと触れましたデフォルトの位置設定ではそれを避けるために、直接数字で指定することなく、画面のサイズやこのウィンドウのサイズ、倍率などを使って位置を調整していました。まあ、そんなに頻繁に画面のサイズもろもろを変えることはないと思うので大丈夫だと思いますが、もし気になる方はそういった方法で位置調整すればいいでしょう。
ちなみに、Scene_Titleでも位置を変えることができます。Window_TitleCommandで設定した座標はScene_Titleで設定されたものに加算されます。基本的に使うならどちらか一つでいいです。
■ウィンドウの大きさを変える
タイトル画面の選択肢のウィンドウの横幅はWindow_TitleCommand内のwindow_widthによって160と決められています。
この数値を変更することによって、ウィンドウの横幅を自由に変えることができます。
ちなみに、縦幅を決めるwindow_heightというメソッドはWindow_TitleCommand内にはなく、Window_TitleCommandのスーパークラスであるWindow_Commandの中に入っています。スーパークラスとは、サブクラス(子クラス、ここでいうWindow_TitleCommand)のもととなるクラスのことで、スーパークラスで決められた命令は、特に変更がない限りサブクラスでも同様に行われます(画像編でもスーパークラスについて説明しています
【RPGツクールVX Ace】動くタイトル画面を作ろう!(画像編)【初心者向け】 - 莞爾の草原。
)。
話を戻します。つまり、Window_TitleCommandクラスにはないメソッドなので、スーパークラスのWindow_Commandからメソッドwindow_heightをコピペしてきます。
「fitting_heightって何?」とお思いの方もいると思います。これはWindow_Commandのスーパークラスのスーパークラス、Window_Base内にあるメソッドです。ひいおじいちゃんの形見って感じですね。……違いますかそうですか。とにかくスーパークラスは何個でも呼び出せるんです。
見てみると、line_number×行の高さ(デフォルトでは24)+行間(12)×2という計算になっています。このline_numberというのはこのメソッドを呼ぶときに、呼んだ側が指定した引数を格納する変数です。
window_heightではfitting_height(visible_line_number)となっていて、今回はline_numberにはvisible_line_numberが代入されていることになります。このvisible_line_numberというのはWindow_Command内にあるメソッドで選択肢の数を返します。つまり、3です。つまり、Window_TitleCommandデフォルトのウィンドウの縦幅は3×24(行の高さ)+12(行間)×2、ということで96であることが分かります。くどい。
ちなみに、縦幅をwindow_heightの数字より1でも小さくすると、下の図のように矢印が表示され一つ下の選択肢が表示されなくなります。
スクリプトを組めばこうなることを避けることもできますが、特に理由のない限りはwindow_heightの数字より大きい数字にすることをおすすめします。
それと、大きさを変えるとウィンドウが画面からはみ出ることがあります。ウィンドウの位置変更の方法は上記参照。
それと、WindowクラスはSpriteクラスではないので、ウィンドウを画像として拡大したり角度をつけたりということはできません。
■選択肢を中央揃えにする(行間の長さを変える)
いくらウィンドウの横幅を大きくできたとしても選択肢が全部左揃えだとなんだかちょっと不揃い感を感じるという人もいると思います。
ということで選択肢を中央揃えにしましょう。
基本的に、ウィンドウ上で文字を描写するときはWindowクラスのcontentsというBitmapのdraw_textというメソッドを使うのですが、このときに文字のアライメント(揃え方)を決めることができます。そして、そのアライメントはWindow_Command内で自由にいじれるようになっています(デフォルトで)。
そういうことで、アライメントを決めているこのdef alignmentをWindow_TitleCommandにコピペします。
アライメントの設定は簡単で、0が右揃えで、1が中央、2が左です。今回は中央揃えなのでreturn 0の0を1に変えます。
するとちゃんと中央揃えになります。
ちなみにこれ、RPGツクールVX Ace付属の説明書にちゃんとやり方が書いてあります。だからといって受け売りを話してたわけじゃないですけど。受け売りを話してたわけじゃないですけど。
次に行間を広くします。こんな感じです。
まず、Window_Baseからline_heightというメソッドをWindow_TitleCommandに持ってきます。次に任意の高さに変えます。これだけです。
■ウィンドウを消して選択肢だけにする
これも説明書にやり方が書いてあるので、使用例だけ紹介するとこんな感じです。
ただ、デフォルトだと黒い影が薄いので、Window_Commandからdraw_itemをコピペしてきてこうすると影が濃くなります。
■選択肢を横に並べる
ちょうどこんな感じです。ではさっそく作っていきましょう。
変更点は3点。まとめるとこんな感じです。
・スーパークラスをWindow_CommandからWindow_HorzCommandに変える。
・新たにcol_maxというメソッドを設ける。
・window_widthをGraphics.widthに変える。
これだけでOKです。Window_HorzCommandのスーパークラスがWindow_Commandのため、Window_Commandのメソッドも使うことができます。
■オリジナルのコマンドをつけくわえる【上級者向け】
これ、コマンドを作るだけなら簡単ですが、その先の実行内容を作るのは上級者向けです。いろんなケースが想像できるので、全てを対応することはできませんのでコマンドの作り方だけを説明していきます。
まずWindow_TitleCommandクラスのメソッドmake_command_listに任意のコマンドを付け加えます。
次に、Scene_Titleのcreate_command_windowにも同じ任意のコマンドを加えます。どちらかが抜けているとうまく実行しません。
そして次に、set_handlerの中で作ったメソッドを作ります(この場合command_additionになります)。
起動するとこうなります。
ただ、今回の場合command_additionの中が空なので、このコマンドを押すとフリーズします。
ここから先どうするのかはあなた次第です。
さて、この記事で私は何回デフォルトという言葉を使ったでしょうか。あ、数えなくて結構です。