我能用Tkinter写一个流畅的蛇游戏吗?

2024-04-19 07:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

只是想在经典的Python/kinter游戏中实现。感觉很慢,我也不太确定我能不能修好它。我试着简要介绍一下这个项目:

我首先构建画布,然后为每个箭头键添加一个事件处理程序:

root = self.root = Tk()
canvas = Canvas(root, width = width, height = height)
canvas.pack()
canvas.bind("<Left>", on_left) # on_left is a very short function

我还有一个timestep函数。它绘制图形,并将自己调度为再次调用。该函数的效率不是很高,因为它每次都会重画100个矩形:

^{pr2}$

现在,我有两个问题:

  • 即使我在timestep()中选择interval大约为0.05(相当于每秒20帧),也不会超过每秒3-5帧。在
  • 键盘的控制输入似乎延迟了大约0.5秒。在

我想知道三件事:

  • 当你想在每一个时间步上画100个矩形时,有没有可能用Tkinter画布写出一个平滑的、非滞后的(20 fps)蛇呢?

  • 调用timestep函数的选择是正确的吗?

  • 为什么我的键盘输入似乎延迟了?


Tags: 项目函数游戏on画布rootwidthleft
3条回答

如果你不使用画布.删除(…)每帧之间都有内存泄漏。在

尝试使用内置的canvas.after(funciton,interval),而不是线程.计时器. 在

是的,你可以创建一个流畅运行的游戏,在屏幕上有许多对象,你可以这样做没有线程。实现它取决于你有多顺利。在

如果你有一个算法,在每次迭代中删除并重新创建场景中的所有内容,它将运行得非常缓慢。制作动画的正确方法是创建要设置动画的对象一次,而且只创建一次。然后,对于每个帧,可以使用画布方法itemconfiguremove和{}重新配置或移动它们。在

我见过这件作品在画布上有数百件作品。然而,如果你有数千人,它就会陷入困境。此外,当您创建数千个项时,即使删除旧项,画布也存在已知的性能问题。在

因此,就像许多与性能相关的问题一样,这部分归结到最终的算法。例如,在一个蛇游戏中,你可以选择在每一帧上重画整个蛇,或者你可以看到问题,然后意识到你只需要移动蛇的一个或两个部分。第一种方法会很慢,第二种方法会很快。在

底线是,当使用适当的算法实现时,tkinter画布足够强大,可以一次平滑地为几十个项目设置动画。在

相关问题 更多 >