Window 按下某个键时显示上一帧
Window shows previous frame when a key is pressed
我创建了一个简单的脚本,显示一个向左移动的正方形:
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()
当没有键盘输入时,正方形被正确渲染,但每当我按下一个键时,似乎 window 被清除并且前一帧再次被渲染。我通过拆分更新函数和使用 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 中,window 应该在 on_draw()
. See also Writing a pyglet application 中重绘。
事件发生后,执行on_draw
事件并更新window。
当没有实施 on_draw
事件时,似乎在双缓冲上下文中,在键事件之后触发了缓冲区交换。由于场景没有更新(因为也没有on_draw
),所以显示的是前一帧。
我建议实现一个 on_draw
事件来重绘 window:
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()
我创建了一个简单的脚本,显示一个向左移动的正方形:
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()
当没有键盘输入时,正方形被正确渲染,但每当我按下一个键时,似乎 window 被清除并且前一帧再次被渲染。我通过拆分更新函数和使用 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 中,window 应该在 on_draw()
. See also Writing a pyglet application 中重绘。
事件发生后,执行on_draw
事件并更新window。
当没有实施 on_draw
事件时,似乎在双缓冲上下文中,在键事件之后触发了缓冲区交换。由于场景没有更新(因为也没有on_draw
),所以显示的是前一帧。
我建议实现一个 on_draw
事件来重绘 window:
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()