Pygame - 快速指南


Pygame - 概述

Pygame 是一个流行的 Python 库,用于开发视频游戏。它是简单 DirectMedia 库 (SDL) 的免费、开源和跨平台包装。Pygame 提供的 SDL 函数的抽象使得使用 Python 开发多媒体应用程序变得非常容易。

Pygame 最初由 Peter Shinners、Lenard Lindstrom、René Dudfield 等人于 2000 年 10 月开发,最新版本为 2.0.1,于 2020 年 12 月发布。除了 SDL 功能外,Pygame 还提供其他功能,例如向量数学、碰撞检测、 Pygame 应用程序也可以在基于 Android 的手机上使用。

环境设置

在任何机器上安装 Pygame 最简单的方法是使用标准 Python 发行版附带的 PIP 安装程序。确保您拥有最新版本的 pip。建议使用以下命令在新的虚拟环境中安装 Pygame -

pip3 install pygame

对于 Raspberri Pi,Pygame 预装在 raspbian Linus 发行版中。就 MacOS 上的安装而言,较新的版本需要 Pygame 2.0。预构建的二进制包可用于多种 Linux 版本。可以使用各自的包管理器实用程序安装它们。

对于 Ubuntu,以下是命令 -

sudo apt-get install pygame

对于 Fedora,命令如下:

sudo yum install pygame

还可以编译 Pygame 的源代码(可在https://github.com/pygame/pygame 获取)并借助相应的 C/C++ 编译器和 Python 的setuptools库安装在所需的操作系统上。

要验证 Pygame 是否已成功安装,请尝试导入 pygame 包并检查其版本。

(pygmenv) C:\pygmenv>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.7.4) 
Hello from the pygame community. https://www.pygame.org/contribute.html

Pygame 库由以下模块组成 -

pygame._sdl2.touch 使用触摸输入
pygame.camera 相机使用
pygame.cdrom 音频CDROM控制
pygame.游标 游标资源
pygame.display 控制显示窗口和屏幕
pygame.draw 绘制形状
pygame.事件 与事件和队列交互
pygame.examples 示例程序模块
pygame.fastevent 与来自多个线程的事件和队列交互。
pygame.字体 加载和渲染字体
pygame.freetype 加载和渲染计算机字体
pygame.gfxdraw 绘制形状
pygame.image 图像传输
pygame.操纵杆 与操纵杆、游戏手柄和轨迹球进行交互。
pygame.key 使用键盘
pygame.locals pygame 常量
pygame.mask 图像蒙版。
pygame.数学 向量类
pygame.midi 与 MIDI 输入和输出交互。
pygame.mixer 加载和播放声音
pygame.mixer.音乐 控制流音频
pygame.鼠标 使用鼠标工作
pygame.pixelcopy 通用像素阵列复制
pygame.scrap 剪贴板支持。
pygame.sndarray 访问声音样本数据
pygame.sprite 基本游戏对象类
pygame.surfarray 使用数组接口访问表面像素数据
pygame.测试 单元测试套件包
pygame.time 监控时间
pygame.transform 变换表面

Pygame - 你好世界

第一步是在 init() 函数的帮助下导入并初始化 pygame 模块。

import pygame
pygame.init()

我们现在设置首选大小的 Pygame 显示窗口,并给它一个标题。

screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Hello World")

这将渲染一个需要放入无限事件循环中的游戏窗口。所有由用户交互(例如鼠标移动和单击等)生成的事件对象都存储在事件队列中。当 pygame.QUIT 被拦截时,我们将终止事件循环。当用户单击标题栏上的关闭按钮时生成此事件。

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

显示带有 Hello World 标题的 Pygame 窗口的完整代码如下 -

import pygame, sys

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Hello World")
while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         sys.exit()

将上面的脚本保存为 hello.py 并运行以获取以下输出 -

你好世界

仅当单击关闭 (X) 按钮时才会关闭此窗口。

Pygame - 显示模式

如上面的示例所示,显示表面是由 pygame.display 模块中定义的 set_mode() 函数创建的。

pygame.display.set_mode(size, flags, depth, display, vsync)

尺寸参数是以像素为单位的宽度和高度的元组。如果未设置大小,则表面将具有当前分辨率的大小。

flags 参数控制由以下预定义常量表示的显示类型 -

pygame.全屏 创建全屏显示
pygame.DOUBLEBUF 推荐用于 HWSURFACE 或 OPENGL
pygame.HWSURFACE 硬件加速,仅在全屏模式下
pygame.OPENGL 创建可 OpenGL 渲染的显示
pygame.RESIZABLE 显示窗口应该足够大
pygame.NOFRAME 显示窗口将没有边框或控件
pygame.SCALED 分辨率取决于桌面尺寸和图形比例
pygame.显示 窗口以可见模式打开(默认)
pygame.隐藏 窗口以隐藏模式打开

如果 vsync 参数设置为 1,则有可能获得垂直同步的显示,但不能保证获得垂直同步。该请求仅适用于设置了 pygame.OPENGL 或 pygame.SCALED 标志的 set_mode() 调用。

显示索引 0 表示使用默认显示。深度参数将默认为系统的最佳和最快颜色深度。对于给定的宽度和高度,Pygame 将从 list_modes() 中选择可用的最佳模式。

>>> print (pygame.display.list_modes())
[(1366, 768), (1360, 768), (1280, 768), (1280, 720), (1024, 768), (800, 600), (640, 480)]

pygame.display.mode_ok()

此功能选择显示模式的最佳颜色深度。它用于确定请求的显示模式是否可用。如果无法设置显示模式则返回0。否则,它将返回最符合显示要求的像素深度。

pygame.display.update()

此功能将更新整个显示屏的内容。

Pygame - 本地模块

该模块包含 Pygame 应用程序中经常使用的各种常量的定义。虽然这些常量是在各自的模块中定义的,但从 locals 模块中使用它们变得更容易。

例如,按键或鼠标事件(例如 KEYDOWN 或 MOUSEBUTTONDOWN)分别定义为 pygame.key.KEYDOWN 或 pygame.mouse.MOUSEBUTTON,可以通过从 locals 模块导入来使用这些常量,而无需限定模块名称。

在这里,我们使用 locals 模块中的 QUIT 事件。

