Question

J'ai essayé d'obtenir des informations avec IUP pour créer un petit jeu de pong. Je voulais essayer certaines entrées et essayer une partie du code fourni avec les exemples IUPGL, mais l'entrée ne semble pas fonctionner du tout. Voici le code actuel:

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

Si j'ai bien compris, canvas: k_any () est appelé lorsqu'une touche est enfoncée, mais ne répond pas, même à la commande quit. Des idées?

Était-ce utile?

La solution

Voici au moins une partie du problème concernant l'exemple que vous avez cité. Avant que les constantes de nom clé IUP soient réellement définies dans votre table iup , vous devez appeler une fonction. L’idée est que l’encombrement de la mémoire est moindre si vous n’avez pas besoin de tous les noms de clé, ce dont de nombreuses applications peuvent se passer entièrement.

Essayez d'ajouter les lignes suivantes peu de temps après que requiert "iuplua" et et avant que vous n'utilisiez les noms dans un code quelconque:

iup.key_open()      -- load key names

Ceci est documenté vers le haut de la rubrique Codes de clavier , ainsi que dans divers endroits liés au clavier.

Sans l'appel à iup.key_open () , iup.K_q est évalué à nil (comme tout autre nom de clé) et ainsi Silencieusement, ne correspond jamais à aucun code clé transmis à canvas: k_any () .

Modifier: Je viens d'exécuter votre exemple et l'appel à iup.key_open () entraîne la reconnaissance des touches q et w. Vous remarquerez ensuite que la simple mise à jour de la position de la palette ne demande pas à la toile de se redessiner. Je vais laisser cela comme un exercice à mesure que vous avancez.

Modifier2: l'ajout de la ligne iup.Update (self) à la fonction canvas: k_any () juste après avoir modifié l'état de la pagaie semble faire ce que vous voulez. Le faire de cette façon plutôt que d'appeler manuellement la méthode action () présente l'avantage d'interagir avec la gestion des boucles de messages d'IUP de la manière attendue. Dans le cas général, appeler plutôt iup.UpdateChildren (window) peut être préférable. Cela garderait tous les autres contrôles IUP affichés dans la boîte de dialogue mis à jour ainsi que le canevas, ce qui peut être utile si vous avez des contrôles qui ne font pas leurs propres mises à jour en interne.

Vous pouvez également déplacer les routines de dessin dans leur propre fonction appelée à partir des méthodes k_any () et action () du canevas. Je ne suis pas sûr que je le recommande en général, car cela ne s'adapte pas également lorsque vous souhaitez prendre en charge plusieurs fenêtres ou contrôles associés.

Vous voudrez peut-être réorganiser la logique dans votre gestionnaire k_any () afin d'éviter tout risque d'oubli accidentel de l'appel à iup.Update () au fur et à mesure que vous ajoutez cas pour les nouvelles clés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top