Pyglet不绘制计划函数
好的,我对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
函数来处理这个事情。