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

コメントする

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


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

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