Pygame库学习记录

1 minute read

Published:

在学习强化学习的工程中,需要用到Pygame来搭建自己的虚拟仿真环境,因此记录一下学习过程。 这篇博客主要介绍了Pygame库经常用到的API,方便使用时查找。

Pygame库的介绍

顾名思义,Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来。官方网址:https://www.pygame.org/

Pygame的下载和安装

这是最为轻便的一种安装方式,推荐使用 3.7 以上版本。在终端输入以下命令即可成功安装:

pip install pygame

上述安装方法同样适用于 Linux 和 Mac 操作系统。

Pygame的基本使用

下面是一个简单的 Pygame 程序,如下所示:

#导入所需的模块
import sys
import pygame

# 设置主屏窗口的尺寸
screen_width = 600
screen_height = 400

# 使用pygame之前必须初始化
pygame.init()

# 设置主屏窗口
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置窗口的标题,即游戏名称
pygame.display.set_caption('hello world')

# 引入字体类型
f = pygame.font.Font('simhei.ttf', 50)

# 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑;
# 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色;
text = f.render("贪吃蛇",True,(255, 0, 0),(0, 0, 0))

#获得显示对象的rect区域坐标
textRect =text.get_rect()

# 设置显示对象居中
textRect.center = (screen_width//2, screen_height//2)

# 将准备好的文本信息,绘制到主屏幕 Screen 上。
screen.blit(text,textRect)

# 固定代码段,实现点击"X"号退出界面的功能,几乎所有的pygame都会使用该段代码
while True:
    # 循环获取事件,监听事件状态
    for event in pygame.event.get():
        # 判断用户是否点了"X"关闭按钮,并执行if代码段
        if event.type == pygame.QUIT:
            #卸载所有模块
            pygame.quit()
            #终止程序,确保退出程序
            sys.exit()
    #更新屏幕内容
    pygame.display.flip() 

创建Surface对象

想要掌握 Pygame 的编程逻辑,首先就要理解 surface 对象的概念,它是 Pygame 中最重要的组成部分。

在 Pygame 中,可以把 surface 对象理解成一张“白纸”,通过这张纸可以做许多的事情,比如在纸上添加文字、填充颜色、添加图片以及绘制任意形状的图形等。既然是“纸”就有规格尺寸,Pygame 允许您创建任意大小的纸。

那么我们应该如何创建 Surface 对象呢?Pygame 提供了多种创建 Surface 对象的方法,这里先介绍以下几种方法。

上述示例,使用如下方式创建了一个 surface 对象:

# 也叫screen对象,本质上是一个Surface,大小400*400
screen = pygame.display.set_mode((400,400))

screen 的本质上就是一个 Surface 对象,它是游戏的主窗口,也就是整个游戏中尺寸最大的“纸”,任何其他的 Surface 对象都需要附着在这张最大的“纸”上,比如创建一个包含文本的 Surface 对象,通过以下方法将它绘制在主屏幕上。 如果想创建一个包含图像的 surface 对象可以使用如下方法:

surface_image =pygame.image.load("图片路径") 

gfxdraw

tips: 部分函数如画圆、画椭圆、画扇形、画三角形等会出现锯齿,这时候同时使用画抗锯齿的形状的框和填充该形状可以抗锯齿。

  1. pygame.gfxdraw.pixel(surface, x, y, color) -> None 参数解释: surface: surface对象, x, y: 坐标, color: 颜色(RGB元组) 作用: 画点
  2. pygame.gfxdraw.hline(surface, x1, x2, y, color) -> None 参数解释: surface: surface对象, x1, x2: 坐标, y: 横坐标, color: 颜色(RGB元组) 作用: 画横线
  3. pygame.gfxdraw.vline(surface, x, y1, y2, color) -> None 参数解释: surface: surface对象, x: 坐标, y1, y2: 纵坐标, color: 颜色(RGB元组) 作用: 画竖线
  4. pygame.gfxdraw.line(surface, x1, y1, x2, y2, color) -> None 参数解释: surface: surface对象, x1, y1, x2, y2: 坐标, color: 颜色(RGB元组) 作用: 画直线
  5. pygame.gfxdraw.rectangle(surface, rect, color) -> None 参数解释: surface: surface对象, rect: 矩形(如[(0,0), (20,20)]), color: 颜色(RGB元组) 作用: 画矩形框
  6. pygame.gfxdraw.box(surface, rect, color) -> None 参数解释: surface: surface对象, rect: 矩形(如[(0,0), (20,20)]), color: 颜色(RGB元组) 作用: 画填充的矩形
  7. pygame.gfxdraw.aacircle(surface, x, y, r, color) -> None 参数解释: surface: surface对象, x, y: 圆心坐标, r: 半径, color: 颜色(RGB元组) 作用: 画抗锯齿的圆
  8. pygame.gfxdraw.filled_circle(surface, x, y, r, color) -> None 参数解释: surface: surface对象, x, y: 圆心坐标, rx, ry: 圆的宽高, color: 颜色(RGB元组) 作用: 画填充的圆
  9. pygame.gfxdraw.aaellipse(surface, x, y, rx, ry, color) -> None 参数解释: surface: surface对象, x, y: 圆心坐标, rx, ry: 椭圆的x, y轴半径, color: 颜色(RGB元组) 作用: 画抗锯齿的椭圆
  10. pygame.gfxdraw.filled_ellipse(surface, x, y, rx, ry, color) -> None 参数解释: surface: surface对象, x, y: 圆心坐标, rx, ry: 椭圆的x, y轴半径, color: 颜色(RGB元组) 作用: 画填充的椭圆