選択肢の表示 / ツクールVXAceスクリプト(RGSS3)wiki
ツクールVXAceで選択肢の表示をスクリプトで行うなら以下の通りです。
VXAceにおいてスクリプトで選択肢を表示するのは少し面倒です。
しかし、やり方が分かれば応用して選択肢の数を拡張することも出来ます。
ここでは8つの選択肢を表示するスクリプトを通してご紹介したいと思います。
まずはサンプルコードから見ていきます。
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の変数)によって条件分岐を作って表示する文章を作ります。
例
RGSSで選択肢拡張する方法
![選択肢の例](img/sentaku1.png)
実行結果は以下の通り。
1から8までの選択肢が表示される。
![選択肢の例](img/sentaku2.png)
「1」を選ぶと変数に対応した文章が表示されます。今回は「label1」
![選択肢の例](img/sentaku3.png)
「6」を選ぶと
![選択肢の例](img/sentaku4.png)
「label6」という文章が表示されます。
![選択肢の例](img/sentaku5.png)
コード解説
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にその値に-1された値が代入されます。
4行目 gm.choice_proc = Proc.new {|n| $branch = n }
選択肢の表示をスクリプトで行う上で難しいのがこのコードでしょう。
よくわからない場合は一先ず、ここでは"どの選択肢にしたかを記憶する準備をしている"と考えて、5行目まで読み飛ばしてください。
以下は何を行っているかという説明です。
"Proc.new {|n| $branch = n }"はブロックと呼ばれる処理の塊で、それをgm.choice_procという変数に入れることにより、Procオブジェクトとしています。
このブロックというのは基本的には要素の数だけ{}内の処理を繰り返すといもので、ここではどの選択肢にしたかという値を$branchに代入しています。
この$branchは選択肢1が選択されたら0を、選択肢2を選択されたら1を、選択肢2を選択されたら2を返します。
あとはこの$branchによってどのような処理をするのかを書くだけです。
Procとはなんなのか、ブロックとは何なのか興味のある方はこちらのサイトを参考にしてください。
5行目 Fiber.yield while gm.choice?
この行は選択肢が選択されるまで処理を待つための行です。
これがないと最後まで処理が流れてしまい選択肢に応じた処理ができなくなります。
Fiber.yieldというのは処理を一旦この行で止める処理と考えてください。
6行目以降 case文
こちらで$branchに代入された数値に応じて指定した変数を代入しています。
今回はcase文を使って場合分けして文章表示させるという方法を取りましたがもっとスマートな方法もあるかと思います。
スクリプトエディタ画面でなく、イベント画面で編集したいのでこのような形にしました。
選択肢を4つ以下にしたいときはサンプルコードの{}の中とcase文を減らすことで可能です。
ツクールVXAceスクリプトリファレンスwikiトップページへ戻る
オリジナルシステムなどの製作依頼・相談があればプラグイン・マップ等個別製作依頼のページまでお願いします。