好的,所以我一般都是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正在设置上下文或允许它绘制的东西,而当我调度它时,上下文或者缓冲区是错误的。任何帮助将不胜感激。
答案 0 :(得分: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)。
答案 1 :(得分:0)
尝试在更新功能中添加window.switch_to()
上方的绘制调用和window.flip()
。
虽然如msarch的回答所述,你应该避免使用更新函数,并让on_draw函数处理它。