转载注明链接:https://www.cnblogs.com/liquancai/p/13236196.html
pygame 的字体使用
pygame 可以直接调用系统字体,也可以调用 TTF 字体。为了使用字体,应该首先创建一个 Font 对象(不要忘记初始化 pygame),对于系统自带的字体应该这样调用:
font1 = pygame.font.SysFont('arial', 16)
第1个参数是字体名,第2个参数是字号。在正常情况下系统里都有 arial 字体,如果没有会使用默认字体,默认字体和用户使用的系统有关。
用户可以使用 pygame.font.get_fonts()
来获取当前系统所有可用的字体。
另外还有一种调用方法是使用自己的 TTF 字体:my_font = pygame.font.Font('my_font.ttf', 16)
这个方法的好处是可以把字体文件和游戏一起打包分发,避免玩家计算机上没有这个字体而无法显示的问题。一旦有了 Font 对象,就可以使用 render() 方法来设置文本内容,然后通过 blit() 方法写到屏幕上。
text = font1.render("坦克大战", True, (0, 0, 0), (255, 255,255))
render() 方法的第1个参数是写入的文本内容;第2个参数是布尔值,说明是否开启抗锯齿;第3个参数是字体本身的颜色;第4个参数是背景的颜色。如果不想有背景色,也就是让背景透明,可以不加第4个参数。
例如自己定义一个文字处理函数 show_text(), 其中参数 surface_handle 是 surface 句柄,pos 为文字显示位置,corlor 为文字颜色,font_size 为字体大小,font_bold 为文字是否加粗,font_italic 为文字是否斜体。
def show_text(surface_handle, pos, text, color, font_size = 13, font_bold = False, font_italic = False):
# cur_font = pygame.font.SysFont('宋体', font_size) # 获取系统字体
cur_font = pygame.font.Font('simafang.ttf', 30) # 获取字体,并设置大小
cur_font.set_bold(font_bold) # 设置是否加粗
cur_font.set_italic(font_italic) # 设置是否斜体
text_fmt = cur_font.render(text, 1, color) # 设置文本内容
surface_handle.blit(text_fmt, pos) # 绘制文字
在更新窗口内容 pygame.display.update()
之前加入:
text = "坦克大战"
show_text(screen, (20, 220), text, (255, 0, 0), True)
text = "坦克位置:(%d, %d)" % (tank_rect.left, tank_rect.top)
show_text(screen, (20, 420), text, (0, 255, 255), True)
此时会在屏幕的(20,220)处显示红色的“坦克大战”文字,并且在(20,420)显示现在坦克所处位置的座标,移动坦克,位置座标文字随之改变。
完整代码如下:
import pygame
def show_text(surface_handle, pos, text, color, font_size = 20, font_bold = False, font_italic = False):
cur_font = pygame.font.SysFont("华文宋体", font_size)
cur_font.set_bold(font_bold)
cur_font.set_italic(font_italic)
text_message = cur_font.render(text, 1, color)
surface_handle.blit(text_message, pos)
def tank_play():
pygame.init()
tank_image = pygame.image.load(r"../images/tank.png")
tank_rect = tank_image.get_rect()
back_image = pygame.image.load(r"../images/background2.jpg")
back_rect = back_image.get_rect()
screen = pygame.display.set_mode(back_rect.size)
pygame.display.set_caption("用户方向键控制坦克移动")
tank_rect.center = back_rect.center
offset = 2
fps_clock = pygame.time.Clock()
while True:
fps_clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
tank_rect.x += offset
if keys_pressed[pygame.K_LEFT]:
tank_rect.x -= offset
if keys_pressed[pygame.K_UP]:
tank_rect.y -= offset
if keys_pressed[pygame.K_DOWN]:
tank_rect.y += offset
tank_rect.clamp_ip(back_rect)
screen.blit(back_image, back_rect)
screen.blit(tank_image, tank_rect)
text = "坦克大战"
show_text(screen, (20, 220), text, (255, 0, 0))
text = f"坦克位置:({tank_rect.x},{tank_rect.y})"
show_text(screen, (20, 250), text, (0, 255, 255))
pygame.display.update()
if __name__ == '__main__':
tank_play()
程序运行结果如下所示: