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?
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.