Surface简单运用

Surface是Pygame中用于表示图像和画布的基本对象类型,界面的所有内容都是显示在Surface的对象上面的,所以程序至少应该有一个Surface。可以在surface上面再绘制surface,一般将最底层的surface命名为screen。

Surface介绍

Surface的对象使用pygame.Surface((width,height))获取,其方法和属性如下:
属性:

  • width:屏幕的宽度(以像素为单位)。
  • height:屏幕的高度(以像素为单位)。
  • left:屏幕左边缘的 x 坐标。
  • top:屏幕上边缘的 y 坐标。
  • rect:屏幕的矩形表示。

方法:

  • blit():将一个图像或 Surface 对象绘制到当前屏幕上。
  • fill():使用指定的颜色或图像填充屏幕。
  • get_at():返回屏幕上指定位置的像素颜色。
  • get_rect():返回屏幕的矩形表示。
  • set_at():设置屏幕上指定位置的像素颜色。
  • set_clip():设置屏幕的剪辑区域。
  • subsurface():返回屏幕上的一部分,形成一个新的 Surface 对象。

    screen

    通常将pygame.display.set_mode((width,height))返回的对象命名为screen,它是 Pygame 的一个 Surface 对象。界面会默认显示该界面,同时其他surface应该绘制在此界面上进行显示
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import pygame
    import sys

    # 初始化 Pygame
    pygame.init()

    # 创建窗体
    screen = pygame.display.set_mode((400, 300))

    # 游戏循环
    while True:
    # 处理事件
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()

运行结果为:

纯色

pygame库中可以使用预置颜色名称、RGB元组和十六进制(#rrggbb)字符串三种方式设置颜色。
可以使用颜色名称是因为Color模块已经预置了部分颜色,详细的颜色见官方文档。在实际使用时通过pygame.Color('color_name')即可调用。
通过元组的方式颜色的完整形式为(r,g,b,a),其中rgb分别代表红绿蓝、a代表透明度,他们的取值范围都是0255.该形式也可以简写为(r,g,b),忽略透明度参数。
十六进制字符串设置逻辑与简化的元组逻辑相同,格式为#rrggbb,每个通道的值范围为00
ff,需要留意#字符不可少。
代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pygame
import sys

# 初始化 Pygame
pygame.init()

# 创建窗体
screen = pygame.display.set_mode((400, 300))

red_surf=pygame.Surface((50,100))
green_surf=pygame.Surface((50,100))
blue_surf=pygame.Surface((50,100))

red_surf.fill(pygame.Color('Red'))
green_surf.fill((0,255,0))
blue_surf.fill('#0000ff')

screen.blit(red_surf,(50,0))
screen.blit(green_surf,(150,0))
screen.blit(blue_surf,(250,0))

pygame.display.update()
# 游戏循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

效果如图

图片

加载图片作为surface的语法为pygame.image.load('img_Path').convert_alpha(),其中convert_alpha()的作用将图像的每个像素转换为包含Alpha通道的数据。如果不添加convert_alpha(),pygame会将图像视为完全不透明的,即使原始图像中包含Alpha通道信息(即原图有透明部分)。这可能导致在绘制图像时不透明部分没有被正确处理,导致图像渲染有错误或者出现不期望的视觉效果。例如,预期为透明或半透明的部分可能会显示为黑色或其他颜色,或者预期应该是透明的背景部分没有被正确的消除。
图片可以使用transform模块的方法进行变换,例如pygame.transform.rotozoom(surface, angle, zoom)进行选择和缩放,其中各个参数的作用为:

  • surface: 要进行旋转和缩放的 Pygame Surface 对象。
  • angle: 旋转的角度,以度为单位。正值表示顺时针旋转,负值表示逆时针旋转。
  • zoom: 缩放比例。值小于 1.0 表示缩小,大于 1.0 表示放大。

代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pygame
import sys

# 初始化 Pygame
pygame.init()

# 创建窗体
screen = pygame.display.set_mode((400, 300))

imgs_surf=pygame.image.load('graphics/fly.png').convert_alpha()
imgt_surf=pygame.transform.rotozoom(imgs_surf,270,3)

screen.blit(imgs_surf,(50,40))
screen.blit(imgt_surf,(180,90))

pygame.display.update()
# 游戏循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

效果如图

文字

使用文字作为surface的内容需要font对象,获取该对象的语法为Font(file, size),其中 file:表示字体文件的路路径,如果传入 None则使用 Pygame 默认字体; size是一个整数,以磅为单位表示字体的大小。
创建对象时使用font.render(text,antialias,color,backgroup)创建surface对象,其中font为字体类的实例化对象。方法中的参数的作用分别为:text参数为要渲染的文本字符串;antialias参数是一个布尔值,用于指定是否应用抗锯齿;color参数用于设置文本的颜色,使用RGB格式;background参数为RGB格式设置背景颜色,如果未指定或为None则默认背景颜色为(0, 0, 0)。
代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pygame
import sys

# 初始化 Pygame
pygame.init()

t_font=pygame.font.Font('SourceHanSansSC-VF.ttf',40) # 使用默认字体的参数为 None ,该参数可能导致中文无法显示

# 创建窗体
screen = pygame.display.set_mode((400, 300))
text="english,中文,123"
t_surf=t_font.render(text,False,'#ffffff').convert()

screen.blit(t_surf,(60,90))

pygame.display.update()
# 游戏循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

效果如图

surface显示更新

在基础框架中使用了screen.fill()进行绘制、pygame.display.flip()方法进行更新是因为pygame的双缓冲机制需要如此操作。在这个机制中有绘制和显示两个缓冲区。flip()将绘制缓冲区的内容复制到显示缓冲区,从而使得绘制的内容显示在屏幕上。
也可以将 pygame.display.flip() 修改为 pygame.display.update()。两者的作用是类似的,都用于将绘制的内容显示在屏幕上。pygame.display.flip()方法是无参方法,使用时默认更新整个显示的内容;使用pygame.display.update() 方法可以选择性地更新屏幕的特定区域,通过可以传递一个矩形参数,参数表示要更新的区域。