カテゴリ:NSLua( 27 )
コロンの使い方
 関数定義と関数呼び出しの際にコロンが使えます。コロンを使うと暗黙の引数selfが使えるようになり、かなり便利になります。
 詳しくはリファレンス等を見てもらうとして、今回は自分がはまったことをひとつ。

 関数定義において、
function test:func(...) ... end
 は
function test.func(self, ...) ... end
 とほぼ同じですが、
test:func = function(...) ... end
 という書き方はできません。「function arguments expected near '='」なるエラーが出ます。
 functionを後置したいのであれば、暗黙の引数selfを略さずに書いて
test.func = function(self, ...) ... end
 とする必要があります。

 マニュアルをよく読めばすぐ解る話なのですが、小一時間ほど悩んでしまいました。
[PR]
by lyricist_m | 2009-05-06 01:17 | NSLua
スクリプト解読中
 すいはんさんのすいはんBlog 〔NScripter+Lua〕〔弾幕?STG〕についてから「弾幕?STGサンプル」を落としてスクリプト解読中。いやー、久しぶりに他人の書いたスクリプトをガッツリ読んでる気がします。
 うちのノートPCじゃ多少FPSが落ちますが(それでも平均20ちょいってとこ)、普通にプレイできることに驚きました。凄いなぁ。
 どうも自分はこういうゲームらしいゲームを作る方向に食指が動かないのですが、こういうの見てると作りたくなってくるなぁ。数年前、CとWindowsのAPIを触ってた頃に作ったどうしようもないゲームでも移殖してみようかな。
[PR]
by lyricist_m | 2009-05-03 18:23 | NSLua
system.luaを読み込むタイミング
 system.luaはgame命令終了後に読み込まれます。つまり、
1.*define
2.game
3.system.lua
4.*start
 の順番に読んで行く、と。
 このうち、1~3までは定義節、4からは実行節になります。なのでsystem.lua中ではdefsubやluasubなどの定義節専用命令が使用できます。

 system.luaを読むのがgame命令実行後のため、たとえばLua側に値を渡す目的で、定義節でローカル変数を使用しても、game命令でローカル変数がクリアされてしまいます。
 なので「定義節内からLuaへ値を渡す」場合はグローバル変数を使用しましょう。実行節からならluasubが使えるので、普通にそっちで。
[PR]
by lyricist_m | 2009-05-03 09:21 | NSLua
numalias&Luaについて考えてみる
 どうにかして、Luaでaliasを便利にできないものでしょうか。
 例えば実際のエイリアスの定義を別ファイル(例えばalias.txtとか)に分けて、それをLuaから読み込むのであれば楽に出来るんですが。
 理想としてはvaralias 変数名って感じで変数番号を意識せずに変数名をつけられる自作命令を作れて、普通に定義節で使えるのが一番かなと思います。だけどsystem.luaが読み込まれる順番はgame命令通過後なんですよね……。

 仕組み自体は、単にinc %0してたのを関数内部に引っ張ってくるだけにすれば楽に実装できるので、問題はどこでその関数を実行するか、ですね。
 とりあえず変数定義別ファイル化の方向で動いてみるかなぁ。
[PR]
by lyricist_m | 2009-05-01 09:04 | NSLua
テーブル周り
 Luaでテーブルを弄るサンプルスクリプトをアップしました。Delusionist's Utopia -NScripter-からDLできます。
 サンプルスクリプトと言ってもtable.luaが一つ入ってるだけなので、そのままでは動作しません。余裕があれば後でsystem.luaと00.txtを追加しておきます。

 テーブルを1つの文字列に圧縮したり、逆に文字列からテーブルに展開したり。またはテーブルをCSVとして保存したり、CSVからテーブルに復元したりできます。これらの命令とコールバックのセーブやロードと組み合わせれば、テーブルのセーブ・ロードも簡単にできるかと思います。
 また、テーブルを配列(array)や連想配列(hash)と見なして上記の動作を行なう関数も入っています。このスクリプトを読めば、Luaにおける配列の扱い方、テーブルとforループの連係、文字列の連結、ファイルの読み書きの仕方なんかが少しは理解しやすくなるんじゃないでしょうか。コメントは全く書いていないので、おそらく読むのが大変でしょうけども、テーブル・配列・連想配列間で処理の内容に大差はないので、見た目ほど量は多くないかと。



 次はどうしましょうか。
 とりあえずストックとして、NSCALL_animationを利用したマウスカーソル移動スクリプトとか表示文スプライト化(製作途中)とかあるんですが、個人的にはnumaliasをどうにかしてLuaで使いやすくしたいところです。
