Pregunta

He estado tratando de obtener información con IUP para hacer un pequeño juego de mesa. Quería probar algunas entradas y probé parte del código que viene con los ejemplos de IUPGL, pero la entrada no parece funcionar en absoluto. Aquí está el código tal como está hasta ahora:

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()

Entiendo que se llama a canvas: k_any () cuando se presiona una tecla, pero no responde, ni siquiera al comando de salida. ¿Alguna idea?

¿Fue útil?

Solución

Aquí está al menos parte del problema para la muestra que ha citado. Antes de que las constantes de nombre de clave IUP se definan realmente en su tabla iup , debe llamar a una función. La idea es que la huella de la memoria sea menor si no necesita todos los nombres clave, algo que muchas aplicaciones pueden prescindir por completo.

Intente agregar las siguientes líneas poco después de que requiera " iuplua " y antes de usar los nombres en cualquier código:

iup.key_open()      -- load key names

Esto está documentado cerca de la parte superior del tema Códigos de teclado , así como en una variedad de lugares relacionados con el teclado.

Sin la llamada a iup.key_open () , iup.K_q se evalúa como nil (como cualquier otro nombre clave) y, por lo tanto, en silencio nunca coincide con ningún código clave pasado a canvas: k_any () .

Editar: acabo de ejecutar su muestra, y de hecho llamando a iup.key_open () hace que se reconozcan las teclas q y w. A continuación, notará un problema adicional que solo al actualizar la posición de la paleta no se solicita que se vuelva a dibujar el lienzo. Lo dejaré como ejercicio a medida que avance.

Edit2: Agregando la línea iup.Update (self) a la función canvas: k_any () justo después de modificar el estado de la paleta parece hacer lo que quieres. Hacerlo de esa manera en lugar de llamar manualmente al método action () tiene la ventaja de interactuar con el manejo del bucle de mensajes de IUP de la manera esperada. En el caso general, se podría preferir llamar a iup.UpdateChildren (ventana) . Eso mantendría cualquier otro control IUP que se muestra en el cuadro de diálogo actualizado, así como el lienzo, lo que puede ser útil si tiene controles que no realizan todas sus actualizaciones internas.

Alternativamente, puede mover las rutinas de dibujo a su propia función llamada desde los métodos k_any () y action () del lienzo. No estoy seguro de recomendarlo en general, ya que no se escala tan bien cuando desea admitir múltiples ventanas gráficas o controles relacionados.

Es posible que desee reorganizar la lógica en su controlador k_any () para que sea menos probable que olvide accidentalmente la llamada a iup.Update () a medida que agrega casos para nuevas claves.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top