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