Python学习笔记34:进阶篇(二十三)pygame的使用之颜色与字体

前言

基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。

我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。

私信我发送消息python资料,领取python crash course中文版PDF。

pygame

Pygame是一个开源的Python多媒体开发库,专门用于开发2D游戏。它是Python编程语言的一个扩展,基于 SDL (Simple DirectMedia Layer) 库,提供了丰富的功能来处理图形、声音、事件处理等游戏开发所需的基本要素,使得创建游戏变得更加简单直接。

字体颜色

字体颜色其实是两个模块,但是两个模块的内容都不多,一起记录一下。

pygame.Color

pygame.Color模块在Pygame中用于处理颜色。它提供了颜色对象的创建、操作和转换。color对象基本能在pygame中使用颜色的地方进行使用。

基础用法
import pygame
pygame.init()

screen = pygame.display.set_mode((1200, 800))
pygame.display.set_caption('Draw Shapes')

# 绘制一个填充的红色矩形,直接填写RGB
pygame.draw.rect(screen, (255, 0, 0), (50, 50, 100, 100))
# 定义一个颜色对象,颜色为蓝色
blue = pygame.Color(0, 0, 255)
# 绘制一个未填充的蓝色矩形
pygame.draw.rect(screen, blue, (50, 150, 100, 100), 3)
# 更新屏幕显示
pygame.display.flip()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

ps: 开始和结束的代码都没写备注,相信大家看起来也没有压力。

在这里插入图片描述

这是正规的创建一个颜色对象并使用的案例,因为我们创建的颜色对象中是使用RGB的值进行定义的,实际上我们使用CSS标准颜色名称,RGBA值或者十六进制字符串也可以创建一个颜色对象。

其他用法
import pygame
pygame.init()

screen = pygame.display.set_mode((1200, 800))
pygame.display.set_caption('Draw Shapes')

# 绘制一个填充的红色矩形,直接填写颜色通道
pygame.draw.rect(screen, (255, 0, 0), (50, 50, 100, 100))

# 定义一个颜色对象,颜色为蓝色
blue = pygame.Color(0, 0, 255)
pygame.draw.rect(screen, blue, (150, 50, 100, 100), 3)

# 前三位是RGB的值,最后一个255则是透明度取值也是0-255
blue_alpha = pygame.Color(0, 0, 255, 255)
pygame.draw.rect(screen, blue_alpha, (150, 150, 100, 100), 3)

# CSS定义一个颜色对象,颜色为绿色
green = pygame.Color('green')
# 绘制一个未填充的蓝色矩形
pygame.draw.rect(screen, green, (250, 50, 100, 100), 3)

# 十六进制
pink = pygame.Color('#FFC0CB')
pygame.draw.rect(screen, pink, (350, 50, 100, 100), 3)

# 更新屏幕显示
pygame.display.flip()

# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

在这里插入图片描述

从代码和执行结果就能看到,实心红色正方形是不创建color对象绘制的图形。后面开始就是RGB,GRBA绘制(放一起上下对比),使用CSS值绘制和最后的使用十六进制字符串的形式绘制,怎么使用按自己喜好就行。

颜色模块主要就是能灵活的创建一个颜色对象去使用,还有其他一些零碎的函数这里不多讲。用的到时候再学习也不迟,我们还没有开始正式实际写完整的项目,这些背太多我个人觉得不是好事。

pygame.font

pygame.font 模块是 Pygame 中用于处理文本渲染的部分。它允许你从系统字体或自定义字体文件创建字体对象,并使用这些对象来渲染文本为图像,以便在游戏中显示。

这个能干嘛就不用我多说了吧。

基础用法
  1. pygame.font.Font(fontfile, size)
    • 功能: 创建一个 Font 对象,可以从文件或系统字体加载。
    • 参数:
      • fontfile (str): 字体文件的路径。如果设置为 None,则使用默认的系统字体。
      • size (int): 字体的大小。
    • 返回值: Font 对象。
  2. Font.render(text, antialias, color, background=None)
    • 功能: 将文本渲染为一个 Surface 对象。
    • 参数:
      • text (str): 要渲染的文本。
      • antialias (bool): 是否使用抗锯齿。
      • color (Color 或 tuple): 文本的颜色。
      • background (Color 或 tuple): 背景颜色,默认为透明。
    • 返回值: Surface 对象,包含了渲染后的文本。

光创建一个字体看不出啥,必须生成一个Surface 对象才能渲染出来,所以两个函数一起使用。使用粉色和默认字体渲染了Hello, Pygame!这句话,具体请看代码。

import pygame

pygame.init()

# 设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 字体颜色
pink = pygame.Color('#FFC0CB')
# 使用默认字体创建一个字体对象
font = pygame.font.Font(None, 32)
text_surface = font.render("Hello, Pygame!", True, pink)

# 填充背景
screen.fill((255, 255, 255))

# 绘制文本
screen.blit(text_surface, (10, 10))

