使用 Tkinter 入门 2D 游戏(第 9 部分):显示计数器
发布: (2025年12月24日 GMT+8 13:58)
3 min read
原文: Dev.to
Source: Dev.to
看起来您只提供了来源链接,尚未粘贴需要翻译的正文内容。请把要翻译的文本(包括任何 Markdown 格式)贴在这里,我会为您翻译成简体中文,并保留原有的代码块、链接和格式。
显示计数器
在本文中,我们添加一个计数器,用于显示屏幕上剩余的恶魔数量。
首先,创建一个名为 counter 的变量,用来跟踪剩余的恶魔数量。
# Demon counter
counter = TOTAL_DEMONS
每当捕获到一个恶魔时,在 on_mouse_clicked() 函数中递减计数器。
由于 counter 是全局变量,需要使用 global 声明。
def on_mouse_clicked(e):
global counter
# Demon group
for demon in demons:
if demon.is_inside(e.x, e.y):
if demon.is_dead():
continue
demon.die(cvs)
counter = counter - 1 # Decrease demon counter
break
在 update() 函数中,使用 counter 变量在屏幕上绘制计数器。
def update():
"""Update function"""
cvs.delete("hud")
# Draw mouse coordinates
msg = "x:{}, y:{}".format(mx, my)
cvs.create_text(
mx, my,
text=msg,
fill="white",
font=FONT,
tag="hud"
)
# Draw demon counter
msg = "Remaining Demons: {}".format(counter)
cvs.create_text(
20, 20,
text=msg,
fill="white",
font=FONT,
tag="hud",
anchor="nw"
)
# Demon group
for demon in demons:
overlap_area(demon) # Screen wrap check
demon.update(cvs)
root.after(F_INTERVAL, update)
实现上述代码后,屏幕上将显示剩余恶魔的数量。
完整代码
sprite.py
import math
import random
import tkinter
class DemonSprite:
def __init__(self, cvs, x, y, r):
self.x = x
self.y = y
self.r = r
self.vx = 0
self.vy = 0
self.dead = False
# Circle for collision detection
self.oval = cvs.create_oval(
x - r, y - r, x + r, y + r,
fill="white", width=0
)
# Random demon type: r, g, b
self.type = random.choice(("r", "g", "b"))
file_alive = f"images/dmn_alive_{self.type}.png"
self.photo_alive = tkinter.PhotoImage(file=file_alive)
file_dead = f"images/dmn_dead_{self.type}.png"
self.photo_dead = tkinter.PhotoImage(file=file_dead)
self.image = cvs.create_image(x, y, image=self.photo_alive)
def update(self, cvs):
self.x += self.vx
self.y += self.vy
# Update circle position
cvs.coords(
self.oval,
self.x - self.r, self.y - self.r,
self.x + self.r, self.y + self.r
)
# Update image position
cvs.coords(self.image, self.x, self.y)
def set_x(self, x):
self.x = x
def set_y(self, y):
self.y = y
def move(self, spd, deg):
radian = deg * math.pi / 180
self.vx = spd * math.cos(radian)
self.vy = spd * math.sin(radian)
def stop(self):
self.move(0, 0)
def die(self, cvs):
self.dead = True
self.stop()
cvs.itemconfig(self.oval, fill="red")
cvs.itemconfig(self.image, image=self.photo_dead)
def is_dead(self):
return self.dead
def is_inside(self, x, y):
dx = (self.x - x) ** 2
dy = (self.y - y) ** 2
dist = (dx + dy) ** 0.5
return dist W: obj.set_x(0)
if obj.y H: obj.set_y(0)
主脚本
def on_mouse_clicked(e):
global counter
for demon in demons:
if demon.is_inside(e.x, e.y):
if demon.is_dead():
continue
demon.die(cvs)
counter -= 1
break
def on_mouse_moved(e):
global mx, my
mx, my = e.x, e.y
root = tkinter.Tk()
root.title("Hello, Tkinter!!")
root.resizable(False, False)
root.bind("", on_mouse_clicked)
root.bind("", on_mouse_moved)
cvs = tkinter.Canvas(width=W, height=H, bg="black")
cvs.pack()
init()
update()
root.mainloop()
敬请期待!