Получение ввода с помощью 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() вызывается при нажатии клавиши, но он не отвечает даже на команду выхода. Любые идеи?


person Cristián Romo    schedule 04.05.2009    source источник
comment
Вероятно, вам следует задать этот вопрос в списке рассылки IUP lists.luaforge.net/ cgi-bin / mailman / listinfo / iup-mail или в список рассылки Lua bazar2.conectiva.com.br/mailman/listinfo/lua Авторы IUP читают их и обычно очень полезны и отзывчивы.   -  person Alexander Gladysh    schedule 05.05.2009
comment
Я использую IUP в нескольких проектах, но еще не играл с IUPGL. Хотя мне, вероятно, следовало использовать его вместо компакт-диска для контроля уровня звука, который мне пришлось реализовать для одного проекта ... Я знаю, что ключевые обратные вызовы более причудливы в привязке Lua, чем при использовании IUP непосредственно из C , так что это может быть место для начала поиска в исходном коде. Я поддержу рекомендацию попробовать список IUP. Авторы обычно быстро реагируют, и вы также охватите ряд опытных пользователей.   -  person RBerteig    schedule 05.05.2009


Ответы (1)


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

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

iup.key_open()      -- load key names

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

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

person RBerteig    schedule 06.05.2009
comment
Я подозревал, что ключи были nil, спасибо за подтверждение! В настоящее время я просматриваю документацию, пытаясь понять, как принудительно перерисовать, без особого успеха. Я пробовал iup.Update и iup.UpdateChildren, но он жалуется, что они nil значения. - person Cristián Romo; 06.05.2009
comment
Что ж, мне удалось заставить его работать, но похоже, что это своего рода глупо. В конце canvas: k_any () я напрямую вызываю canvas: action (). Это выполняет свою работу, но есть ли лучший способ принудительно перерисовать? - person Cristián Romo; 06.05.2009
comment
Я отредактировал некоторые пояснения о том, где и как вызывать iup.Update (self) в холсте: метод k_any (key). - person RBerteig; 07.05.2009
comment
iup.key_open () больше не требуется в IUP 3. - person Stuart P. Bentley; 16.05.2011