使用 Tkinter 入门 2D 游戏(第 2 部分):创建游戏屏幕
Source: Dev.to
Source: …
创建游戏画面
在本文中,我们将使用 Tkinter 的 Canvas 来创建游戏画面。
1. 准备工作文件夹
-
创建一个工作文件夹,并在其中添加名为
main.py的文件。
有关如何创建文件的详细说明,请参见
Saving a Program to a File。 -
在工作文件夹内创建一个
images目录。所有图像资源都将存放在该目录中。 -
下载下图并将其保存为
bg_jigoku.png,放入images文件夹中。
(看起来像是熟悉的地狱场景,对吧?)
你的文件夹结构应如下所示:
working_folder/
├─ main.py # 主程序文件
└─ images/
└─ bg_jigoku.png # 背景图像
从现在起,我们将在 main.py 文件中编写所有代码。
2. 创建 Tkinter 对象
导入 tkinter 库并创建一个带标题的根窗口。
禁用窗口大小调整可以让游戏区域保持固定尺寸。
import tkinter
root = tkinter.Tk() # 创建一个 Tkinter 对象
root.title("Hello, Tkinter!!") # 窗口标题
root.resizable(False, False) # 禁用窗口大小调整
3. 创建 Canvas
使用变量 W(宽度)和 H(高度)定义画布尺寸。
随后使用这些尺寸创建一个 Canvas 小部件。
import tkinter
# Canvas 宽度和高度
W, H = 480, 320
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=W, height=H)
canvas.pack()
如果此时运行程序,将会出现一个 480 × 320 像素 的窗口。
接下来继续添加代码,加载背景图像、处理全屏切换,并构建游戏画面的其余部分。
画布
import tkinter
W, H = 480, 320
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()
root.mainloop()
从现在开始,我们将在此画布上绘制背景图像和角色图像。

4. 准备初始化函数
我们将准备一个 初始化函数,它在游戏开始时运行一次;以及一个 更新函数,它会持续刷新屏幕。将初始化逻辑与更新逻辑分离可以让整体代码更加简洁。
init() 函数中的 pass 语句表示 “什么也不做”(后面会填入实际代码)。
import tkinter
W, H = 480, 320
def init():
"""初始化函数。"""
pass
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()
init()
update() # 稍后会定义
root.mainloop()
5. 准备更新函数
使用 F_RATE 定义帧率。
帧率指 每秒屏幕刷新的次数。
理想情况下约为 60 fps,但本练习使用 30 fps。
F_INTERVAL 是一帧的时间间隔(毫秒)。
在 update() 中调用 root.after(F_INTERVAL, update) 来安排下一次更新。
import tkinter
W, H = 480, 320
# 帧率
F_RATE = 30
F_INTERVAL = int(1000 / F_RATE)
def init():
"""初始化函数。"""
pass
def update():
"""更新函数。"""
root.after(F_INTERVAL, update)
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()
init()
update()
root.mainloop()
6. 放置背景图像
在 init() 中加载并放置背景图像。
图像文件为 bg_jigoku.png,位于 images 文件夹中。
需要使用 global 关键字,以防 PhotoImage 对象被垃圾回收。
# 背景图像(全局变量)
bg_photo, bg_image = None, None
def init():
"""初始化函数。"""
global bg_photo, bg_image
bg_photo = tkinter.PhotoImage(file="images/bg_jigoku.png")
bg_image = cvs.create_image(W / 2, H / 2, image=bg_photo)
完整代码(截至目前)
import tkinter
W, H = 480, 320
F_RATE = 30
F_INTERVAL = int(1000 / F_RATE)
bg_photo, bg_image = None, None
def init():
global bg_photo, bg_image
bg_photo = tkinter.PhotoImage(file="images/bg_jigoku.png")
bg_image = cvs.create_image(W / 2, H / 2, image=bg_photo)
def update():
root.after(F_INTERVAL, update)
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()
init()
update()
root.mainloop()

接下来…
感谢阅读!
下一篇文章将是 “使用鼠标事件”。 敬请期待!