RGSSで選択肢拡張するスクリプト
作品を作っていて5つ以上の選択肢を作りたい場面があったのでどうしたらできるのか調べていたら半日が終わった。
という訳で汗と涙の選択肢拡張スクリプト解説。
以下はイベントスクリプトでの入力を想定しています。
もちろんスクリプトエディタでも可能です。
サンプルコード
$gm = $game_message
$gm.choices.push("1","2","3","4","5","6","7","8")
$gm.choice_cancel_type = 9
$gm.choice_proc = Proc.new {|n| $branch = n }
Fiber.yield while $gm.choice?
case $branch
when 0 then $game_variables[61] = 1
when 1 then $game_variables[61] = 2
when 2 then $game_variables[61] = 3
when 3 then $game_variables[61] = 4
when 4 then $game_variables[61] = 5
when 5 then $game_variables[61] = 6
when 6 then $game_variables[61] = 7
when 7 then $game_variables[61] = 8
when 8 then $game_variables[61] = 9
end
これで後は変数(今回はIDが61の変数)によって条件分岐を作って表示する文章を作ります。
例
実行結果は以下の通り。
1から8までの選択肢が表示される。
「1」を選ぶと変数に対応した文章が表示されます。今回は「label1」
「6」を選ぶと
「label6」という文章が表示されます。
スクリプト解説
1行目 $gm = $game_message
選択肢を表示させるには「$game_message」というメソッドを使います。
イベントスクリプトに入れるには省スペースをしなければならないため、$gmというグローバル変数に$game_messageを代入しています。
2行目 $gm.choices.push("1","2","3","4","5","6","7","8")
これはつまり「$game_message.choices.push」と書かれているわけですが、()内にはそれぞれの選択肢に表示したい文字を「,」で分けて書いています。
この「$game_message.choices.push("1","2","3","4","5","6","7","8")」はこのように書くこともできます。
$game_message.choices.push("1")
$game_message.choices.push("2")
$game_message.choices.push("3")
$game_message.choices.push("4")
$game_message.choices.push("5")
$game_message.choices.push("6")
$game_message.choices.push("7")
$game_message.choices.push("8")
こうして描くとただコードが冗長になったように感じますが、「$game_message.choices」を$gmcというグローバル変数に代入した場合
$gmc = $game_message.choices
$gmc.push("1")
$gmc.push("2")
$gmc.push("3")
$gmc.push("4")
$gmc.push("5")
$gmc.push("6")
$gmc.push("7")
$gmc.push("8")
と縦にすっきりした形で書くことができます。
この縦書き選択肢の使った方が良い場合というは選択肢の中身が長くなる場合でしょう。
例えば
選択肢
勇者よ!魔王を倒せ!と叫ぶ
勇者よ!ほどほどに頑張れ!と声をかける
勇者よ!気楽にな。と肩を叩く
勇者よ!無理はするな!と引き止める
勇者よ!お前じゃ無理だ!と叫ぶ
という選択肢を作りたい場合、横に長くすると
$gmc = $game_message.choices
$gmc.push("選択肢","勇者よ!魔王を倒せ!と叫ぶ","勇者よ!ほどほどに頑張れ!と声をかける","勇者よ!気楽にな。と肩を叩く","勇者よ!無理はするな!と引き止める","勇者よ!お前じゃ無理だ!と叫ぶ")
となり、これをイベントスクリプトに入れるとツクールの方で強制改行され、エラーが出る原因になります。
これを縦に書くと
$gmc = $game_message.choices
$gmc.push("選択肢")
$gmc.push("勇者よ!魔王を倒せ!と叫ぶ")
$gmc.push("勇者よ!ほどほどに頑張れ!と声をかける")
$gmc.push("勇者よ!気楽にな。と肩を叩く")
$gmc.push("勇者よ!無理はするな!と引き止める")
$gmc.push(勇者よ!お前じゃ無理だ!と叫ぶ"")
となり、横幅に何とか間に合い、直観的にも分かりやすいコードの形になります。
それぞれの場面でやり易いやり方を選択してください。
3行目 $gm.choice_cancel_type = 9
これは選択肢が表示された時にキャンセルボタンが押された時の挙動を決めているコードです。
choice_cancel_typeプロパティの値で、以下のように挙動が決まります。
choice_cancel_type = 0 でキャンセルボタン無効に。
choice_cancel_type = 1 でキャンセルボタンが押された時に選択肢1を選択
choice_cancel_type = 2 でキャンセルボタンが押された時に選択肢2を選択
choice_cancel_type = 3 でキャンセルボタンが押された時に選択肢3を選択
・
・
・
といった感じです。
選択肢がない場合にも値は返され、次のコードのnにその値が代入されます。
4行目 $gm.choice_proc = Proc.new {|n| $branch = n }
この行に苦しめられた。
選択肢表示をスクリプトでする上で難しいのがこのコードでしょう。
色々と気になるところはあると思いますが、この行で見てもらいたいのは右辺{}内の「$branch = n」というところ。
nは選択された選択肢の数値を返します。
選択肢1が選択されたら0を、選択肢2を選択されたら1を、選択肢2を選択されたら2を返すという具合。
このnの数値を$branchというグローバル変数に代入しているのです。
あとはこの$branchの数値によってどのような処理をするのかを書くだけ。
「Proc」が何なのかとか「choice_proc」がどういうプロパティなのかということはうまく説明できる自信がないので割愛させていただきます。
5行目 Fiber.yield while $gm.choice?
この行は選択肢を選択されるまで処理を待つための行です。
これがないと最後まで処理が流れてしまい選択肢に応じた処理ができなくなります。
Fiberがなんなのかとかyieldが何なのかとかはツクールのヘルプか他のサイトを参考にしてください。ここでは説明を割愛させていただきます。
6行目以降 case文
こちらで$branchに代入された数値に応じて指定した変数を代入しています。
5つ以上の選択肢を表示するのは$game_message.choices.push()を使えばすぐに表示はできるので簡単なのですが、選択された後の処理をどうするか決めるのが大変という感じですね。
また今回はcase文を使って場合分けして文章表示させるという方法を取りましたがもっとスマートな方法はあるかと思います。
今回はスクリプトエディタ画面でなく、イベント画面で編集したいのでこのような形にしました。
ラベルでジャンプして文章表示なんていう方法もしようと思いましたがスクリプトでラベルジャンプの仕方が分からなかったので諦めました。
選択を増やすだけなので簡単だろうと思いきや結構大変な思いをさせられました。
余談ですが前の記事に「|n|って絶対値みたいで違和感がする」なんて書きましたがブロックパラメータという呼ばれるものなんですね。感覚的には変数の宣言みたいな感じがします。
あぁ、恥ずかしや…
RGSSリファレンスwiki目次へ
◯参考ページ
rgss3 リファレンスwiki $game_message.choices.push()
rgss3 リファレンスwiki $game_message.choice_proc
http://bbs.66rpg.com/plugin.php?id=dsu_xm_codehighlight:main&pid=2050691&action=print&codeid=0
ふりーむ様にてRGSS3のリファレンスが公開されました。
RGSSを使ってみたい、RGSSを勉強したいという方は参考になさってください。
RGSS3リファレンス イベントコマンド版

にほんブログ村