Studencheskie Programmisty

Page 1 of 1: 1

NScripterでロード時にエフェクトつけたりする方法

Sep 15, 2010

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の中でうまくセーブポイントを作ることができず、失敗する。

また、lspvspを使ってロード画面の表示をコントロールすると画面の再描画が起こり、画面がちらついてしまうため、再描画を起こさないamspを使って画面外へと移動させることで非表示にしている。

これでロード中に任意の画像を表示できるようになったので、あとは*onloadのなかで%nowloading_bgを好きなようにいじくり回せば完成。

    NScripterのloadgameではまった

    May 27, 2010

    ONScripterでは全く問題なかったのだが、NScripterでセーブ/ロードを繰り返すと、表示がおかしくなるというバグに遭遇した(画像1,画像2)。発生条件がランダムで、どう直したらいいのやらと試行錯誤していたら、どうやらセーブ時に変な状態でセーブされるせいで、ロードした時におかしくなるらしいということが分かった(何でこんな簡単なことが思いつかなかったのだろう・・・)。

    というわけで、define節にautosaveoffを追加したらすんなり直った。高速化のためということでsaveon/saveoffを繰り返してたらどこかでおかしくなっていたらしい。当たり前といえば当たり前だけれども、セーブ/ロード関連でバグが発生している時は、saveon/offがおかしいのが原因ということがしばしばあるので(これで引っかかった回数は数知れず)、その度に銘じ直してるはずなのだがそのことを改めて認識させられた昨日4時間でだった。