我创建了一个简单的脚本,显示一个向左移动的正方形:
import pyglet
window = pyglet.window.Window(800, 600)
x = 0
y = 250
width = 100
height = 100
def update(time):
global x
window.clear()
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y+height, x+width, y+height, x+width, y]))
x += 10
pyglet.clock.schedule_interval(update, 1/10)
pyglet.app.run()
当没有键盘输入时,正方形会正确渲染,但每当我按下一个键时,看起来窗口就会被清除,并且前一帧会再次渲染。我通过拆分更新函数并使用 on_key_press()
函数解决了这个问题:
@window.event
def on_key_press(symbol, modifiers):
draw()
def update(time):
global x
x += 10
draw()
def draw():
window.clear()
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y + height, x + width, y + height, x + width, y]))
但我认为这不是解决问题的正确方法,因为我在一帧中渲染正方形两次。您可以在这里查看问题所在:https://youtu.be/cIwuLYuLWtY .
最佳答案
在 pyglet 中,窗口应该在 on_draw()
中重绘。另请参阅Writing a pyglet application .
事件发生后,on_draw
事件被执行并更新窗口。
当没有实现 on_draw 事件时,似乎在双缓冲上下文中,在按键事件之后触发了缓冲区交换。由于场景未更新(因为也没有 on_draw
),因此显示前一帧。
我建议实现一个 on_draw
事件来重绘窗口:
import pyglet
window = pyglet.window.Window(800, 600)
x, y, width, height = 0, 250, 100, 100
def update(time):
global x
x += 10
@window.event
def on_draw():
window.clear()
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y+height, x+width, y+height, x+width, y]))
pyglet.clock.schedule_interval(update, 1/10)
pyglet.app.run()
关于python - 按下按键时窗口显示上一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57576644/