代码之家  ›  专栏  ›  技术社区  ›  Cristián Romo

在Lua中使用IUP获取输入

  •  1
  • Cristián Romo  · 技术社区  · 17 年前

    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 回复  |  直到 13 年前
        1
  •  2
  •   RBerteig Keith Adler    17 年前

    iup

    require "iuplua" 在任何代码中使用这些名称之前:

    iup.key_open()      -- load key names
    

    键盘代码 以及与键盘相关的各种地方。

    iup.key_open() , iup.K_q nil canvas:k_any() .

    编辑: iup.key_open() 使q和w键被识别。接下来,您会注意到另一个小问题,即仅仅更新球拍的位置并不会要求重新绘制画布。我将把它作为你前进的练习。

    编辑2: 添加线条 iup.Update(self) action() 该方法具有以预期方式与IUP的消息循环处理交互的优点。在一般情况下,呼叫 iup.UpdateChildren(window)

    k_any() 画布的方法。我不确定我是否会推荐它,因为当你想支持多个视口或相关控件时,它的缩放效果不佳。

    k_any() 处理程序,这样您就不太可能意外忘记对的调用 iup.Update()