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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top