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 | import pygame |
运行结果为:
纯色
pygame库中可以使用预置颜色名称、RGB元组和十六进制(#rrggbb)字符串三种方式设置颜色。
可以使用颜色名称是因为Color模块已经预置了部分颜色,详细的颜色见官方文档。在实际使用时通过pygame.Color('color_name')即可调用。
通过元组的方式颜色的完整形式为(r,g,b,a),其中rgb分别代表红绿蓝、a代表透明度,他们的取值范围都是0255.该形式也可以简写为ff,需要留意(r,g,b),忽略透明度参数。
十六进制字符串设置逻辑与简化的元组逻辑相同,格式为#rrggbb,每个通道的值范围为00#字符不可少。
代码示例如下:
1 | import pygame |
效果如图 
图片
加载图片作为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 | import pygame |
效果如图
文字
使用文字作为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 | import pygame |
效果如图
surface显示更新
在基础框架中使用了screen.fill()进行绘制、pygame.display.flip()方法进行更新是因为pygame的双缓冲机制需要如此操作。在这个机制中有绘制和显示两个缓冲区。flip()将绘制缓冲区的内容复制到显示缓冲区,从而使得绘制的内容显示在屏幕上。
也可以将 pygame.display.flip() 修改为 pygame.display.update()。两者的作用是类似的,都用于将绘制的内容显示在屏幕上。pygame.display.flip()方法是无参方法,使用时默认更新整个显示的内容;使用pygame.display.update() 方法可以选择性地更新屏幕的特定区域,通过可以传递一个矩形参数,参数表示要更新的区域。