質問
私は、IUPを使用して小さなピンポンゲームを作成しようとしています。入力を試し、IUPGLの例に付属するコードをいくつか試しましたが、入力がまったく機能していないようです。これまでのコードは次のとおりです。
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()
キーが押されたときに canvas:k_any()
が呼び出されることは理解していますが、quitコマンドに対しても応答しません。アイデアはありますか?
解決
これは、引用したサンプルの問題の少なくとも一部です。 IUPキー名定数が実際に iup
テーブルで定義される前に、関数を呼び出す必要があります。アイデアは、すべてのキー名が必要でない場合はメモリフットプリントが低くなるということです。多くのアプリケーションはこれを完全になくすことができます。
require" iuplua"
の直後で、コードで名前を使用する前に、次の行を追加してみてください。
iup.key_open() -- load key names
これは、トピックキーボードコードの上部付近、およびキーボードに関連するさまざまな場所に記載されています。
iup.key_open()
の呼び出しなしで、 iup.K_q
は nil
(他のキー名と同様)に評価されるため、 canvas:k_any()
に渡されたキーコードと暗黙的に一致することはありません。
編集:サンプルを実行しましたが、実際に iup.key_open()
を呼び出すと、qキーとwキーが認識されます。パドルの位置を更新するだけでは、キャンバスの再描画が要求されないことに気付くでしょう。今後の演習として残しておきます。
Edit2:の状態を変更した直後に、関数 canvas:k_any()
に行 iup.Update(self)
を追加しますパドルはあなたがやりたいように見える。 action()
メソッドを手動で呼び出すのではなく、この方法で行うと、IUPのメッセージループ処理と期待どおりに対話できるという利点があります。一般的な場合、代わりに iup.UpdateChildren(window)
を呼び出すことをお勧めします。それにより、ダイアログに表示される他のIUPコントロールとキャンバスが更新されます。これは、内部ですべての更新を行わないコントロールがある場合に役立ちます。
また、描画ルーチンを、キャンバスの k_any()
および action()
メソッドの両方から呼び出される独自の関数に移動することもできます。複数のビューポートまたは関連するコントロールをサポートしたい場合はスケーリングしないので、一般的に推奨するかどうかはわかりません。
追加するときに iup.Update()
の呼び出しを誤って忘れないように、 k_any()
ハンドラーのロジックを再配置することができます。新しいキーの場合。