Domanda
Ho cercato di ottenere input con IUP per creare un piccolo gioco di pong. Volevo provare qualche input e ho provato un po 'del codice fornito con gli esempi IUPGL, ma l'input sembra non funzionare affatto. Ecco il codice così com'è finora:
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()
Comprendo che canvas: k_any ()
viene chiamato quando viene premuto un tasto, ma non risponde, nemmeno al comando quit. Qualche idea?
Soluzione
Ecco almeno una parte del problema per il campione che hai citato. Prima che le costanti del nome chiave IUP siano effettivamente definite nella tabella iup
, è necessario chiamare una funzione. L'idea è che il footprint della memoria è inferiore se non hai bisogno di tutti i nomi delle chiavi, di cui molte applicazioni possono fare a meno.
Prova ad aggiungere le seguenti righe poco dopo richiede " iuplua "
e prima di utilizzare i nomi in qualsiasi codice:
iup.key_open() -- load key names
Questo è documentato nella parte superiore dell'argomento Codici tastiera e in una varietà di luoghi relativi alla tastiera.
Senza la chiamata a iup.key_open ()
, iup.K_q
restituisce zero
(come qualsiasi altro nome chiave) e quindi silenziosamente non corrisponde mai a nessun codice chiave passato a canvas: k_any ()
.
Modifica: Ho appena eseguito il tuo campione e in effetti chiamando iup.key_open ()
viene riconosciuto il tasto qew. Hai un ulteriore problema tecnico che noterai dopo che l'aggiornamento della posizione della paletta non richiede il ridisegno della tela. Lo lascerò come un esercizio mentre vai avanti.
Modifica2: Aggiunta della riga iup.Update (self)
alla funzione canvas: k_any ()
subito dopo aver modificato lo stato di la paletta sembra fare quello che vuoi. Farlo in questo modo anziché chiamare manualmente il metodo action ()
ha il vantaggio di interagire con la gestione del ciclo di messaggi di IUP nel modo previsto. Nel caso generale, è preferibile invece chiamare iup.UpdateChildren (finestra)
. Ciò manterrebbe aggiornati tutti gli altri controlli IUP visualizzati nella finestra di dialogo e l'area di disegno, il che può essere utile se si dispone di controlli che non eseguono tutti i propri aggiornamenti internamente.
In alternativa, è possibile spostare le routine di disegno nella propria funzione chiamata da entrambi i metodi k_any ()
e action ()
dell'area di disegno. Non sono sicuro che lo consiglierei in generale poiché non si adatta bene quando si desidera supportare più finestre o controlli correlati.
Potresti voler riorganizzare la logica nel tuo gestore k_any ()
in modo da avere meno probabilità di dimenticare accidentalmente la chiamata a iup.Update ()
mentre aggiungi custodie per nuove chiavi.