Frage

Ich habe versucht, die Eingabe mit IUP zu bekommen, um ein kleines Pong-Spiel zu machen. Ich wollte eine Eingabe, um zu versuchen, und versuchte, einen Teil des Codes, der mit den IUPGL Beispielen kommt, aber der Eingang scheint nicht überhaupt zu arbeiten. Hier ist der Code, wie es bisher steht:

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

Es ist mein Verständnis, dass canvas:k_any() aufgerufen wird, wenn eine Taste gedrückt wird, aber es wird nicht reagiert, auch auf den Befehl beenden. Irgendwelche Ideen?

War es hilfreich?

Lösung

Hier ist zumindest ein Teil des Problems für die Probe Sie zitiert haben. Bevor die Konstanten keyname IUP tatsächlich definiert sind, in Ihrem iup Tabelle, müssen Sie eine Funktion aufzurufen. Die Idee ist, dass der Speicherbedarf geringer ist, wenn Sie alle wichtigen Namen nicht benötigen, die viele Anwendungen tun können, ohne vollständig.

Versuchen Sie, die folgenden Zeilen irgendwann kurz nach require "iuplua" Hinzufügen und bevor Sie die Namen in beliebigem Code verwenden:

iup.key_open()      -- load key names

Dies wird in der Nähe des oberen Rand des Themas dokumentiert Tastencodes sowie in einer Vielzahl von Orten auf der Tastatur zusammen.

Ohne den Aufruf von iup.key_open(), iup.K_q nil auswertet (wie auch anderen Schlüsselnamen) und damit geräuschlos nie keycode Spiele weitergegeben canvas:k_any().

Edit: Ich lief Ihre Probe, und in der Tat ruft iup.key_open() bewirkt, dass die q und w Tasten erkannt werden. Sie haben eine weitere Panne Sie als nächstes feststellen, dass nur die Position der Paddel Aktualisierung nicht für die Leinwand bittet neu zu zeichnen. Ich lasse das als eine Übung, wie Sie vorwärts gehen.

Edit2: die Linie iup.Update(self) auf die Funktion canvas:k_any() Hinzufügen nur, nachdem Sie den Zustand des Paddels ändern scheint zu tun, was Sie wollen. es auf diese Weise eher tun als manuell die action() Aufruf der Methode hat den Vorteil, in der erwarteten Weise mit IUP der Nachrichtenschleife Handhabung interagieren. Im allgemeinen Fall, rufen iup.UpdateChildren(window) stattdessen könnte bevorzugt werden. Das würde alle andere IUP Kontrollen halten, die ebenso wie die Leinwand aktualisiert, im Dialog angezeigt werden, das nützlich sein kann, wenn Sie Steuerelemente, die nicht alle intern ihre eigene Aktualisierung tun.

Alternativ können Sie die Zeichenroutinen in ihre eigene Funktion bewegen sich von den beiden k_any() und action() Methoden der Leinwand genannt. Ich bin mir nicht sicher, ob ich, dass in der Regel empfehlen, da es nicht so gut skaliert, wenn Sie mehrere Ansichtsfenster oder verwandte Kontrollen.

unterstützen mögen

Sie können die Logik in Ihrem k_any() Handler neu zu ordnen wollen, so dass Sie weniger wahrscheinlich versehentlich den Anruf vergessen iup.Update() wie Sie Fälle für neue Schlüssel hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top