# 更新显示
pygame.display.flip()

# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

在这里插入图片描述

  1. pygame.font.SysFont(name, size, bold=False, italic=False)
    • 功能: 创建一个 Font 对象,从系统字体中加载。
    • 参数:
      • name (str): 系统字体的名称。
      • size (int): 字体的大小。
      • bold (bool): 是否使用粗体样式。
      • italic (bool): 是否使用斜体样式。
    • 返回值: Font 对象。
      这个函数比Font()函数好在可以任意使用系统中其他字体,在你没有自定义字体或者不想使用默认字体的时候,就可以使用这个。
--snip--
# 字体颜色
pink = pygame.Color('#FFC0CB')
# 使用Arial字体创建一个字体对象,32号,加粗,倾斜
font = arial_bold = pygame.font.SysFont('Arial', 32, bold=True, italic=True)
text_surface = font.render("Hello, Pygame!", True, pink)
--snip--

a4e2dd9c2.png)

这里我们就使用了新的系统字体Arial,设置了字体大小32,并且加粗倾斜。

  1. pygame.font.get_fonts()
    • 功能: 返回系统中所有可用字体的名称列表。
    • 参数: 无
    • 返回值: 字符串列表,包含系统字体名称

瞌睡来了就有枕头,我不知道系统有哪些字体怎么办? 用这个函数。

fonts = pygame.font.get_fonts()
for font in pygame.font.get_fonts():
    print(font)

print(len(fonts))

在这里插入图片描述
一共89种,有兴趣的可以自己试试。

  1. pygame.font.Font.size(text)
    • 功能: 返回给定文本在指定字体下的尺寸。
    • 参数:
      • text (str): 文本字符串。
    • 返回值: 一个包含宽度和高度的元组。
# 使用Arial字体创建一个字体对象,32号,加粗,倾斜
font = arial_bold = pygame.font.SysFont('Arial', 32, bold=True, italic=True)
width, height = font.size("Hello, Pygame!")
print(f'Text size: {width}x{height}')

在这里插入图片描述

  1. pygame.font.Font.get_rect(text, width=0, height=0)
    • 功能: 返回一个 Rect 对象,用于定位和对齐文本。
    • 参数:
      • text (str): 文本字符串。
      • width (int): 定位区域的宽度。
      • height (int): 定位区域的高度。
    • 返回值: Rect 对象,可用于定位和对齐文本。

这个函数的作用,就是把你的文字渲染到指定的位置去,不然像例子中,永远在左上角。

import pygame

pygame.init()

# 设置窗口尺寸
screen = pygame.display.set_mode((800, 600))

# 字体颜色
pink = pygame.Color('#FFC0CB')

# 使用Arial字体创建一个字体对象,32号,加粗,倾斜
font = arial_bold = pygame.font.SysFont('Arial', 32, bold=True, italic=True)

# 渲染文本
text_surface = font.render("Hello, Pygame!", True, pink)

# 获取文件的矩形区域
text_rect = text_surface.get_rect()

# 设置文本的顶部居中位置
text_rect.midtop = (screen.get_width() // 2, 10)

# 填充背景
screen.fill((255, 255, 255))

# 绘制文本
screen.blit(text_surface, text_rect)

# 更新显示
pygame.display.flip()

# 点击关闭退出程序,这个后面再讲,代码可以先写上。
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

在这里插入图片描述

这样一来,字体就可以在窗口中随意的设定位置了。

结尾

颜色字体通常会一起使用,通过两个模块的组合使用,我们可以在游戏中设定各种颜色的字体并将它们放置在合适的位置,颜色也有和图形绘制一起的使用的时候,比如收到攻击是屏幕红框警告就可以这样编写。

总而言之,熟练掌握应用颜色字体模块对我们编写小游戏还是很重要的,要多尝试几遍,熟悉常用的几个函数。

作业

  1. 创建9个字体,使用9中颜色分别渲染,最后放置在左上角,顶部居中,右上角,左部居中,窗口居中,右部居中,左下角,底部居中,右下角等九个位置上。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 00:10:04       6 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 00:10:04       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 00:10:04       4 阅读
  4. Python语言-面向对象

    2024-07-11 00:10:04       8 阅读

热门阅读

  1. 【AI工具】— 文心一言

    2024-07-11 00:10:04       14 阅读
  2. AWS IoT Core 权限管理指南

    2024-07-11 00:10:04       10 阅读
  3. 选择结构作业题(五.2)

    2024-07-11 00:10:04       11 阅读
  4. Vue 3 组件通信全解:从基础到高级技巧

    2024-07-11 00:10:04       10 阅读
  5. android gradle开发基础

    2024-07-11 00:10:04       8 阅读
  6. 排序算法_冒泡排序

    2024-07-11 00:10:04       7 阅读
  7. std::deque和std::list的区别是什么

    2024-07-11 00:10:04       8 阅读