フワフワソが「ソラとピヨちゃん」や「宮本県」を作るブログ(フワフワソ・ラウンジnew!)

ラノベとテクノを愛するふわふわがノベルゲームを作っています。あと日常のことやイベントの告知なども。スクリプト関連の記事は自分用の備忘録です

buttonをfix=trueで使いたかったら[call]ではなく[jump]を使う

f:id:fuwafuwaso:20181016210103p:plain

buttonはfix=trueにすることで常駐ボタンとしていつも表示させておくことができます。

シナリオは分岐などで*ラベルを行ったり来たりする構造になると思いますが、メインのシナリオ(*main)からサブのシナリオ(*sub)に行ったとき、そこで「新たに」常駐ボタンを表示させるには注意点があります。

サブのシナリオ(*sub)に移動するときには、[call]ではなく[jump]でやらなくてはいけません。

[call]でサブのシナリオ(*sub)に飛んで、そこで新たに常駐ボタンの定義[button fix=true]をすると、ボタンが働かなくなります。

これは[button]の仕様で「コール先からリターンするまで全てのボタンは有効にならない」というのが影響してると思われます。

[button]

注意→fixにtrueを指定した場合はコールスタックに残ります。コール先からリターンするまで全てのボタンは有効にならないのでご注意ください

つまり、サブのシナリオ(*sub)を呼び出した時[call]のコールスタックが残っているので、[return]するまではボタンが働かないということですね。

単なるcallだけならcall先でまたcallみたいな、コールスタックを多重にすることも大丈夫ですが、buttonの場合はコールスタックを多重に働かせることはできないように思われます。

おかしな感じもしますが、自分のスクリプトではこうなってしまいますので自分用の注意です。

 

まとめ

*mainで[button fix=true]を定義して、[call]で*subに飛んでも、ボタンは正常に働きます。

*mainで[button fix=true]を定義して、[call]で*subに飛んで、*subで新たに[button fix=true]を定義すると働かなくなります。

これを回避するには、

*mainで[button fix=true]を定義して、[jump]で*subに飛んで、*subで新たに[button fix=true]を定義する、という手順になります。