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