カテゴリ:NSLua( 27 )
Luaのテーブル周りメモ
・関数の戻り値でテーブルを初期化する場合
function f ()
return "x","y","z"
end
 という関数fがあるとする。
t = {f()} は t = {"x","y","z"} と同じ
t = {"a","b",f()} は t = {"a","b","x","y","z"} と同じ
t = {"a","b",f(),"c"} は t = {"a","b","x","c"} と同じ
 {}の最後に関数のときだけ、戻り値が全部格納されるらしい。
 また、戻り値の展開を回避したい時はt = {(f())}と、関数をカッコでくくるといい。

・テーブルの各要素を巡回
 これにはいくつか方法がある。
1.for&pairs()
●書き方
for k,v in pairs(t) do
end
●概要
 一般的な書き方。巡回する順番は不定である。

2.for&ipairs()
●書き方
for i,v in ipairs(t) do
end
●概要
 t[1]から、最初にnilが返ってくるまでの間、ループを繰り返す。
 テーブルを配列のように扱っている時はこの方法を使う。

3.while&next()
●書き方
k,v = next(t)
while(k)
--処理
k,v = next(t,k)
end
●概要
 たぶん1.と変わらない。

4.for&#
●書き方
for i = 1,#t do
end
●概要
 ipairs()を使用した場合、途中の要素がnilだと(例:t = {1, nil, 3})、テーブルの終端に到達する前に処理が終了してしまう。要素にnilが含まれている場合でも終端まで処理したい場合はipairs()ではなくこちらの方法を使う。

・table.concat()
t = {"1","2","3"}
 というテーブルを、
1,2,3
 といったcsvみたいな文字列にしたい場合は、table.concat(t, ",")で事足りる。
(注意事項)
 連結されるのはキーが数値の要素だけで、キーが文字列の要素は含まれない(例:t["x"]など)。
 また、キーが数値の場合でも、キーの間が飛んでいる場合は、連続している部分のみ連結する。(例:t[2]の次がt[4]である場合、t[1]とt[2]の要素だけを連結する)
[PR]
by lyricist_m | 2009-04-27 08:21 | NSLua
ボタン拡張
 NScripter&Luaのサンプル、ボタン拡張スクリプトをアップしました。Delusionist's Utopia -NScripter-からDLできます。

 bexecなどの新ボタン系命令では、スプライトボタンをカーソルで選択して決定する、ということができません。bexecがカーソルの入力も捉えてしまうからです。これはちと不便だなと思ったので、カーソルで選択できるようにしてみました。
 まずはbspとbclearを上書き。bspでスプライト番号をLuaでテーブルに保存、bclearでテーブルを初期化します。次にspfocusnext、spfocusprev、spexecの3命令を追加。spfocusnextで次の、spfocusprevで前のスプライトにフォーカスを移すことができます。スプライトにフォーカスを移した状態でspexec命令が実行されると、選択されたスプライトの番号を得ることができます。使い方としては下のような感じ。
*loop
bexec $0,%0
if $0 == "UP" spfocusprev:goto *loop
if $0 == "DOWN" spfocusnext:goto *loop
if $0 == "RETURN" spexec %0
if %0 != -1 ;ここにスプライトが押された場合の処理を書く
goto *loop


 そこそこ使い勝手はいいと思うのですが、このスクリプトはまだ問題を残しています。
 たとえば「スプライトにフォーカスを移した状態でspexec命令が実行されると」と書きましたが、単にスプライトにマウスカーソルが重なっている状態でspexec命令が実行されてもスプライトの値は返ってきません。これはspexec命令が値を返す条件が「命令が実行された際にスプライトの左上座標とマウスの現在位置が重なっているか」というものだからです。
 スプライトの幅・高さからマウスカーソルがスプライト上に存在するかを判断してもいいのですが、もし新ボタン命令が透過ボタンに対応したらbexecとspexecで動作が食い違う可能性が出てきますし、そもそもマウスを動かせるのにクリックじゃなくてキーボードでボタンを選択するのも変な話です(ノートPCならありうるのかもしれませんが。タッチパッドの左ボタンよりキーボードの方が押しやすいとか)。
 なのでとりあえずは現状維持で行こうかなと。

 他にボタン命令を使いやすくできるアイデアが思いついたら、このボタン拡張スクリプトに盛り込むことにします。
 さて、次はテーブル周りとファイルの入出力でもやろうかな。



[追記]
 よく考えたら、透過ボタンの場合はスプライトの左上座標にカーソルを持っていってもボタンに重なるとは限らないんですよね。それなのにspexecで値が返ってきて押下処理されちゃうと、「カーソルが重なった状態」を飛び越して一気に「ボタンが押された状態」に行ってしまうことに……。うん、困った。
 旧ボタン命令でtransbtnを使用した場合、カーソルでスプライトを選択すると「透過されていない一番左上の部分」にカーソルが移動するようです。これと同様の処理を新ボタン命令でやるには、スプライトから1ピクセル抜き出して色・透過情報を調べられる命令を作ってもらうか、スプライトに対する当たり判定命令を作ってもらうかしないと、透過ボタンに対応するのは難しそうです。

[2009年5月11日追記]
 最新版でbexec命令が更新され、カーソルキーでの選択がデフォルトで可能になりました。btrans命令が追加されて透過ボタンにも対応。また、フルカスタマイズ用にスプライト系の命令がいくつか追加されるとのことです。
 ということでカーソルキー関連は、今後はそちらで対応することにしましょう。
[PR]
by lyricist_m | 2009-04-26 18:12 | NSLua
新ボタン命令について
 2009年4月26日時点での話。

