Tkinter滚动画布组件速度问题
我现在正在用Tkinter重新制作《Flappy Bird》。我知道这样做不好,下面会解释原因。我的问题是关于管道的,它们的滚动速度和彼此之间的距离。除非我的逻辑有问题,如果我把两个管道分开,然后在它们到达某个点时移动它们,并把它们放在同一个位置,它们之间的间隙应该保持不变。用代码来解释可能更清楚。
from tkinter import *
import random
root = Tk()
root.geometry('430x640')
root.configure(background='turquoise')
canvas = Canvas(root,width=int(435),height=int(645))
canvas.configure(background='turquoise')
canvas.pack()
x, x2 = 400, 700
y = random.randint(0,300)
y2 = random.randint(0,300)
def drawPipe():
global x,x2,y,y2
canvas.coords(pipeTop,(x,0,(x+50),y))
canvas.coords(pipeBottom,(x,640,(x+50),(y+150)))
canvas.coords(pipeTop2,(x2,0,(x2+50),y2))
canvas.coords(pipeBottom2,(x2,640,(x2+50),(y2+150)))
x -= 3
x2 -= 3
if x < -46:
x = 435
y = random.randint(5,540)
if x2 <-46:
x2 = 435
y2 = random.randint(5,540)
root.after(1,drawPipe)
pipeTop = canvas.create_rectangle(x,0,(x+50),y,fill='green')
pipeBottom = canvas.create_rectangle(x,640,x+50,y+150,fill='green')
pipeTop2 = canvas.create_rectangle(x2,0,(x2+50),y,fill='green')
pipeBottom2 = canvas.create_rectangle(x2,640,(x2+50),(y2+150),fill='green')
drawPipe()
root.mainloop()
这不是我完整的代码,但这是与绘制和更新管道相关的部分。运行这段代码时,你会看到管道的滚动速度在变化。我不明白这是怎么回事。除了起始位置,管道的所有值都是一样的。这是因为Tkinter使用after
方法的方式不够高效吗?我尝试过使用线程,但在使用root.bind
时出现了问题(可以查看我之前的问题)。还是说这是逻辑错误?提前感谢任何能帮我解决这个问题的人。
顺便说一下,我意识到我不应该在Tkinter中制作游戏,特别是那种需要同时发生多件事情的游戏。不过,我在学校做这个项目,而我想用的模块(Pygame或Pyglet)不能单独为我下载来制作一个没有实际目的的游戏。如果我能使用其他工具,我可能会选择别的。谢谢你的帮助。
1 个回答
0
使用 after(1,..)
的时候,你会得到 1000FPS
(每秒帧数),但其实你并不需要这么高的帧数——用 after(20,...)
就能得到 50 FPS
。
如果你一直用 after(1,..)
,你的程序就没有时间去做其他事情——它没法执行所有的 after()
,所以你会感觉速度不一样。
用 after(1,..)
的时候,我甚至连窗口都没法移动。
而且我的电脑CPU变得很热,风扇开始转得更快、更响。