import pygame,sys
from pygame.locals import *
pygame.init()
canvas=pygame.display.set_mode((400,300))
pygame.display.set_caption("Hello")
canvas.fill((0,0,0))
while True:
   for event in pygame.event.get():
      if(event.type == QUIT):
         pygame.quit()
            sys.exit(1)

Pygame - 颜色对象

Pygame 中的 Color 类用于表示屏幕背景、文本、形状和所有其他 Pygame 对象的颜色。它通过传递红色、绿色、蓝色的颜色值和可选的表示不透明值的 alpha 值来构造。每个值的范围都在 0 到 255 之间。

color = pygame.Color(r, g, b, a=255)

Alpha 的默认值为 255,表示完全不透明。各个属性都是可访问和设置的。

pygame.Color.r 获取或设置 Color 的红色值。
pygame.Color.g 获取或设置 Color 的绿色值。
pygame.Color.b 获取或设置 Color 的蓝色值。
pygame.Color.a 获取或设置 Color 的 alpha 值。

也可以使用 CMY、HSVA、HSLA 和 i1i2i3 等替代颜色模型。

pygame.Color.cmy 获取或设置 Color 的 CMY 表示形式。青色、洋红色、黄色
pygame.Color.hsva 获取或设置 Color 的 HSVA 表示形式。色相、饱和度、明度
pygame.Color.hsla 获取或设置 Color 的 HSLA 表示形式。色相、饱和度、明度
pygame.Color.i1i2i3 获取或设置 Color 的 I1I2I3 表示形式。

我们可以使用预定义的字符串常量来表示 RGBA 颜色组合。下面列出了一些预定义的颜色 -

  • ‘黑色’: (0, 0, 0, 255)
  • '蓝色': (0, 0, 255, 255),
  • '青色': (0, 255, 255, 255),
  • “黄金”:(255, 215, 0, 255),
  • “灰色”:(190, 190, 190, 255),
  • '绿色': (0, 255, 0, 255),
  • “橙色”:(255, 165, 0, 255),
  • ‘紫色’: (160, 32, 240, 255),
  • ‘红色’: (255, 0, 0, 255),
  • “紫罗兰色”:(238, 130, 238, 255)
  • ‘黄色’: (255, 255, 0, 255),
  • “白色”:(255, 255, 255, 255)

要获取所有预定义的颜色,请运行以下 for 循环 -

for k, v in THECOLORS.items():
   THECOLORS[unicode_(k)] = v

Pygame - 事件对象

所有事件都是 pygame.event.EventType 类的实例。Pygame 识别以下事件类型 -

事件类型 属性
辞职 没有任何
活动活动 增益、状态
按键按下 unicode、密钥、mod
键盘 钥匙, 模组
鼠标移动 pos、rel、按钮
鼠标按钮向上 位置、按钮
鼠标按下按钮 位置、按钮
欢乐轴运动 喜悦、轴心、价值
欢乐球运动 快乐, 球, rel
欢乐运动 喜悦、帽子、价值
欢乐按钮 喜悦, 按钮
欢乐按钮按下 喜悦, 按钮
视频大小 尺寸、宽、高
视频曝光 没有任何
用户事件 代码

Pygame - 键盘事件

Pygame 识别 KEYUP 和 KEYDOWN 事件。pygame.key 模块定义了对于处理键盘交互有用的函数。当按键被按下和释放时,pygame.KEYDOWN 和 pygame.KEYUP 事件被插入到事件队列中。key 属性是一个整数 ID,代表键盘上的每个键。

import pygame, sys
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Hello World")
while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         sys.exit()
      if event.type == pygame.KEYDOWN:
         key=pygame.key.name(event.key)
         print (key, "Key is pressed")
      if event.type == pygame.KEYUP:
         key=pygame.key.name(event.key)
         print (key, "Key is released")

运行上面的代码并在 Pygame 窗口处于活动状态时按各个键。以下是 Python 控制台上的示例输出。

q Key is pressed
q Key is released
right shift Key is released
1 Key is pressed
1 Key is released
enter Key is pressed
enter Key is released
backspace Key is pressed
backspace Key is released
x Key is pressed
x Key is released 
home Key is pressed
home Key is released
f1 Key is pressed
f1 Key is released
left Key is pressed
left Key is released
right Key is pressed
right Key is released
up Key is pressed
up Key is released
down Key is pressed
down Key is released

正如我们所看到的,event.key 属性返回与每个键关联的唯一标识符。左、右、上、下方向键在游戏中经常使用。如果检测到特定的按键,我们可以纠正适当的逻辑。

下面列出了 pygame.key 模块中的其他有用属性 -

pygame.key.get_pressed 获取所有键盘按钮的状态
pygame.key.get_mods 确定正在按住哪些修饰键
pygame.key.set_repeat 控制如何重复按住的按键
pygame.key.get_repeat 查看按住的按键如何重复
pygame.key.name 获取密钥标识符的名称
pygame.key.key_code 从密钥名称获取密钥标识符
pygame.key.start_text_input 开始处理 Unicode 文本输入事件
pygame.key.stop_text_input 停止处理 Unicode 文本输入事件

Pygame - 鼠标事件

Pygame 识别三个鼠标事件,即 MOUSEMOTION、MOUSEBUTTONUP 和 MOUSEBUTTONDOWN。相应的事件对象返回鼠标按下/释放位置的坐标以及按钮编号。

例如,MOUSEBUTTONDOWN 事件对象将显示以下结果 -

<Event(1025-MouseButtonDown {'pos': (398, 328), 'button': 1, 'window': None})>

例子

要获取按钮按下位置的坐标,我们可以使用与事件对象关联的 get_pos() 函数。

import pygame, sys

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Hello World")
while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         sys.exit()
      if event.type == pygame.MOUSEBUTTONDOWN:
         pos=pygame.mouse.get_pos()
         btn=pygame.mouse
         print ("x = {}, y = {}".format(pos[0], pos[1]))

输出

运行上面的代码并在游戏窗口的随机位置按下鼠标按钮。

x = 192, y = 160
x = 419, y = 245
x = 204, y = 405
x = 449, y = 17
x = 12, y = 15

MOUSEMOTION 事件对象捕获移动鼠标位置的瞬时位置。

if event.type == pygame.MOUSEMOTION:
   pos=event.pos 
   print ("x = {}, y = {}".format(pos[0], pos[1]))

