我是pyglet的新手,但为了完成一个学校的项目,我需要快速学习它。基本上,我有我的第一张幻灯片,上面有图像菜单和预览,还有第二张幻灯片,上面有end_screen图像。第一张幻灯片的显示效果很好,虽然程序不会让我过渡到第二张幻灯片,当我按下一个键。没有错误信息,只是当我试图绘制第二张幻灯片时,它什么都不做。
import pyglet
from pyglet.window import key
import time
slide = 1
preview_image = pyglet.image.load('untitled (3).jpg')
menu_image = pyglet.image.load('untitled (4).jpg')
end_screen_image = pyglet.image.load('untitled (5).jpg')
preview = pyglet.sprite.Sprite(preview_image, x=0, y=0)
menu = pyglet.sprite.Sprite(menu_image, x=540, y=0)
end_screen = pyglet.sprite.Sprite(end_screen_image, x=270, y=0)
window = pyglet.window.Window(1180, 630)
def update():
global menu
global window
global preview
global end_screen
global slide
if slide == 1:
window.clear()
preview.draw()
menu.draw()
elif slide == 2:
window.clear()
end_screen.draw()
@window.event
def on_key_press(symbol, modifiers):
global slide
slide = 2
update()
@window.event
def on_draw():
window.clear()
preview.draw()
menu.draw()
pyglet.app.run()
出于某种原因,它只是不工作。我已经尝试了不同类型的更新功能,但他们都没有工作。先谢谢你了
这里的主要问题是 update
和你通常期望的代码执行方式。我猜你已经习惯了代码被称为 如你所言意思是说,你认为 "如果我按一个按钮,我想 update()
拟改名为". 部分是这样的。
你遇到的问题是,Pyglet试图尽可能快地渲染事物,它通过调用 on_draw()
只要需要就可以。所以当你执行 update()
- 弹指一挥间 on_draw()
会被再次调用,再次... ... 再次。而你的第一行 on_draw
是 window.clear()
- 清理窗口和在 update()
. 希望这有意义。
相反,你可能想让你的 "我在展示哪件东西 "的逻辑在你的脑海里。on_draw
每次渲染。虽然这会很慢,但希望这能传达自动渲染过程的工作逻辑,以及为什么你在学校作业中的逻辑不一定能很好地转化到有 "后台任务 "运行的项目中。
import pyglet
from pyglet.window import key
import time
preview = pyglet.sprite.Sprite(pyglet.image.load('untitled (3).jpg'), x=0, y=0)
menu = pyglet.sprite.Sprite(pyglet.image.load('untitled (4).jpg'), x=540, y=0)
end_screen = pyglet.sprite.Sprite(pyglet.image.load('untitled (5).jpg'), x=270, y=0)
window = pyglet.window.Window(1180, 630)
@window.event
def on_key_press(symbol, modifiers):
global slide
slide = 2
@window.event
def on_draw():
window.clear()
if slide == 1:
window.clear()
preview.draw()
menu.draw()
elif slide == 2:
window.clear()
end_screen.draw()
pyglet.app.run()
哦,顺便说一下,不需要 global
中的变量,比如您的 update()
函数。除非你给变量分配一些东西(menu = ...
)它们将默认为全局性的 (例如,见于 on_key_press
在那里你更新 slide
与 slide = 2
在这些情况下,你需要先进行全球化处理). 只是友好地提醒一下全局范围在Python和它的函数中是如何工作的--让你有更多的回旋余地来写更少的代码,实现同样的事情。所以请记住。=
意味着你需要把它们做成全局的,否则就别麻烦了:)
我还把代码做得更 "小 "一些,因为你没有使用 preview_image
我直接把图像加载结果传到了 Sprite()
对于 preview
比如说,节省了3行代码,使得它的代码可以说是略微少了一些,从而更容易读懂。这是个口味问题,如果你觉得喜欢,可以恢复。