1

我一直在尝试通过 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()当一个键被按下时会被调用,但它没有响应,即使是退出命令。有任何想法吗?

4

1 回答 1

2

对于您引用的示例,这至少是部分问题。在您的表中实际定义 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()

于 2009-05-06T00:12:09.153 回答