在Lua中使用IUP获取输入

时间:2009-05-04 20:27:30

标签: lua iup

我一直在尝试用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命令也没有响应。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

以下是您引用的示例问题的至少一部分。在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键被识别。接下来你会发现另外一个小故障,只是更新paddle的位置不会要求画布重绘。我会在你前进的时候把它作为一种练习。

Edit2:在您修改了paddle的状态后,将行iup.Update(self)添加到函数canvas:k_any()似乎可以执行您想要的操作。这样做而不是手动调用action()方法具有以预期方式与IUP的消息循环处理交互的优点。在一般情况下,可能首选调用iup.UpdateChildren(window)。这将保持对话框中显示的任何其他IUP控件以及画布更新,如果您的控件没有在内部进行所有自己的更新,这将非常有用。

或者,您可以将绘图例程移动到从画布的k_any()action()方法调用的自己的函数中。我不确定我一般会推荐它,因为当你想支持多个视口或相关控件时它也不会扩展。

您可能希望重新安排k_any()处理程序中的逻辑,以便在添加新密钥的情况时不太可能忘记调用iup.Update()