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/lualocal 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) dotable.insert(result, f(v))endreturn resultendfunction run()local cols, lines = curses.COLS(), curses.LINES()for i = 1, cols + string.len(SL[1]) dolocal 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()endend 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から操作できるようでした。真面目なアプリを書いてもよさそうだと思いました。