Pergunta

Eu tenho tentado obter a entrada com IUP para fazer um pequeno jogo de pong. Eu queria tentar alguma entrada, e tentou parte do código que vem com os exemplos IUPGL, mas a entrada não parecem estar funcionando. Aqui está o código como está até agora:

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

É meu entendimento que canvas:k_any() é chamada quando uma tecla é pressionada, mas não está respondendo, mesmo para o comando quit. Alguma idéia?

Foi útil?

Solução

Aqui está, pelo menos, parte do problema para a amostra que você citou. Antes das constantes IUP KeyName são realmente definido na sua mesa iup, você precisa chamar uma função. A ideia é que o consumo de memória é menor se você não precisa de todos os nomes-chave, que muitas aplicações pode fazer inteiramente sem.

Tente adicionar as seguintes linhas em algum momento logo após require "iuplua" e antes de usar os nomes em qualquer código:

iup.key_open()      -- load key names

Isso está documentado no topo do tópico códigos teclado , bem como em uma variedade de lugares relacionados com o teclado.

Sem a chamada para iup.key_open(), avalia iup.K_q para nil (como faz qualquer outro nome da chave) e, assim, silenciosamente não corresponde a qualquer código de acesso passado para canvas:k_any().

Editar: Eu corri sua amostra, e de fato chamando iup.key_open() faz com que o Q e W chaves para ser reconhecido. Você tem uma outra falha que você vai notar em seguida que apenas atualizando a posição do remo não pede a tela para redesenhar. Vou deixar isso como um exercício que você vá para a frente.

Edit2: Adicionando o iup.Update(self) linha para o canvas:k_any() função apenas depois de modificar o estado das aparece a remo para fazer o que quiser. Fazê-lo desta forma ao invés de chamar manualmente o método action() tem a vantagem de interagir com a manipulação mensagem alça de IUP da maneira esperada. No caso geral, iup.UpdateChildren(window) chamando vez pode ser preferido. Que iria manter quaisquer outros controles IUP que são exibidos na caixa de diálogo atualizado, bem como a tela, que pode ser útil se você tiver controles que não fazer todos os seus próprios atualizar internamente.

Como alternativa, você pode mover as rotinas de desenho em sua própria função chamada de ambos os métodos k_any() e action() da tela. Eu não tenho certeza eu recomendo que, em geral, uma vez que não escala bem quando você quer para suportar múltiplas viewports ou controles relacionados.

Você pode querer reorganizar a lógica no seu manipulador k_any() de modo que você é menos provável que acidentalmente esquecer a chamada para iup.Update() como você adiciona casos de novas chaves.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top