pygame.mouse 模块中的其他重要函数和属性如下 -

pygame.key.get_pressed 获取鼠标按钮的状态
pygame.mouse.get_pos 获取鼠标光标位置
pygame.mouse.get_rel 获取鼠标移动量
pygame.mouse.set_pos 设置鼠标光标位置
pygame.mouse.set_visible 隐藏或显示鼠标光标
pygame.mouse.get_visible 获取鼠标光标当前的可见状态
pygame.mouse.get_focused 检查显示器是否正在接收鼠标输入
pygame.mouse.set_cursor 设置鼠标光标的图像
pygame.mouse.set_system_cursor 将鼠标光标设置为系统变体

Pygame 定义了以下系统光标 -

pygame.SYSTEM_CURSOR_ARROW
pygame.SYSTEM_CURSOR_IBEAM 工字钢
pygame.SYSTEM_CURSOR_WAIT 等待
pygame.SYSTEM_CURSOR_CROSSHAIR 十字线
pygame.SYSTEM_CURSOR_SIZENWSE 指向西北和东南的双箭头
pygame.SYSTEM_CURSOR_SIZENESW 指向东北和西南的双箭头
pygame.SYSTEM_CURSOR_SIZEWE 指向西和东的双箭头
pygame.SYSTEM_CURSOR_SIZENS 指向北和南的双箭头
pygame.SYSTEM_CURSOR_SIZEALL 四向箭头
pygame.SYSTEM_CURSOR_NO 斜切圆或交叉骨
pygame.SYSTEM_CURSOR_HAND

以下语句将游戏窗口光标设置为十字准线。

pygame.mouse.set_system_cursor(pygame.SYSTEM_CURSOR_CROSSHAIR)

Pygame - 绘制形状

使用 pygame.draw 模块中的函数可以在游戏窗口上绘制不同的形状,例如矩形、圆形、椭圆形、多边形和直线 -

画一个矩形 矩形(表面、颜色、矩形)
画一个多边形 多边形(曲面、颜色、点)
画一个圆圈 圆(表面、颜色、圆心、半径)
画一个椭圆 椭圆(曲面、颜色、矩形)
画一条椭圆弧 弧(表面、颜色、矩形、起始角度、停止角度)
画一条直线 线(表面、颜色、起始位置、结束位置、宽度)

例子

以下示例使用这些函数来绘制不同的形状 -

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
white = (255,255,255)
while not done:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         done = True
   pygame.draw.rect(screen, red, pygame.Rect(100, 30, 60, 60))
   pygame.draw.polygon(screen, blue, ((25,75),(76,125),(275,200),(350,25),(60,280)))
   pygame.draw.circle(screen, white, (180,180), 60)
   pygame.draw.line(screen, red, (10,200), (300,10), 4)
   pygame.draw.ellipse(screen, green, (250, 200, 130, 80)) 
   pygame.display.update()

输出

不同的形状

如果函数中添加可选的整数参数,则将以指定颜色作为轮廓颜色绘制形状。数字对应于形状内部轮廓的厚度和背景颜色。

pygame.draw.rect(screen, red, pygame.Rect(100, 30, 60, 60),1)
pygame.draw.circle(screen, white, (180,180), 60,2)
pygame.draw.ellipse(screen, green, (250, 200, 130, 80),5)

输出

不同形状

Pygame - 加载图像

pygame.image 模块包含从文件或类似文件的对象加载和保存图像的函数。图像作为 Surface 对象加载,最终在 Pygame 显示窗口上呈现。

首先我们通过load()函数获取一个Surface对象。

img = pygame.image.load('pygame.png')

接下来,我们从该 Surface 中获取一个矩形对象,然后使用 Surface.blit() 函数来渲染图像 -

rect = img.get_rect()
rect.center = 200, 150
screen.blit(img, rect)

例子

在显示窗口上显示 Pygame 徽标的完整程序如下 -

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
img = pygame.image.load('pygame.png')
done = False
bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      rect = img.get_rect()
      rect.center = 200, 150
      screen.blit(img, rect)
      if event.type == pygame.QUIT:
      done = True
   pygame.display.update()

输出

上述代码的输出如下 -

展示窗

blit ()函数可以采用可选的特殊标志参数,该参数具有以下值之一 -

BLEND_RGBA_ADD
BLEND_RGBA_SUB
BLEND_RGBA_MULT
BLEND_RGBA_MIN
BLEND_RGBA_MAX
BLEND_RGB_ADD
BLEND_RGB_SUB
BLEND_RGB_MULT
BLEND_RGB_MIN
BLEND_RGB_MAX

pygame.Surface模块还有一个convert()函数,它可以优化图像格式并使绘图速度更快。

pygame.image 模块有一个 save() 函数,可将 Surface 对象的内容保存到图像文件。Pygame 支持以下图像格式 -

加载图像格式 保存图像格式

JPG

巴布亚新几内亚

GIF(非动画)

骨形态发生蛋白

电脑X

TGA(未压缩)

TIF

LBM(和 PBM)

PBM(以及 PGM、PPM)

XPM

骨形态发生蛋白

热重分析

巴布亚新几内亚

JPEG

例子

以下程序在显示表面上绘制三个圆圈,并使用 image.save() 函数将其保存为 Circles.png 文件。

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
white=(255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)

bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      if event.type == pygame.QUIT:
         done = True
      pygame.draw.circle(screen, red, (200,150), 60,2)
      pygame.draw.circle(screen, green, (200,150), 80,2)
      pygame.draw.circle(screen, blue, (200,150), 100,2)
   pygame.display.update()
   pygame.image.save(screen, "circles.png")

输出

圆圈窗口

Pygame - 在窗口中显示文本

要在 Pygame 窗口上显示文本,我们需要首先借助 pygame.font 模块中定义的 SysFont() 函数获取字体对象。

Fnt= SysFont(name, size, bold=False, italic=False)

通过 get_fonts() 函数可以获取当前机器安装的字体列表。

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

让我们定义一个表示 36 点大小的 Arial 字体的字体对象。

font = pygame.font.SysFont("Arial", 36)

接下来,我们获得一个新的 Surface 对象,用于使用 Font 对象的 render() 方法以新创建的字体渲染 Hello World 文本。

txtsurf = font.render("Hello, World", True, white)

