【发布时间】:2019-04-23 19:15:56
【问题描述】:
我目前正在为一个班级做一个水果忍者项目。一切功能正常,但是,当我尝试为游戏添加背景图像时,运行速度非常慢。为了让游戏看起来更精致,我需要在拥有游戏节目背景的同时让一切顺利进行。我遇到并试图理解的其他解决方案根本不起作用,或者文件永远不会运行。
仅供参考:我正在使用 python 2.7。
我尝试了一些其他添加背景的建议,例如使用标签功能,但是,当我尝试实现它时,我遇到了各种错误,而且它似乎在我的动画框架中不起作用。
def run(width=300, height=300):
def redrawAllWrapper(canvas, data):
canvas.delete(ALL)
canvas.create_rectangle(0, 0, data.width, data.height,
fill='white', width=0)
redrawAll(canvas, data)
canvas.update()
def mousePressedWrapper(event, canvas, data):
mousePressed(event, data)
redrawAllWrapper(canvas, data)
def keyPressedWrapper(event, canvas, data):
keyPressed(event, data)
redrawAllWrapper(canvas, data)
def timerFiredWrapper(canvas, data):
timerFired(data)
redrawAllWrapper(canvas, data)
# pause, then call timerFired again
canvas.after(data.timerDelay, timerFiredWrapper, canvas, data)
# Set up data and call init
class Struct(object): pass
data = Struct()
data.width = width
data.height = height
data.timerDelay = 10 # milliseconds
root = Tk()
root.resizable(width=False, height=False) # prevents resizing window
init(data)
# create the root and the canvas
canvas = Canvas(root, width=data.width, height=data.height)
canvas.configure(bd=0, highlightthickness=0)
canvas.pack()
# set up events
root.bind("<Button-1>", lambda event:
mousePressedWrapper(event, canvas, data))
root.bind("<Key>", lambda event:
keyPressedWrapper(event, canvas, data))
timerFiredWrapper(canvas, data)
# and launch the app
root.mainloop() # blocks until window is closed
print("bye!")
run(1200, 700)
使用我当前的框架,我在此运行函数上方的 init、timerFired、redrawAll、keyPressed 和 mousePressed 函数中编写所有必要的代码。
以我目前的实现为背景。我在 1200 x 700 gif 文件上使用 PhotoImage,并在 redrawAll 函数(每 10 毫秒调用一次)中在整个屏幕上绘制图像。不画这一张图,我的游戏运行很流畅,但是在redrawAll中画图后,游戏明显滞后,所以我知道滞后的来源是绘制背景图像。
这是在 redrawAll 中绘制它的代码行:
canvas.create_image(data.width//2, data.height//2, image = data.background)
这仅仅是因为我在 redrawAll 中执行此操作,每次调用该函数时都会连续绘制图像使其变慢?只是在 Tkinter 中拥有这么大的图像会使其变慢吗?来源是什么?
有没有一种方法可以简单地在背景上绘制一次图像并且它永远不会改变?或者有什么办法可以不卡顿?我只是觉得很奇怪。同样,这是在 Mac 上的 python 2.7 中。
谢谢!
【问题讨论】:
-
为什么要重绘所有元素。
tkinter与pygame或其他框架不同。您不必重绘所有元素。您可以在不重绘的情况下在画布上移动元素,并且画布可以正确显示。
标签: python python-2.7 tkinter background lag