LuaでSL(luacurses)
2008/08/16
LuaForgeを覗いていたら、luacursesというライブラリを発見しました。
luacursesで、ちょっと遊んでみました。cursesと言えば例のあれです。
インストール
$ wget http://luaforge.net/frs/download.php/1073/curses.tar.gz $ tar zxf curses.tar.gz $ cd curses $ make $ su # cp lib/luacurses.so /usr/local/lib/lua/5.1/
コピー先は、これでいいのか不安。
SL
車輪も動かないし、煙も無い手抜きバージョンです。
ドキュメントも無いようなので、luacursesに付いてたテストコードを読みながら、なんとか書けました。
sl
#!/usr/local/bin/lua local SL = { " ==== ________ ___________ ", " _D _| |_______/ \\__I_I_____===__|_________| ", " |(_)--- | H\\________/ | | =|___ ___| _________________ ", " / | | H | | | | ||_| |_|| _| \\_____A ", " | | | H |__--------------------| [___] | =| | ", " | ________|___H__/__|_____/[][]~\\_______| | -| | ", " |/ | |-----------I_____I [][] [] D |=======|__ __|________________________|_ ", "__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__ |__________________________|_ ", " |/-=|___|= || || || |_____/~\\___/ |_D__D__D_| |_D__D__D_| ", " \\_/ \\O=====O=====O=====O_/ \\_/ \\_/ \\_/ \\_/ \\_/ ", } mklualib_open_curses = package.loadlib("/usr/local/lib/lua/5.1/luacurses.so", "mklualib_open_curses") assert(mklualib_open_curses, "can't load curses library") mklualib_open_curses() require("curses") function map(f, list) local result = {} for _, v in pairs(list) do table.insert(result, f(v)) end return result end function run() local cols, lines = curses.COLS(), curses.LINES() for i = 1, cols + string.len(SL[1]) do local sl = '' if i < cols then sl = map(function(x) return string.sub(string.rep(' ', cols - i) .. x, 0, cols - 2) end, SL) else sl = map(function(x) return string.sub(x, i - cols + 1) end, SL) end win = curses.newwin(#SL + 1, cols, (lines - #SL + 1) / 2, 0) for i, v in pairs(sl) do win:mvaddstr(i, 1, v) end win:refresh() os.execute('sleep 0.001') win:delwin() end end curses.initscr() curses.cbreak() run() curses.endwin() -- vim: set ft=lua ts=4 sw=4 sts=4 expandtab :
嵌ったところなど
- luacursesのテストコードでは、require だけで読み込めているようだったけど、自分で書いたスクリプトでは、loadlibしないと読み込めなかった。インストール場所が違ったのか?
- Luaには、sleep関数が無い? これにはちょっとびっくりした。ゲーム用スクリプトとしては、sleepする必要ない(時間制御は、C側の仕事だからかな?)かもしれないけど。。。外部コマンド呼びだしているという荒技で回避。
- 途中でエラーが発生すると、endwinが呼ばれなくなるようなので、コンソールがおかしくなる。C側でデストラクタ書いてないのかもしれない。
- Luaからのcursesの扱いという意味では、問題なく、変なクセも無くLuaから操作できるようでした。真面目なアプリを書いてもよさそうだと思いました。