・bexecの引数の受け取り方は下の通り。
bexec $0
bexec %0
bexec $0,%0
bexec %0,$0
 ただし、bexec %0,$0の場合はどうも動作がおかしい(クリックしても反応しないことがある)ので、使わないほうがいい。更新.txtに書いてある通りbexec $0,%0を使うべき。
・transbtnは機能しない。つまり透過部分を無視したボタンは作成できない。
・isdownは使えない。checkkeyでもマウスの押しっぱなしは検知できない。
・マウスをNScripter上の何もないところからドラッグ開始→ボタンの上で離す→ボタンが押されたことになる
[PR]
by lyricist_m | 2009-04-26 17:19 | NSLua
Luaで剰余の結果を調べてみた
10 % 3 = 1
10 % -3 = -2
-10 % 3 = 2
-10 % -3 = -1

 剰余演算子の振る舞い - codemagicを見るに、PerlやPythonと同様のようで。
[PR]
by lyricist_m | 2009-04-25 19:29 | NSLua
NScripter×Luaでevalとその使い道
 NScripterでeval - 永字八法を見て「使い道ならあるよ! あるよ!(AA略」と思ったので、NScripter×Luaでevalを作ってみました。スクリプトはDelusionist's Utopia -NScripter-から落としちゃってください。

 単純に、NSExec()に文字列を渡すだけのラッパーを書いてもいいのですが、それだと不便です。NSExec()だと:(コンマ)を使えないんですよね。つまり、命令を1個ずつ書かないといけない。なので、それを解決するために二つの方法をとりました。
 一つ、Luaで受け取った文字列をコンマで分割する。こうすることで普通に命令を書くのとほぼ同等の動作をしてくれます。これがluasub evalの方ですね。ただし、文字列中にコンマを含んでいたり(例:caption "aiueo:kakikukeko")、lsp ":s#FFFFFF~"ってやろうとすると、途中のコンマで分割されてしまうので誤動作します。
 もう一つ、受け取る文字列の数を可変にする。これがluasub eval2です。
 両命令共通の注意点なんですが。evalの引数内で文字列を表現する場合、""(ダブルクォーテーション)ではなく''(シングルクォーテーション)を使用します(例:eval "caption 'aiueo'")。なので、文字列中でシングルクォーテーションを使用すると誤動作します(例:eval "caption 'I'm home!'なんて使い方はNG")。

 で、使い道ですが。一番使えるのはデバッグ用途じゃないでしょうか。
 例えば、クリック待ちからinputstrで命令入力→evalに渡す、って使い方。NScripterを終了させることなく変数を操作できるので、そこそこ便利そう。吉里吉里でいう、デバッグコンソール下部のアレみたいな感じですね。
 あと、00~99.txt以外のテキストファイルに命令を書いていても実行できるわけで。csvreadかreadfileで読み込んでやればいいわけですから。必然的にファイル数が多くなりそうな探索型ADVとかで使えるんじゃないでしょうか。


 次は、Luaでスプライトの位置情報を取得できるようになったのでそこらへんを弄るか、Lua側からIO周りって弄れるのかなーって辺りを探ってみようかなと思います。
[PR]
by lyricist_m | 2009-04-24 22:52 | NSLua
Luaで引数の自由度が上がった
 luasubを使うと、自作命令の引数の自由度がかなり高くなるみたいですね。まだ少ししか試してませんが、やってて面白かったのを。

1.Lua側でx,y = NSPopInt(),NSPopInt()のように書く。命令名はtestということにしよう
2.NScripter側でtest 1 2と書く(引数の間はコンマではなく半角空白)
3.ちゃんと値の受け渡しができる
 これ、文字列でも同様に可能です。文字列の場合は間に半角空白を入れる必要はありません。入れてもOKですが。
 この書き方の利点は「引数の受け渡しが1行で記述できる」ことに尽きる気がします。引数の数が多くなる場合はLua側が楽になるでしょうけど、NScripter側が見づらくなるかも。
[PR]
by lyricist_m | 2009-04-20 17:46 | NSLua
Lua用エディタ
[2009年4月19日更新]

 本家のNScripterサポートBBSにLua実験版がアップされてます。
 どうやら色んなことが出来るようになるみたいで、ワクワクしながら待ってるわけですが。
 Luaを使ったスクリプトは正式版が出てから書いても遅くないかなと思ったので、その前にまずLuaに対応したエディタを探してみました。

SciTE(強調、入力補完) 参考:空想具現化プログラミング [Lua] SciTE 1.66:プログラミング用エディタ
秀丸エディタ(強調、別途定義ファイルのDLが必要)
Peggy(Peggy Pad)(強調、別途定義ファイルのDLが必要)
EmEditor(強調、別途定義ファイルのDLが必要)
サクラエディタ(強調、入力補完。定義ファイルはNScripter Scripting FactoryのToolからDLできます)

 ざっと探してみて見つかったのはこんなところ。
 SciTEは入力補完もしてくれるので良さそうですね。ツール自体は英語ですが、単にエディタで日本語を表示するだけなら設定を変えれば可能です。また、日本語版も非公式ながらありますから、英語が苦手な人はそちらを使ってみてもいいのでは。

 次はLuaの言語仕様を勉強するかな。


[追記1]
 senzogawaさんがサクラエディタ用の設定ファイルを作成されていたので、サクラエディタを追加。まだHPの方は更新されていないようなので、日記の方にリンクを張っておきました。

[追記2]
 senzogawaさんがHPを更新されたので、リンク張り替え。
[PR]
by lyricist_m | 2009-04-08 10:41 | NSLua