第一个参数是单行字符串,第二个参数表示抗锯齿。如果设置为 False,则渲染图像为 8 位图像,如果为 true,则渲染图像为 24 位。还可以使用可选的背景颜色参数。

我们现在需要将文本 Surface 块传输到屏幕窗口的中心。

screen.blit(txtsurf,(200 - txtsurf.get_width() // 2, 150 - txtsurf.get_height() // 2))

例子

以下是完整的代码 -

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
white=(255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)

bg = (127,127,127) 
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      if event.type == pygame.QUIT:
         done = True
      font = pygame.font.SysFont("Arial", 36)
   txtsurf = font.render("Hello, World", True, white)
   screen.blit(txtsurf,(200 - txtsurf.get_width() // 2, 150 - txtsurf.get_height() // 2))
pygame.display.update()

输出

表面

除了 SysFont() 方法之外,还可以从字体文件(具有 .ttf 扩展名)或指向 ttf 文件的 Python 文件对象获取 Font 对象。还可以使用 .ttc 文件构建字体对象。字体类定义了以下方法 -

大胆的() 获取或设置字体是否应以粗体呈现。
斜体() 获取或设置字体是否应以斜体呈现。
强调() 获取或设置字体是否应带有下划线。
使成为() 在新 Surface 上绘制文本
尺寸() 计算渲染文本所需的大小
设置下划线() 控制文本是否带有下划线
获取下划线() 检查文本是否会带有下划线
设置粗体() 启用粗体文本的假渲染
获取粗体() 检查文本是否会呈现为粗体
设置斜体() 启用斜体文本的假渲染
指标() 获取每个角色的指标
获取斜体() 检查文本是否会呈现斜体
获取线尺寸() 获取字体文本的行距
获取高度() 获取字体的高度
获取上升() 获取字体的上升度
get_descent() 获取字体的下降

下面给出了使用 ttf 和 ttc 文件渲染文本的示例。

font1 = pygame.font.SysFont('chalkduster.ttf', 72)
img1 = font1.render('Hello World', True, BLUE)
font2 = pygame.font.SysFont('didot.ttc', 72)
img2 = font2.render('Hello Pygame', True, GREEN)

screen.blit(img1, (20, 50))
screen.blit(img2, (20, 120))
pygame.display.update()

在上面的示例中,预定义的字符串已被渲染为表面对象。但是,可以读取 KEYDOWN 事件的键值以交互方式输入字符串并显示它。

首先,我们渲染一个空字符串。接下来,我们定义边界矩形,然后定义一个与文本边界矩形重叠的光标矩形。KEYDOWN 事件中标识的每个击键都会附加到原始空字符串并重复呈现。

例子

以下代码最初显示一个空白窗口。按下的每个字母都会并排显示。

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
white=(255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)

bg = (127,127,127)
text=""
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      if event.type == pygame.QUIT:
         done = True
      if event.type == pygame.KEYDOWN:
         text=text+event.unicode
      font = pygame.font.SysFont("Arial", 36)
      img = font.render(text, True, white)
      rect = img.get_rect()
      cursor = pygame.Rect(rect.topright, (3, rect.height))
      img = font.render(text, True, white)
      rect.size=img.get_size()
      cursor.topleft = rect.topright
      screen.blit(img,(200 - img.get_width() // 2, 150 - img.get_height() // 2))
   pygame.display.update()

输出

运行上面的代码并输入一些文本。示例输出如下 -

Pygame - 移动图像

物体的移动是任何计算机游戏的一个重要方面。计算机游戏通过在增量位置绘制和擦除对象来创建运动错觉。以下代码通过在事件循环中增加 x 坐标位置并用背景颜色擦除它来绘制图像。

例子

image_filename = 'pygame.png'
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300), 0, 32)
pygame.display.set_caption("Moving Image")
img = pygame.image.load(image_filename)
x = 0
while True:
   screen.fill((255,255,255))
   for event in pygame.event.get():
      if event.type == QUIT:
         exit()
   screen.blit(img, (x, 100))
   x= x+0.5

   if x > 400:
      x = x-400
   pygame.display.update()

输出

Pygame 徽标图像开始显示在左边框并反复向右移动。如果到达右边界,则其位置重置为左边界。

增量位置

在下面的程序中,图像首先显示在 (0,150) 位置。当用户按下箭头键(左、右、上、下)时,图像的位置会改变 5 个像素。如果发生 KEYDOWN 事件,程序将检查键值是否为 K_LEFT、K_RIGHT、K_UP 或 K_DOWN。如果 x 坐标为 K_LEFT 或 K_RIGHT,则 x 坐标将更改 +5 或 -5。如果键值为 K_UP 或 K_DOWN,则 y 坐标的值会更改 -5 或 +5。

image_filename = 'pygame.png'
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("Moving with arrows")
img = pygame.image.load(image_filename)
x = 0
y= 150
while True:
   screen.fill((255,255,255))
   screen.blit(img, (x, y))
   for event in pygame.event.get():
      if event.type == QUIT:
         exit()

      if event.type == KEYDOWN:
         if event.key == K_RIGHT:
            x= x+5
         if event.key == K_LEFT:
            x=x-5
         if event.key == K_UP:
            y=y-5
         if event.key == K_DOWN:
            y=y+5
         pygame.display.update()

Pygame - 使用数字键盘移动

如果我们想在游戏窗口上实现对象的对角线移动,我们需要使用数字键盘按键。4、6、8、2 键对应左、右、上、下箭头,而数字键 7、9、3、1 可用于左上、右上、右下、下移动对象-左对角线运动。这些键由 Pygame 使用以下值标识 -

K_KP1       keypad 1
K_KP2       keypad 2
K_KP3       keypad 3
K_KP4       keypad 4
K_KP5       keypad 5
K_KP6       keypad 6
K_KP7       keypad 7
K_KP8       keypad 8
K_KP9       keypad 9

例子

对于左、右、上、下箭头按下,x 和 y 坐标会像以前一样递增/递减。对于对角线移动,两个坐标都会根据方向发生变化。例如,对于 K_KP7 按键,x 和 y 均减 5,对于 K_KP9,x 递增,y 递减。

image_filename = 'pygame.png'
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("Moving with arrows")
img = pygame.image.load(image_filename)
x = 0
y= 150
while True:
   screen.fill((255,255,255))
   screen.blit(img, (x, y))
   for event in pygame.event.get():
      if event.type == QUIT:
         exit() 
      if event.type == KEYDOWN:
         if event.key == K_KP6:
            x= x+5
         if event.key == K_KP4:
            x=x-5
         if event.key == K_KP8:
            y=y-5
         if event.key == K_KP2:
            y=y+5
         if event.key == K_KP7:
            x=x-5
            y=y-5
         if event.key == K_KP9:
            x=x+5
            y=y-5
         if event.key == K_KP3:
            x=x+5
            y=y+5
         if event.key == K_KP1:
            x=x-5
            y=y+5
   pygame.display.update()

Pygame - 用鼠标移动

根据鼠标指针的移动来移动对象很容易。pygame.mouse 模块定义 get_pos() 方法。它返回与鼠标当前位置的 x 和 y 坐标相对应的两项元组。

(mx,my) = pygame.mouse.get_pos()

捕获 mx 和我的位置后,在这些坐标处的 Surface 对象上的 bilt() 函数的帮助下渲染图像。

例子

以下程序在移动鼠标光标位置连续渲染给定图像。

filename = 'pygame.png'
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("Moving with mouse")
img = pygame.image.load(filename)
x = 0
y= 150
while True:
   mx,my=pygame.mouse.get_pos()
   screen.fill((255,255,255))
   screen.blit(img, (mx, my))
   for event in pygame.event.get():
      if event.type == QUIT:
         exit()
pygame.display.update()

Pygame - 移动矩形对象

Pygame.Rect 类具有存储和操作矩形区域的功能。矩形对象可以由左侧、顶部、宽度和高度值构造。矩形类中的函数可以复制、移动矩形对象并调整矩形对象的大小。

矩形对象具有以下虚拟属性 -

虚拟属性

除了移动之外,Rect 类还具有测试矩形之间碰撞的方法。

复制() 返回一个与原始矩形具有相同位置和大小的新矩形。
移动() 返回移动给定偏移量的新矩形。x 和 y 参数可以是任何整数值,正数或负数。
move_ip() 与 Rect.move() 方法相同,但就地操作。
膨胀(x,y) 返回一个新的矩形,其大小按给定的偏移量更改。负值将缩小矩形。
inflate_ip(x, y) 与 Rect.inflate() 方法相同,但就地操作。
夹具(矩形) 返回一个新的矩形,该矩形被移动到完全位于参数 Rect 内。
剪辑(矩形) 返回一个新的矩形,该矩形被裁剪为完全位于参数 Rect 内。
联合(矩形) 返回一个新的矩形,该矩形完全覆盖所提供的两个矩形的区域。
union_ip(矩形) 与 Rect.union() 方法相同,但操作就地。
包含(矩形) 当参数完全位于 Rect 内时返回 true。
碰撞点((x,y)) 如果给定点位于矩形内部,则返回 true。
碰撞直方图(矩形) 如果任一矩形的任何部分重叠,则返回 true

例子

在下面的程序中,用红色轮廓绘制了一个 Rect 对象。使用 copy() 方法,创建其克隆以进行移动。移动是通过 move_ip() 方法实现的。箭头键通过将 x/y 坐标增加/减少 + 或 -5 像素来移动复制矩形的位置。

import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
rect1 = Rect(50, 60, 200, 80)
rect2=rect1.copy()
running = True
x=0
y=0
while running:
   for event in pygame.event.get():
      if event.type == QUIT:
         running = False
      if event.type == KEYDOWN:
         if event.key==K_LEFT:
            x= -5
            y=0
         if event.key == K_RIGHT:
            x=5
            y=0
         if event.key == K_UP:
            x = 0
            y = -5
         if event.key == K_DOWN:
            x = 0
            y = 5
   rect2.move_ip(x,y)
   screen.fill((127,127,127))
   pygame.draw.rect(screen, (255,0,0), rect1, 1)
   pygame.draw.rect(screen, (0,0,255), rect2, 5)
   pygame.display.update()
   pygame.quit()

输出

以下输出显示带有红色轮廓的矩形是原始矩形。它的副本会响应箭头键而不断移动,并具有蓝色轮廓

长方形

例子

将 move_ip() 方法更改为 inflate_ip() 方法,以根据按下的箭头增大/缩小矩形。

while running:
   for event in pygame.event.get():
      if event.type == QUIT:
         running = False
      if event.type == KEYDOWN:
         if event.key==K_LEFT:
            x= -5
            y=0
         if event.key == K_RIGHT:
            x=5
            y=0
         if event.key == K_UP:
            x = 0
            y = -5
         if event.key == K_DOWN:
            x = 0
            y = 5
      rect2.inflate_ip(x,y)
   screen.fill((127,127,127))
   pygame.draw.rect(screen, (255,0,0), rect1, 1)
   pygame.draw.rect(screen, (0,0,255), rect2, 5)
   pygame.display.update()

输出

以下是箭头键按下活动的屏幕截图 -

矩形截图

例子

为了通过检测 MOUSEMOTION 事件使矩形移动,我们需要首先在原始矩形内按下鼠标。为了验证鼠标位置是否在矩形内部,我们使用 Rect 对象的 collidepoint() 方法。当鼠标移动时,矩形对象通过 move_ip() 方法移动到位。释放鼠标时移动应停止。

import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
rect = Rect(50, 60, 200, 80)
moving = False
running = True
while running:
   for event in pygame.event.get():
      if event.type == QUIT:
         running = False
      elif event.type == MOUSEBUTTONDOWN:
         if rect.collidepoint(event.pos):
            moving = True
      elif event.type == MOUSEBUTTONUP:
         moving = False
      elif event.type == MOUSEMOTION and moving:
         rect.move_ip(event.rel)
   screen.fill((127,127,127))
   pygame.draw.rect(screen, (255,0,0), rect)
   if moving:
      pygame.draw.rect(screen, (0,0,255), rect, 4)
   pygame.display.flip()
pygame.quit()

输出

矩形屏幕截图

矩形鼠标

例子

要使用鼠标绘制矩形,请在 MOUSEBUTTONDOWN 和 MOUSEBUTTONUP 事件中捕获鼠标指针坐标,计算左上角坐标、宽度和高度并调用 rect() 函数。

import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("Draw Rectangle with Mouse")
screen.fill((127,127,127))
x=0
y=0
w=0
h=0
drawmode=True
running = True
while running:
   for event in pygame.event.get():
      if event.type == QUIT:
         running = False
      if event.type == MOUSEBUTTONDOWN:
         x,y = pygame.mouse.get_pos()
         drawmode = True
      if event.type == MOUSEBUTTONUP:
         x1,y1 = pygame.mouse.get_pos()
         w=x1-x
         h=y1-y
         drawmode= False

   rect = pygame.Rect(x,y,w,h)
   if drawmode == False:
      pygame.draw.rect(screen, (255,0,0), rect)
   pygame.display.flip()
pygame.quit()

输出

鼠标指针

Pygame - 使用文本作为按钮

按钮是典型游戏窗口中的重要元素。我们可以使用文本或图像表面对象作为按钮,这样当单击它时就可以触发特定的操作。

让我们尝试显示三个带有文本标题的按钮。

text1=font.render(" START ", True, white)
text2=font.render(" PLAY ", True, white)
text3=font.render(" STOP ", True, white)

为了在这些按钮周围绘制边框,需要获取它们的 Rect 对象。

rect1 = text1.get_rect(topleft=(10,10))
rect2 = text2.get_rect(topleft= (100,10))
rect3 = text3.get_rect(topleft= (200,10))

在事件循环内,位块复制周围带有红色边框的文本按钮。

screen.blit(text1, rect1)
pygame.draw.rect(screen, (255,0,0),rect1,2)
screen.blit(text2, rect2)
pygame.draw.rect(screen, (255,0,0),rect2,2)
pygame.draw.rect(screen, (255,0,0),rect3,2)
screen.blit(text3, rect3)

使用 Rect 对象的 collidepoint() 函数来识别哪个按钮被单击。

if event.type == pygame.MOUSEBUTTONDOWN:
   if rect1.collidepoint(event.pos):
      msg = "START Button was pressed"
   if rect2.collidepoint(event.pos):
      msg = "PLAY Button was pressed"
   if rect3.collidepoint(event.pos):
      msg = "STOP Button was pressed"

将适当的消息显示为文本表面 -

img=font.render(msg, True, (0,0,255))
imgrect=img.get_rect()
imgrect.center = (200 , 150 )
pygame.draw.rect(screen, bg, imgrect)
screen.blit(img, imgrect)

例子

以下是完整的代码 -

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False

font = pygame.font.SysFont("Arial", 14)
text1=font.render(" START ", True, white)
text2=font.render(" PLAY ", True, white)
text3=font.render(" STOP ", True, white)

rect1 = text1.get_rect(topleft=(10,10))
rect2 = text2.get_rect(topleft= (100,10))
rect3 = text3.get_rect(topleft= (200,10))
bg = (127,127,127)
msg=" "
screen = pygame.display.set_mode((400,300))
screen.fill(bg)
while not done:
   for event in pygame.event.get():
      screen.blit(text1, rect1)
      pygame.draw.rect(screen, (255,0,0),rect1,2)
      screen.blit(text2, rect2)
      pygame.draw.rect(screen, (255,0,0),rect2,2)
      pygame.draw.rect(screen, (255,0,0),rect3,2)
      screen.blit(text3, rect3)
      
      if event.type == pygame.QUIT:
         done = True
      if event.type == pygame.MOUSEBUTTONDOWN:
         if rect1.collidepoint(event.pos):
            msg = "START Button was pressed"
         if rect2.collidepoint(event.pos):
            msg = "PLAY Button was pressed"
         if rect3.collidepoint(event.pos):
            msg = "STOP Button was pressed"
      img=font.render(msg, True, (0,0,255))
      imgrect=img.get_rect()
      imgrect.center = (200 , 150 )
      pygame.draw.rect(screen, bg, imgrect)
      screen.blit(img, imgrect)

   pygame.display.update()

输出

单击每个按钮时,显示窗口显示以下输出 -

鼠标指针

鼠标指针

鼠标指针

Pygame - 转换图像

pygame.ransform 模块包含许多函数的定义,用于操作从图像或文本块获取的 Surface 对象。表面的操作包括翻转、旋转、缩放、调整大小和缩放对象。

在 pygame.transform 模块中可以找到以下函数。

翻动() 垂直和水平翻转
规模() 调整大小到新分辨率
旋转() 旋转图像
旋转缩放() 过滤缩放和旋转
缩放2x() 专门的图像倍增器
平滑缩放() 平滑地将表面缩放到任意尺寸
get_smoothscale_backend() 返回正在使用的 smoothscale 滤波器版本 - 'GENERIC'、'MMX' 或 'SSE'
set_smoothscale_backend() 将 smoothscale 滤波器版本设置为“GENERIC”、“MMX”或“SSE”之一
劈() 获取已删除内部区域的图像的副本
拉普拉斯算子() 查找曲面中的边缘
平均表面() 从多个曲面中找出平均曲面。
平均颜色() 求表面的平均颜色
临界点() 查找表面中的哪些像素以及有多少像素在“search_color”或“search_surf”的阈值内。

让我们首先使用 Flip() 函数,其语法如下 -

flip(Surface, xbool, ybool)

此功能可以水平、垂直或两者都翻转表面对象。方向由两个布尔参数决定。

要水平翻转图像,请使用以下命令 -

pygame.transform.flip(img2,True, False)

要垂直翻转,请使用以下命令 -

pygame.transform.flip(img2,False, True)

在下面的示例中,pygame 徽标图像正常显示并双向翻转。首先从原始图像对象获取翻转表面,获取其 Rect 对象,然后构建它。要渲染水平翻转的图像,

img1 = pygame.image.load('pygame.png')
img2=img1
img2=pygame.transform.flip(img2,True, False)
#inside event loop
rect2 = img2.get_rect()
   rect2.center = 200, 150
   screen.blit(img2, rect2)

例子

渲染原始 Pygame 徽标及其翻转图像的完整代码如下 -

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Flip image")
img1 = pygame.image.load('pygame.png')
img2=img1
img3=img1
img2=pygame.transform.flip(img2,True, False)
img3=pygame.transform.flip(img3, False, True)
done = False
bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      rect1 = img1.get_rect()
      rect1.center = 200, 50
      screen.blit(img1, rect1)
      rect2 = img2.get_rect()
      rect2.center = 200, 150
      screen.blit(img2, rect2)
      rect3 = img3.get_rect()
      rect3.center = 200, 250
      screen.blit(img3, rect3)
      if event.type == pygame.QUIT:
         done = True
   pygame.display.update()

输出

原始 Pygame

rotate() 函数采用以下参数 -

rotate(Surface, angle)

例子

角度为负值时,表面沿顺时针方向旋转。

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("rotate image")
img1 = pygame.image.load('pygame.png')
img2=img1
img3=img1
img2=pygame.transform.rotate(img2,90)
img3=pygame.transform.rotate(img3, -90)
done = False
bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      rect1 = img1.get_rect()
      rect1.center = 200, 50
      screen.blit(img1, rect1)
      rect2 = img2.get_rect()
      rect2.center = 100, 200
      screen.blit(img2, rect2)
      rect3 = img3.get_rect()
      rect3.center = 300,200
      screen.blit(img3, rect3)
      if event.type == pygame.QUIT:
         done = True
   pygame.display.update()

输出

原创 Pygame

例子

laplacian() 函数提取表面对象的轮廓。该函数只接受一个参数,即图像对象本身。

import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Laplacian of image")
img1 = pygame.image.load('pygame.png')
img2=img1
img2=pygame.transform.laplacian(img2)
done = False
bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)
      rect1 = img1.get_rect()
      rect1.center = 200, 50
      screen.blit(img1, rect1)
      rect2 = img2.get_rect()
      rect2.center = 200, 200
      screen.blit(img2, rect2)
      
      if event.type == pygame.QUIT:
         done = True
   pygame.display.update()

输出

表面物体

要使 Surface 对象随着鼠标移动而移动,请计算距图像中心的 x、y 坐标。我们还计算了鼠标中心距离 d。atan2(y, x) 数学函数可以找到旋转角度。我们需要将弧度转换为度数。根据鼠标中心的距离,我们计算比例参数。

mouse = event.pos
Pygame
54
x = mouse[0] - 200
y = mouse[1] - 150
d = math.sqrt(x ** 2 + y ** 2)
angle = math.degrees(-math.atan2(y, x))
scale = abs(5 * d / 400)

最后,我们使用 rotzoom() 函数执行组合旋转和缩放变换。

rotozoom(Surface, angle, scale)

例子

以下代码渲染了可以根据鼠标移动旋转的 Pygame 徽标图像。

import pygame , math
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Move image with mouse")
img1 = pygame.image.load('pygame.png')
done = False
bg = (127,127,127)
while not done:
   for event in pygame.event.get():
      screen.fill(bg)

      if event.type == pygame.QUIT:
         done = True
      if event.type == MOUSEMOTION:
         mouse = event.pos
         x = mouse[0] - 200
         y = mouse[1] - 150
         d = math.sqrt(x ** 2 + y ** 2)
         angle = math.degrees(-math.atan2(y, x))
         scale = abs(5 * d / 400)
         img2 = pygame.transform.rotozoom(img1, angle, scale)
         rect = img2.get_rect()
         rect.center = (200,150)
         screen.blit(img2, rect)
   pygame.display.update()

输出

运行上面的代码,尝试沿着显示窗口移动鼠标光标。图像应旋转并相应地缩小或放大。

鼠标光标

Pygame - 声音对象

音乐和声音的使用使任何电脑游戏都更具吸引力。Pygame 库通过 pygame.mixer 模块支持此功能。该模块包含用于加载声音对象和控制播放的声音类。所有声音播放都在后台线程中混合。为了减少声音延迟,请使用较小的缓冲区大小。

要从声音文件或文件对象获取 Sound 对象,请使用以下构造函数 -

pygame.mixer.Sound(filename or file object)

Sound 类定义了以下用于控制播放的方法 -

播放(循环=0,最大时间=0,fade_ms=0) 开始在可用通道上播放声音(即在计算机的扬声器上)。Loops 参数用于重复播放。
停止() 这将停止在任何活动通道上播放该声音。
淡出(时间) 这将在声音随着时间参数(以毫秒为单位)淡出后停止播放。
设置音量(值) 这将设置该声音的播放音量,立即影响该声音(如果正在播放)以及该声音的任何未来播放。体积范围为 0.0 至 1.0
获取长度() 返回此声音的长度(以秒为单位)。

在以下示例中,文本按钮呈现在显示窗口的底部。空格键会向上发射箭头,并伴有声音。

font = pygame.font.SysFont("Arial", 14)
text1=font.render(" SHOOT ", True, bg)
rect1 = text1.get_rect(midbottom=(200,300))
img=pygame.image.load("arrow.png")
rect2=img.get_rect(midtop=(200, 270))

在游戏事件循环内,对于检测到的空格键,箭头对象会放置在 SHOOT 按钮上方,并以递减的 y 坐标重复渲染。射击声也同时响起。

sound=pygame.mixer.Sound("sound.wav")img=pygame.image.load("arrow.png")
rect2=img.get_rect(midtop=(200, 270))

if event.type == pygame.KEYDOWN:
   if event.key == pygame.K_SPACE: 18. Pygame — Sound objects
      print ("space")
      if kup==0:
         screen.blit(img, (190,y))
         kup=1
   if kup==1:
      y=y-1
      screen.blit(img, (190,y))
      sound.play()
      if y<=0:
         kup=0
         y=265

例子

以下清单演示了 Sound 对象的使用。

import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
white = (255,255,255)
bg = (127,127,127)
sound=pygame.mixer.Sound("sound.wav")
font = pygame.font.SysFont("Arial", 14)
text1=font.render(" SHOOT ", True, bg)
rect1 = text1.get_rect(midbottom=(200,300))
img=pygame.image.load("arrow.png")
rect2=img.get_rect(midtop=(200, 270))
kup=0
psmode=True
screen = pygame.display.set_mode((400,300))
screen.fill(white)
y=265
while not done:

   for event in pygame.event.get():
      screen.blit(text1, rect1)
      pygame.draw.rect(screen, (255,0,0),rect1,2)
      if event.type == pygame.QUIT:
         sound.stop()
         done = True
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_SPACE:
            print ("space")
            if kup==0:
               screen.blit(img, (190,y))
               kup=1
   if kup==1:
      y=y-1
      screen.blit(img, (190,y))
      sound.play()
      if y<=0:
         kup=0
         y=265
   pygame.display.update()

Pygame - 混合器通道

Sound 对象可以在特定通道上播放,而不是在自动选择的默认通道上播放。首先使用以下命令创建一个通道对象 -

pygame.mixer.Channel(id)

Mixer.channel 类中定义了以下函数 -

播放(声音,循环=0,最大时间=0,fade_ms=0) 这将开始在特定通道上播放声音。
停止() 停止频道上的声音播放。播放停止后,该通道可用于播放新声音
暂停() 暂时停止频道上的声音播放。
取消暂停() 恢复暂停频道的播放。
设置音量(值) 设置播放声音的音量(响度)。值参数介于 0.0 和 1.0 之间。
队列(声音) 当声音在通道上排队时,它将在当前声音完成后立即开始播放。

Pygame - 播放音乐

混音器还有一个用于音乐播放的特殊流媒体通道,可通过 pygame.mixer.musicpygame 模块访问以控制流媒体音频模块。音乐播放和常规声音播放之间的区别在于音乐是流式传输的,并且从未真正一次加载。混音器系统一次仅支持单个音乐流。

首先,我们需要从音乐文件加载音乐。Pygame 可以加载 WAV、MP3 或 OGG 文件。

pygame.mixer.music.load(filename or object)

这将加载音乐文件名/文件对象并准备播放。如果音乐流已经在播放,它将被停止。这不会开始播放音乐。播放由以下功能控制 -

play(loops=0, start=0.0, fade_ms = 0)

这将播放加载的音乐流。如果音乐已经在播放,它将重新开始。Loops 参数告诉我们重复音乐的次数。如果此参数设置为 -1,音乐将无限期重复。start 表示音乐开始播放。以秒为单位的时间位置。fade_ms 参数使音乐以 0 音量开始播放,并在给定时间内逐渐达到最大音量。

其他有用的功能如下 -

倒带() 将当前音乐的播放重置为开头。
停止() 如果当前正在播放音乐,则停止播放。它不会卸载音乐。
暂停() 暂时停止音乐流的播放。
取消暂停() 这将在暂停后恢复音乐流的播放。
淡出(时间) 淡出并停止当前播放的音乐。
设置音量(音量) 设置音乐播放的音量。
设置位置(位置) 这将设置音乐文件中播放开始的位置。

在以下程序中,单击“播放”按钮后开始播放音乐文件。“暂停”按钮充当暂停/取消暂停播放的切换开关。单击“停止”停止播放。

import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300)) 20. Pygame — Playing music
done = False
white = (255,255,255)
pygame.mixer.music.load("mario_theme.wav")
font = pygame.font.SysFont("Arial", 14)
text1=font.render(" PLAY ", True, white)
text2=font.render(" PAUSE ", True, white)
text3=font.render(" STOP ", True, white)
rect1 = text1.get_rect(topleft=(10,10))
rect2 = text2.get_rect(topleft= (100,10))
rect3 = text3.get_rect(topleft= (200,10))
bg = (127,127,127)
psmode=True
screen = pygame.display.set_mode((400,300))
screen.fill(bg)
while not done:
   for event in pygame.event.get():
      screen.blit(text1, rect1)
      pygame.draw.rect(screen, (255,0,0),rect1,2)
      screen.blit(text2, rect2)
      pygame.draw.rect(screen, (255,0,0),rect2,2)
      pygame.draw.rect(screen, (255,0,0),rect3,2)
      screen.blit(text3, rect3)

      if event.type == pygame.QUIT:
         done = True
      if event.type == pygame.MOUSEBUTTONDOWN:
         if rect1.collidepoint(event.pos):
            pygame.mixer.music.play()
         if rect2.collidepoint(event.pos):
            if psmode==True:
               pygame.mixer.music.pause()
               psmode=False
            else:
               if psmode==False:
                  pygame.mixer.music.unpause()
                  psmode=True
            if rect3.collidepoint(event.pos):
               pygame.mixer.music.stop()
   pygame.display.update()

Pygame - 玩电影

Pygame 在其最新版本中停止了对视频文件的支持。然而,在Python 2.7发行版的早期版本中,它仍然可以使用。本节使用了 Pygame 1.9.2 和 Python 2.7.18。

pygame.movi​​e 模块支持从基本编码的 MPEG-1 视频文件播放视频和音频。电影播放发生在后台线程中,这使得播放易于管理。如果要播放电影的声音,则必须未初始化用于加载和播放声音模块的 pygame.mixerpygame 模块。

首先通过以下语法获取 Movie 对象 -

movie = pygame.movie.Movie('sample.mpg')

Movie 类提供以下方法来控制播放。

pygame.电影.电影.play 开始播放电影
pygame.movi​​e.Movie.stop 停止电影播放
pygame.movi​​e.Movie.pause 暂时停止和恢复播放
pygame.movi​​e.Movie.skip 提前影片播放位置
pygame.movi​​e.Movie.rewind 重新开始电影播放
pygame.movi​​e.Movie.get_time 获取当前视频播放时间
pygame.movi​​e.Movie.get_length 电影的总长度(以秒为单位)
pygame.movi​​e.Movie.get_size 获取视频的分辨率
pygame.movi​​e.Movie.has_audio 检查电影文件是否包含音频
pygame.movi​​e.Movie.set_volume 设置音频播放音量
pygame.movi​​e.Movie.set_display 设置视频目标Surface

以下代码在 Pygame 显示窗口上播放 .MPG 文件。-

import pygame

FPS = 60
pygame.init()
clock = pygame.time.Clock()
movie = pygame.movie.Movie('sample_640x360.mpg')
screen = pygame.display.set_mode(movie.get_size())
movie_screen = pygame.Surface(movie.get_size()).convert()

movie.set_display(movie_screen)
movie.play()

playing = True
while playing:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         movie.stop()
         playing = False

   screen.blit(movie_screen,(0,0))
   pygame.display.update()
   clock.tick(FPS)
pygame.quit()

Pygame - 使用相机模块

Pygame 1.9.6 之前的早期版本包含 pygame.camera 模块。该模块包含捕获游戏窗口上的摄像头信息并从中抓取图像的功能。系统可用的相机设备在 list_cameras() 方法返回的列表中枚举。

pygame.camera.list_cameras()

要初始化相机对象,请使用相机 ID、分辨率和格式参数