Pyglet不绘制计划函数

1 投票
2 回答
1488 浏览
提问于 2025-04-18 16:30

好的,我对pyglet和OpenGL都完全是小白,我在想为什么这个代码不管用:

def DrawCircle(cx, cy, r, segments):

theta = 2*3.1415926/segments
c = math.cos(theta)
s = math.sin(theta)

x = r
y = 0

pyglet.gl.glBegin(pyglet.gl.GL_POLYGON)
pyglet.gl.glColor3f(0.05,0.2,0.9)
for counter in range(segments):
    pyglet.gl.glVertex2f(x+cx, y+cy)
    t = x
    x = c * x - s * y
    y = s * t + c * y
pyglet.gl.glEnd()

if __name__ == '__main__':
window = pyglet.window.Window(960,1010)
window.set_location(959,20)

@window.event
def on_draw():
    window.clear()

def update(dt):
    print(dt)
    DrawCircle(500,500,20,30)

pyglet.clock.schedule_once(update,0.6)    
pyglet.app.run()

简单来说,如果我在on_draw里面调用DrawCircle,它就能画出我想要的圆。但是如果我把它安排到调度器里,就什么都不画出来。调度器本身是正常工作的,因为dt会打印到控制台。我在猜测,on_draw可能是在设置某种上下文,让它能够画图,而当我把它安排到调度器里时,上下文或者缓冲区可能就不对了。任何帮助都会非常感激。

2 个回答

1

这是正确的代码:

import pyglet
import math

window = pyglet.window.Window(960,1010)
window.set_location( 50,50)

def DrawCircle(cx, cy, r, segments):

    theta = 2*3.1415926/segments
    c = math.cos(theta)
    s = math.sin(theta)

    x = r
    y = 0

    pyglet.gl.glColor3f(0.05,0.2,0.9)
    pyglet.gl.glBegin(pyglet.gl.GL_POLYGON)

    for counter in range(segments):
        pyglet.gl.glVertex2f(x+cx, y+cy)
        t = x
        x = c * x - s * y
        y = s * t + c * y

    pyglet.gl.glEnd()

@window.event
def on_draw():
    window.clear()
    DrawCircle(500,500,20,30)


if __name__ == '__main__':
    pyglet.app.run()

在Pyglet中,所有的绘图通常是在on_draw这个方法里完成的。因为你每次重绘窗口时都会清空它,所以每次也需要重新绘制你的形状。

更新函数不一定和显示有关。

定时调度一次或定期调度通常用于定期修改各种参数(比如:x,y += dx,dy *dt,用于动画)。

可以查看这个链接了解更多信息:http://pyglet.org/doc/api/pyglet.clock-module.html

0

试着在更新函数中,绘制调用之前加上 window.switch_to(),然后在绘制调用之后加上 window.flip()

不过,正如msarch的回答中提到的,你应该避免在更新函数里进行绘制,而是让 on_draw 函数来处理这个事情。

撰写回答