Получение ввода с IUP в Lua

Я пытался получить информацию от IUP, чтобы сделать небольшую игру в понг. Я хотел попробовать вводить данные и пробовал часть кода, который поставляется с примерами IUPGL, но ввод, похоже, не работает вообще. Вот код, который стоит до сих пор:

require "iuplua"
require "iupluagl"
require "luagl"

paddle = {x = -0.9, y = 0.2}

function drawPaddle(x, y)
    gl.Begin(gl.QUADS)
    gl.Color(0.0, 0.5, 0.0)

    gl.Vertex(x, y)
    gl.Vertex(x + 0.1, y)
    gl.Vertex(x + 0.1, y - 0.4)
    gl.Vertex(x, y - 0.4)
end

canvas = iup.glcanvas{buffer = "DOUBLE", rastersize = "300x300"}

function canvas:action(x, y)
    iup.GLMakeCurrent(self)
    gl.ClearColor(0.0, 0.0, 0.0, 0.0)
    gl.Clear(gl.COLOR_BUFFER_BIT)
    gl.Clear(gl.DEPTH_BUFFER_BIT)

    gl.MatrixMode(gl.PROJECTION)
    gl.Viewport(0, 0, 300, 300)
    gl.LoadIdentity()

    drawPaddle(paddle.x, paddle.y)

    gl.End()
    iup.GLSwapBuffers(self)
end

window = iup.dialog{canvas, title = "Soon to be Pong"}

function canvas:k_any(c)
    if c == iup.K_q then
        return iup.CLOSE
    elseif c == iup.K_w then
        paddle.y = paddle.y + 0.02
        return iup.CONTINUE
    else
        return iup.DEFAULT
    end
end

window:show()

iup.MainLoop()

Я так понимаю canvas:k_any() вызывается при нажатии клавиши, но не отвечает даже на команду выхода. Есть идеи?

1 ответ

Решение

Вот, по крайней мере, часть проблемы для приведенного вами примера. Прежде чем константы имени ключа IUP будут фактически определены в вашем iup таблица, вам нужно вызвать функцию. Идея состоит в том, что объем памяти уменьшается, если вам не нужны все имена ключей, без которых многие приложения могут обходиться полностью.

Попробуйте добавить следующие строки вскоре после require "iuplua" и прежде чем использовать имена в любом коде:

iup.key_open () - загрузить имена ключей

Это задокументировано в верхней части темы Коды клавиатуры, а также в различных местах, связанных с клавиатурой.

Без вызова iup.key_open(), iup.K_q оценивает nil (как и любое другое имя ключа) и, следовательно, молча никогда не совпадает ни с одним кодом ключа, переданным canvas:k_any(),

Редактировать: я только что проверил ваш образец, и действительно звоню iup.key_open() вызывает распознавание клавиш q и w. У вас есть еще один глюк, который вы заметите следующим: просто обновление позиции весла не требует перерисовки холста. Я оставлю это как упражнение по мере продвижения вперед.

Edit2: добавление строки iup.Update(self) к функции canvas:k_any() только после того, как вы измените состояние весла, кажется, что вы делаете то, что хотите. Делая это таким образом, а не вручную вызывая action() метод имеет преимущество взаимодействия с обработкой цикла сообщений IUP ожидаемым образом. В общем случае звонит iup.UpdateChildren(window) вместо этого может быть предпочтительным. Это позволило бы обновлять любые другие элементы управления IUP, отображаемые в диалоговом окне, а также холст, что может быть полезно, если у вас есть элементы управления, которые не выполняют все свои собственные обновления внутри.

В качестве альтернативы, вы можете переместить процедуры рисования в их собственную функцию, вызываемую как из k_any() а также action() методы холста. Я не уверен, что рекомендовал бы это вообще, поскольку это не масштабируется также, когда вы хотите поддержать многократные области просмотра или связанные средства управления.

Вы можете изменить логику в вашем k_any() обработчик, так что вы с меньшей вероятностью случайно забудете вызов iup.Update() как вы добавляете чехлы для новых ключей.

Другие вопросы по тегам