LÖVEでゲームを作ろう 3 簡単なUI

(簡単なUIとは使うのが簡単というより作りが簡単という意味)
LÖVEで使えるGUIライブラリはCategory:Libraries - LOVEにいくつか載っているのだけれども、自分で簡単なGUIライブラリを作ってみることにした。
成果物: mandel59/lovesui · GitHub
f:id:mandel59:20121125135756p:image
コードを抜粋してみると、こんな感じ。

ui = sui.vbox 5, {
    sui.font -> bigFont,
        sui.label 200, 24, "Hello, world!"
    sui.label 200, 16, -> tostring value1
    sui.bc {50, 50, 50, 255}, sui.hbar 200, 16, -> value1 / 100
    sui.hbox 5, {
        sui.pie 50, -> value1 / 100
        sui.margin 10, 10, sui.pie 30, -> 1 - value1 / 100
        sui.fc -> if value2f() == 100
                return {255, 128, 64, 255},
            sui.pie 50, -> value2f() / 100
    }
    sui.label 200, 16, -> "Type away! #text = " .. tostring(#text)
    sui.label 200, 16, -> text
    sui.margin 5, 5, sui.mousepressed (x, y, button) ->
            if button == 'l'
                clicked1 = 1
                mouse_x, mouse_y = x, y,
        sui.bc {50, 50, 50, 255}, sui.margin 30, 20, sui.label 120, 32, ->
            if clicked1 > 0
                "You clicked at \n#{mouse_x}, #{mouse_y}"
            else
                'Click me!'
}

love.draw = ->
    ui.draw(ui_x, ui_y)
    return

love.mousepressed = (x, y, button) ->
    ui.mousepressed(ui_x, ui_y, x, y, button)
    return

色々な値をクロージャーを使って渡している。たとえば、幅と高さ、キャプションを受け取ってラベルを返すsui.labelでは、次のように書くと、value1変数の値が変更された時に、ラベルのキャプションにも変更が反映される。

sui.label 200, 16, -> tostring value1

MoonScriptは便利ね。