久々に触ったNSCで失敗した点を、以降のページにて挙げてみる。どんなに緻密に組み上げたつもりのスクリプトであっても、例外はつきものです。
いきなり大掛かりなスクリプトを組んで、いざ実行させてみると2~3行進まぬ内に大体エラーが起きます。小さな処理をチマチマ確認しつつ、それを大きなスクリプトに組み込んでいくやり方が実は1番スムーズです。これは経験則です。
システム周り
●画面サイズう?
全然気にしていませんでしたが、時代と共に画面も変わっていくようです。800×600かなとか思ってたら、実はワイド画面を中心に売っていくようなので、恐らくはワイド版で作った方がいいかもしれません。
ノベルでどう対応すればいいのと思うかもしれないが、ここは頭の使いよう。広すぎるメッセージウィンドウはかえって、読みにくいだけなので、ならば常時表示メニューにすればいいじゃないという。
私はノベルぐらいしかしないので、今のサイズ(4:3)が気に入っているのですが、そうも言ってられないみたい。自分でサイズを決められる時はワイドで行こうと思う。1024×768とか一部から苦情が来るので、作らない方が無難。あと320×240とかは、すげー見づらいので個人的にやめてほしい。プチ種は絵が綺麗なのに、プレイしづらい状況……。
●初歩的だが致命的なコメントアウト
“:”と”;”の違い。吉里吉里とかもそうだが、;はコメントに使う。
更にTJSでは構文の最後に必ず挟むため、癖がついたときNSCでは確実に失敗の元となる。NSCだと連続命令を”:”で挿むため、間違えてソレをやってしまい、デバッガーにかなり怒られた。
●日本語ワカンナイヨ
ファイル名に日本語使っちゃ駄目です。全部、英数字にしましょう。アーカイブ化するとき、面倒くさいです。
englishでは全英文も可能ですが、ルビが正常に動作しません。
●セーブ番号、1!
意外と忘れがちなのが、セーブ番号は0番ではなく1番からということ。ほとんどの機能が0番から使えるため、やってしまいがちなミスです。
●ユーザー定義命令
ユーザー定義命令において、空の文字列パラメータを無視してはいけないことを知る。引数をvoidで渡すときは、””を使えばエラーなく処理できる。
なお引数を持ったユーザー関数はタブ/スペースがないと、そのまま次のNS命令を引数に読んでしまう可能性がある。ユーザー定義命令を使い、コメントを同じ行に書いた場合、高速スキップ中に誤って読み込まれて落ちることがある。コメントはなるべく違う行に書く。
スキップ時は飛ばしたい命令があった時、引数だけはちゃんと受け取ってリターンするといい。でないと引数がまんま返って来て、メッセージウィンドウに表示されたりする。
ちなみにエラーでdefine節に戻っているようであれば、それはユーザー定義命令の中でユーザー定義命令をまた呼んでしまったことを示している可能性が高い。_を頭につけた元の命令を使おう。
●エイリアス万歳
定数に名前を付けられるエイリアスを有効活用すると、かなりスクリプト組みやすくなる。ちなみに
mov %0,10
numalias abc,%0
inc %0
みたいにすると変数番号を特に管理せずとも、%abcという風に使えるのでイイ。サブルーチンとゲーム内容で使う変数は分けておいた方が無難。また変数番号の変更も簡単になるのでお勧め。
ちなみに数字エイリアスは、定義名さえ違うなら番号が被っても使うことはできる。
どんなによそで使わないと思ってても、後で修正できるようにファイル名にはエイリアスを使うこと。なおLuaを使う場合、stralias命令はNSExecの中以外では使えない。エイリアスの代わりにLuaの辞書配列を使えば代用可能。
●半角を無茶ぶりで使う
半角文字は命令と勘違いされるので、基本使用不可ですね。english で全英文も可能ですが、ルビが正常に動作しない。
無理やり使う例としては、半角文字を偶数の数で使っていくこと。そうすれば全角と同じことになります。……でも strsp では¥マークとの兼ね合わせが大変でした。
●スキップ速度設定
seteffectspeed はスキップ速度を設定できる。0は通常、1高速、2は最速
●WAITの重要性
WAITはほぼ使わないで、delayばっかり使っていたのですが、WAITやっと使いどころが分かりました。多分Forループの画像処理のときだ。
ウェイトがなさすぎるとCPUに負担がかかり、処理落ちどころか最悪落ちます。画面の書き換え頻度を調整することで、ヌルヌル動いたり、ガクガク動いたりするのでしょう。
スタッフロールはある意味、いい経験であった。
●texton命令も意外と大事。
シスカマでどこかに飛んで、ちゃんと戻って来てるのか。たまに分からなくなるので、textonはしておこう。
●NSGetClickのホイールの値(Lua)
何もしなければ0、上ならマイナス、下ならプラスされる。
●ラベル
シーンごとのラベル管理は必要。主にタイトル画面、おまけ画面とか。下手にLuaで関数作ってシーン管理やらせようもんなら後々面倒臭くなる。シーンごとに分けられるものはラベルで、ゲーム内のあちこちから呼び出す命令であればLuaでやった方がいいかも。
◆変数系###●グローバル変数
グローバル変数はglobalonを宣言すれば使える。通常は0~199までローカル変数、200~グローバル変数となる。00.txt文頭に「;value 500」をスペースを挿まずに記述することで境界を変更できる。0~4000間で変更可能。
●配列は面倒なんです。
配列変数なるものがあるが、これが相当使いづらい。命令がmov,movlしか使えない。計算できたら最高だけど。グローバル変数にも使えない。返り値にすら使用できないダメっぷり。
でも、こういう使い方はできた。
mov $1,"あいうえお"
mov ?0[1],1
mov %0,1
$?0[%0] ;$%0と同じ意味
“あいうえお”と表示されます。
代わりに%%0という使い方があるので、そちらを勧める。%0に入っている数字の変数にアクセスするもの。具体的に言うと%0=100,%%0は%100と同義ってこと。
●無限ループ
全く操作を受け付けない時に、ループをちゃんと抜けていない可能性がある。よく確認しよう。
●NSdoEvent
Luaを使う場合なのですが。ループ中にフリーズするようであれば、NSdoEvent()で真なら抜けるようにするといいかも。これを入れておくと動作が軽く感じたりするかも?
●Luaテーブルのコピー
table ={}
tmp =table
だとコピーではなく参照になってしまう。つまりtmpの中身をいじると元データまで変化してしまうということ。
そういう場合は、unpack関数が便利です。
t ={}
tmp ={unpack (t)}
ならば、テーブルの中身を展開し、別の変数に渡すことができるのです。便利。
●return大事!
これはNSでも吉里吉里でも言えることですが……NSならLuaでラベル移動とかしたくなるじゃないですか。
しかし落とし穴。確かにラベル位置は移動するんですが、スクリプト処理はLuaのまま実行されるのですね。
どういうことかと言うと、移動先に何かしら処理を書いておいたとする。しかしLuaがreturnされてない状態だと、NSGoto命令後にその後の処理を実行してしまう。移動先の処理は確か後回しにされた記憶があります。飛んだ後はreturnを忘れずに!
◆音系###●nsogg2.dllがあるとMIDIは再生しない
MIDI自体もしかしたら時代遅れなのかもしれないが、私はあのコンパクトさが大好きなのです。音質にこだわるときだけ、OGGを使うことにしてます。苦情があれば、全部MIDIやめますけどね。 Vista以降はMIDI全然ダメですが、TMIDI使えば、まだそれなりに聞けたりする。ボーカロイドだって一種のMIDIなんだし、いいじゃないMIDI。
◆スプライト系###●transmode alpha注意点
使用した場合、非透過PNGは「:c;」をパスに付ける必要がある。更にスプライトを使う際にはJPEGであっても同様に指定しなければならない。要するにスプライトに使う、不透明な画像は全部コピーオプションしとけです。
●NSSpClear全消しは無理
cspのように-1を指定しても消してくれない。ループして消そう。
●マスクは別画像が便利
ギャラリーで単独表示(背景)などに運用できるので、マスクは別画像に分けた方が便利。容量の節約もできる。
●画像を使わないスプライト
画像の代わりに塗り潰した四角形を作ることもできる。ちなみに連続で記述すると、横に等分割される。
:c;>幅,高さ,#色(#色...)
だが、変数を使いたい場合は:c;>%0,$0,#ffffff
という記述ではなく、
mov %0,0
itoa $0,%0
mov $1,100
mov $0,":c;>"+$0+","+$1+",#ffffff"
lsp 0,$0,x,y
print 1
などを使う。
更に文字も画像のように扱える。但しstrsp命令は、ちょっとしたスタッフロールですら簡単に停止するような代物なので、使い方に気をつける。
ちなみに柊はスタッフロールの最後らへんに画像を流そうとして停止した。正確には途中経過が飛ばされた。
●Luaでスプライトアニメ移動
Lua側でスプライトを移動させると、スプライトアニメは動かない。NSExecAnimationを挟めば動く。
◆メニュー系###●メニューバーの値
メニューバーを消していなければ、プレイヤーが使うこともあるだろう。ボタン待ちの間にそれらが使われた時、””が返る(文字列ならコレ。数字は知らない)。主にリセット判定やEND判定に使うといい。リセットがまともに動作しない時は大体ループを抜けていないことが多い。
◆動画系###●FLASH恨み節
動画なのですが……FLASHはプラグイン使ってても使用しない方が無難です。NSCがバージョンUPしたときとか、微妙に仕様が変わるときもあり、正直不安定です。 FLASHはブラウザでも今後非対応となるので非推奨。
MPEGやWMV、AVIを素直に使った方が不具合は起きにくいと思います。
◆外部系###●セーブデータを指定のフォルダに置かせる
savedir “セーブフォルダ名”命令は、自分でフォルダを作らないといけないので、配布する際はフォルダ込みで配布すること。
INI命令は絶対パス
getini命令はカレントディレクトリを読まず、絶対パス指定でなければ読み込まない。先祖川氏のファイル操作DLLなどカレントパスを取得できれば、ゲームフォルダ内のINIでも指定可能。
◆アーカイブ関連###●NS2にまだ時代が追いついてない。
まだ十分じゃないだけだよねっ。期待してるんだけど、今のままではほとんど使い物になりません。まだ使うべきでない。旧ツールの中にある nsaarc.exe を使いましょう。
●nscmaker2
EOFの後ろからキッチリ次のテキストファイルを読むため、ラベルなどが1行目から入ってると目も当てられない。スクリプトの最後は改行を忘れずに。合体時に酷い目に遭う。
それからパッチを作る時の番号とは行番号などではなく、単純に00.txt、20txtなどのことを指す。20と指定すれば、20、21.npなどのアップデートパッチが作られる。