[PR]
by lyricist_m | 2009-05-01 08:55 | NSLua
Luaスクリプトを新規作成するバッチファイル
@echo off
rem Luaスクリプトを新規作成します
set /p FILENAME="ファイル名を入力してください>"
echo --%FILENAME%.lua> %FILENAME%.lua


 上のように書いたバッチファイルを作ると、ファイル名を入力するだけで「ファイル名.lua」というファイルを作成してくれます。
 ちなみに、Luaスクリプトのファイルの一行目に書いた内容がエラーメッセージに出力されるそうです。なのでこのバッチファイルではファイルの一行目にファイル名を書いています。



 バッチファイルは便利ですねぇ。
 複数行に渡ってテキストを書けたら、*defineとgameと*startだけを書いた00.txtを作るバッチファイルでも作るところなんですが、そっちはむしろエクスプローラの新規作成を弄った方がいいかな。
[PR]
by lyricist_m | 2009-04-30 16:33 | NSLua
引数の個数チェック
 luasub用の関数の最後で
if NSCheckComma() then
NSOkBox("引数が多すぎます","関数名")
end

 って書けば、引数の個数チェックが出来ます。

 今までは、引数が少ない場合ならエラーが出ていましたが、引数が多い場合は余計な引数を表示文として解釈していました。
 そのため、前者よりもバグの検出がしづらかったのですが、Luaのお陰で検出が可能になりましたね。いいことです。
[PR]
by lyricist_m | 2009-04-29 20:28 | NSLua
変数の衝突を回避する
・ファイルを越えて変数を利用する場合
 localをつけずに使用する。関数の内外を問わない。

・ファイル内だけで利用したい場合
 localをつけ、関数外で宣言する。

・関数内だけで利用したい場合
 localをつけ、関数内で宣言する。



 こんな感じでしょうか。
[PR]
by lyricist_m | 2009-04-28 14:44 | NSLua
NSExec()の重複
 NSExec()でluasubの命令を呼び出し、その中でまたNSExec()を使用すると、NScripter側のスクリプトの現在位置がリセットされ、00.txtの冒頭から読み直すみたいです。
 呼び出された命令中でNSGoto()をすることで読み直し始める箇所を指定することはできますが、そもそも「NSExec()の重複」は禁止されている使い方なので、やめたほうがいいでしょう。
「何でか解らないけど00.txtに飛ばされるなー」という場合は、どこかでNSExec()が重複していないか、一度チェックしてみることをおすすめします。
[PR]
by lyricist_m | 2009-04-27 22:53 | NSLua
luasubをLua側から呼び出す
 Luaのスクリプト中に
NSExec("luasub test")
 のように記述すれば、NScripter側でluasubを記述しなくても済む。
 つまり、luasubを含むライブラリを作成しておき、system.luaからライブラリをNL_dofileで読み込めば、自動で命令が追加されるわけですね。わー便利。

 余談ですが。
 luasubした命令は、定義節中では呼び出せません。
 Luaスクリプトが読み込まれていないため、「そんな命令は存在しない」とエラーが出てしまいます。
「IDが取得できるなら、numaliasをカスタマイズできるんじゃね?」と思ったのですが、上記の理由で無理でした。残念。



[追記]
 luasubした命令は、定義節中では呼び出せません。
 が、system.luaで何もないところに
NSExec("luasub test")
NSExec("test")

 と書くと、luasubした命令を呼び出せます。あまり意味はありませんが。
 また、luasubと同様にnumalias・straliasも使えます。
[PR]
by lyricist_m | 2009-04-27 12:09 | NSLua