NScripterでロード時にエフェクトつけたりする方法
NScripterで、ロード時に何かをやる方法といったらloadgosub
命令だと思う。でも、ロード中に「Now Loading...」みたいなのを出したかったり、ロードし終わった時にエフェクトをつけて画面を表示したいということになると、loadgosub
命令だけではうまくいかない。
NScripterはセーブデータをロードする時、完全に読み込み終わるまでの間NScripter側で保存しておいたセーブ時の画面を暫定的に表示する。つまり、セーブポイントが作成された時の画面が、「Now Loading...」となっている画面だったり真っ暗な画面だったりすればよい。
ここで問題なのは、どうやって(ユーザーに画面を見せることなく)その画面の状態でセーブポイントを作成するかである。以下、シスカマ済で、
pretextgosub *pretext_lb loadgosub *onload autosaveoff
さて、まず一番最初に思いつくのは、セーブするサブルーチンで画像を表示し、savepoint
するという方法である。
*show_save_display lsp 0,%nowloading_bg,0,0 ;※ savepoint csp 0 ;残りの処理
しかし、実はこれではロードした時に※の部分でロードされてしまい、うまくいかない。じゃあどうやるのかというと、*pretext_lbの中でやる。
*pretext_lb amsp %nowloading_bg,0,0 savepoint ;◆ amsp %nowloading_bg,1000,0 ;残りの処理
こうすることで、NScripterによる表示文頭の自動savepoint → ◆でのsavepoint → 自動saveoffとなり、うまくロード画面が表示された状態ををセーブポイントにすることができる。実は、この*pretext_lbの中でのsavepoint
をやるためにautosaveoff
していて、autosaveoff
していないと*pretext_lbの中でうまくセーブポイントを作ることができず、失敗する。
また、lsp
やvsp
を使ってロード画面の表示をコントロールすると画面の再描画が起こり、画面がちらついてしまうため、再描画を起こさないamsp
を使って画面外へと移動させることで非表示にしている。
これでロード中に任意の画像を表示できるようになったので、あとは*onloadのなかで%nowloading_bgを好きなようにいじくり回せば完成。
Tagged as: development, nscripter
NScripterのloadgameではまった
ONScripterでは全く問題なかったのだが、NScripterでセーブ/ロードを繰り返すと、表示がおかしくなるというバグに遭遇した(画像1,画像2)。発生条件がランダムで、どう直したらいいのやらと試行錯誤していたら、どうやらセーブ時に変な状態でセーブされるせいで、ロードした時におかしくなるらしいということが分かった(何でこんな簡単なことが思いつかなかったのだろう・・・)。
というわけで、define節にautosaveoffを追加したらすんなり直った。高速化のためということでsaveon/saveoffを繰り返してたらどこかでおかしくなっていたらしい。当たり前といえば当たり前だけれども、セーブ/ロード関連でバグが発生している時は、saveon/offがおかしいのが原因ということがしばしばあるので(これで引っかかった回数は数知れず)、その度に銘じ直してるはずなのだがそのことを改めて認識させられた昨日4時間でだった。
Tagged as: development, nscripter