Вопрос

Я пытался получить информацию от 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 () вызывается при нажатии клавиши, но она не отвечает даже на команду quit. Есть идеи?

Это было полезно?

Решение

Вот, по крайней мере, часть проблемы для приведенного вами примера. Прежде чем константы имени ключа 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 () при добавлении чехлы для новых ключей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top