LuaでSL(luacurses)

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から操作できるようでした。真面目なアプリを書いてもよさそうだと思いました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください