Получение ввода с 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()
как вы добавляете чехлы для новых ключей.