【Python】一文讲透Pygame教程,非常详细

Pygame 是一个非常流行的 Python 库,用于编写视频游戏。它建立在 SDL(Simple DirectMedia Layer)库之上,提供了简单的接口来处理图形、声音和输入设备。本文将提供一个非常详细的 Pygame 教程,帮助你从零开始编写一个简单的游戏。


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk
💬 博主粉丝群介绍:① 群内高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

【Python】一文讲透Pygame教程,非常详细

  • [1️⃣ 安装 Pygame](#1️⃣ 安装 Pygame)
    • [1.1 使用 pip 安装](#1.1 使用 pip 安装)
    • [1.2 检查安装](#1.2 检查安装)
  • [2️⃣ 创建一个简单的 Pygame 窗口](#2️⃣ 创建一个简单的 Pygame 窗口)
    • [2.1 导入 Pygame 模块](#2.1 导入 Pygame 模块)
    • [2.2 创建一个窗口](#2.2 创建一个窗口)
    • [2.3 主循环](#2.3 主循环)
    • [2.4 完整代码](#2.4 完整代码)
  • [3️⃣ 绘制图形](#3️⃣ 绘制图形)
    • [3.1 设置颜色](#3.1 设置颜色)
    • [3.2 绘制矩形](#3.2 绘制矩形)
    • [3.3 绘制圆形](#3.3 绘制圆形)
    • [3.4 更新屏幕](#3.4 更新屏幕)
    • [3.5 完整代码](#3.5 完整代码)
  • [4️⃣ 加载和显示图像](#4️⃣ 加载和显示图像)
    • [4.1 加载图像](#4.1 加载图像)
    • [4.2 显示图像](#4.2 显示图像)
    • [4.3 完整代码](#4.3 完整代码)
  • [5️⃣ 处理用户输入](#5️⃣ 处理用户输入)
    • [5.1 处理键盘输入](#5.1 处理键盘输入)
    • [5.2 处理鼠标输入](#5.2 处理鼠标输入)
    • [5.3 完整代码](#5.3 完整代码)
  • [6️⃣ 移动图像](#6️⃣ 移动图像)
    • [6.1 更新图像位置](#6.1 更新图像位置)
    • [6.2 完整代码](#6.2 完整代码)
  • [7️⃣ 添加背景音乐和音效](#7️⃣ 添加背景音乐和音效)
    • [7.1 初始化混音器](#7.1 初始化混音器)
    • [7.2 加载和播放背景音乐](#7.2 加载和播放背景音乐)
    • [7.3 加载和播放音效](#7.3 加载和播放音效)
    • [7.4 完整代码](#7.4 完整代码)
  • [8️⃣ 处理碰撞检测](#8️⃣ 处理碰撞检测)
    • [8.1 碰撞检测基础](#8.1 碰撞检测基础)
    • [8.2 示例:简单的碰撞检测](#8.2 示例:简单的碰撞检测)
  • [9️⃣ 动画与帧率控制](#9️⃣ 动画与帧率控制)
    • [9.1 使用 `pygame.time.Clock` 控制帧率](#9.1 使用 pygame.time.Clock 控制帧率)
    • [9.2 动画示例](#9.2 动画示例)
  • [🔟 总结](#🔟 总结)

1️⃣ 安装 Pygame

1.1 使用 pip 安装

你可以使用 pip 来安装 Pygame:

bash 复制代码
pip install pygame

1.2 检查安装

安装完成后,可以通过以下命令检查是否安装成功:

bash 复制代码
python -m pygame.examples.aliens

如果看到一个简单的游戏窗口,说明 Pygame 安装成功。

2️⃣ 创建一个简单的 Pygame 窗口

2.1 导入 Pygame 模块

首先,我们需要导入 Pygame 模块并初始化它:

python 复制代码
import pygame
pygame.init()

2.2 创建一个窗口

接下来,我们创建一个窗口并设置窗口的标题:

python 复制代码
# 设置窗口尺寸
window_size = (800, 600)
screen = pygame.display.set_mode(window_size)

# 设置窗口标题
pygame.display.set_caption("My First Pygame Window")

2.3 主循环

Pygame 需要一个主循环来保持窗口的打开状态,并处理各种事件。以下是一个简单的主循环示例:

python 复制代码
# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

# 退出 Pygame
pygame.quit()

2.4 完整代码

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("My First Pygame Window")

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

# 退出 Pygame
pygame.quit()

运行这段代码,你会看到一个简单的 Pygame 窗口,点击关闭按钮可以退出窗口。

3️⃣ 绘制图形

3.1 设置颜色

Pygame 使用 RGB 颜色值来设置颜色。以下是一些常见颜色的定义:

python 复制代码
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

3.2 绘制矩形

我们可以使用 pygame.draw.rect 来绘制矩形:

python 复制代码
pygame.draw.rect(screen, RED, (100, 100, 50, 50))

3.3 绘制圆形

我们可以使用 pygame.draw.circle 来绘制圆形:

python 复制代码
pygame.draw.circle(screen, BLUE, (200, 200), 30)

3.4 更新屏幕

绘制完图形后,需要更新屏幕以显示图形:

python 复制代码
pygame.display.flip()

3.5 完整代码

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Drawing Shapes")

# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 填充背景色
    screen.fill(WHITE)

    # 绘制矩形
    pygame.draw.rect(screen, RED, (100, 100, 50, 50))

    # 绘制圆形
    pygame.draw.circle(screen, BLUE, (200, 200), 30)

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

# 退出 Pygame
pygame.quit()

运行这段代码,你会看到一个窗口,里面绘制了一个红色的矩形和一个蓝色的圆形。

4️⃣ 加载和显示图像

1

4.1 加载图像

在游戏开发中,经常需要加载和显示图像。Pygame 提供了简单的接口来加载图像。首先,确保你有一个图像文件(例如 player.png)保存在你的项目目录中。

使用 pygame.image.load 函数加载图像:

python 复制代码
player_image = pygame.image.load('player.png')

4.2 显示图像

加载图像后,可以使用 blit 方法将图像绘制到屏幕上:

python 复制代码
screen.blit(player_image, (100, 100))

4.3 完整代码

以下是一个完整的示例代码,演示如何加载和显示图像:

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Display Image")

# 加载图像
player_image = pygame.image.load('player.png')

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

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

    # 显示图像
    screen.blit(player_image, (100, 100))

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

# 退出 Pygame
pygame.quit()

运行这段代码,你会看到一个窗口,里面显示了加载的图像。

5️⃣ 处理用户输入

5.1 处理键盘输入

Pygame 提供了简单的接口来处理键盘输入。你可以在主循环中检测按键事件:

python 复制代码
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            print("Left arrow key pressed")
        elif event.key == pygame.K_RIGHT:
            print("Right arrow key pressed")

5.2 处理鼠标输入

你也可以处理鼠标事件,例如检测鼠标点击:

python 复制代码
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.MOUSEBUTTONDOWN:
        print("Mouse button pressed at", event.pos)

5.3 完整代码

以下是一个完整的示例代码,演示如何处理键盘和鼠标输入:

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Handle Input")

# 加载图像
player_image = pygame.image.load('player.png')

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("Left arrow key pressed")
            elif event.key == pygame.K_RIGHT:
                print("Right arrow key pressed")
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print("Mouse button pressed at", event.pos)

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

    # 显示图像
    screen.blit(player_image, (100, 100))

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

# 退出 Pygame
pygame.quit()

运行这段代码,你可以在控制台看到键盘和鼠标事件的输出。

6️⃣ 移动图像

6.1 更新图像位置

为了让图像在屏幕上移动,我们需要更新图像的位置。可以使用变量来存储图像的位置,并在主循环中更新这些变量:

python 复制代码
player_x = 100
player_y = 100

# 移动图像
player_x += 1

6.2 完整代码

以下是一个完整的示例代码,演示如何在屏幕上移动图像:

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Move Image")

# 加载图像
player_image = pygame.image.load('player.png')

# 初始化图像位置
player_x = 100
player_y = 100

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_x -= 5
            elif event.key == pygame.K_RIGHT:
                player_x += 5
            elif event.key == pygame.K_UP:
                player_y -= 5
            elif event.key == pygame.K_DOWN:
                player_y += 5

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

    # 显示图像
    screen.blit(player_image, (player_x, player_y))

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

# 退出 Pygame
pygame.quit()

运行这段代码,你可以使用箭头键移动图像。

7️⃣ 添加背景音乐和音效

7.1 初始化混音器

在 Pygame 中,可以使用 pygame.mixer 模块来处理声音。首先,需要初始化混音器:

python 复制代码
pygame.mixer.init()

7.2 加载和播放背景音乐

可以使用 pygame.mixer.music 模块加载和播放背景音乐:

python 复制代码
pygame.mixer.music.load('background.mp3')
pygame.mixer.music.play(-1)  # -1 表示循环播放

7.3 加载和播放音效

可以使用 pygame.mixer.Sound 类加载和播放音效:

python 复制代码
collision_sound = pygame.mixer.Sound('collision.wav')
collision_sound.play()

7.4 完整代码

以下是一个完整的示例代码,演示如何添加背景音乐和音效:

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

# 初始化混音器
pygame.mixer.init()

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

# 设置窗口标题
pygame.display.set_caption("Music and Sound Effects")

# 加载图像
player_image = pygame.image.load('player.png')

# 初始化图像位置
player_x = 100
player_y = 100

# 加载背景音乐和音效
pygame.mixer.music.load('background.mp3')
pygame.mixer.music.play(-1)  # -1 表示循环播放
collision_sound = pygame.mixer.Sound('collision.wav')

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_x -= 5
            elif event.key == pygame.K_RIGHT:
                player_x += 5
            elif event.key == pygame.K_UP:
                player_y -= 5
            elif event.key == pygame.K_DOWN:
                player_y += 5
            elif event.key == pygame.K_SPACE:
                collision_sound.play()  # 按下空格键播放音效

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

    # 显示图像
    screen.blit(player_image, (player_x, player_y))

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

# 退出 Pygame
pygame.quit()

运行这段代码,背景音乐会开始播放,并且按下空格键时会播放音效。

8️⃣ 处理碰撞检测

8.1 碰撞检测基础

Pygame 提供了多种方法来检测对象之间的碰撞。我们可以使用 pygame.Rect 对象来定义矩形区域,并使用 colliderect 方法来检测两个矩形是否碰撞。

8.2 示例:简单的碰撞检测

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Collision Detection")

# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 初始化矩形位置
rect1 = pygame.Rect(100, 100, 50, 50)
rect2 = pygame.Rect(300, 300, 50, 50)

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                rect1.x -= 5
            elif event.key == pygame.K_RIGHT:
                rect1.x += 5
            elif event.key == pygame.K_UP:
                rect1.y -= 5
            elif event.key == pygame.K_DOWN:
                rect1.y += 5

    # 填充背景色
    screen.fill(WHITE)

    # 绘制矩形
    pygame.draw.rect(screen, RED, rect1)
    pygame.draw.rect(screen, BLUE, rect2)

    # 碰撞检测
    if rect1.colliderect(rect2):
        print("Collision detected!")

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

# 退出 Pygame
pygame.quit()

运行这段代码,你可以使用箭头键移动红色矩形,当红色矩形与蓝色矩形碰撞时,控制台会输出 "Collision detected!"。

9️⃣ 动画与帧率控制

9.1 使用 pygame.time.Clock 控制帧率

为了控制游戏的帧率,我们可以使用 pygame.time.Clock 对象。它允许我们设置每秒的帧数(FPS),从而控制游戏的速度。

python 复制代码
clock = pygame.time.Clock()

在主循环的每一帧末尾,调用 clock.tick(fps) 来限制帧率:

python 复制代码
clock.tick(60)  # 设置帧率为 60 FPS

9.2 动画示例

以下是一个简单的动画示例,演示如何使用 pygame.time.Clock 控制帧率:

python 复制代码
import pygame

# 初始化 Pygame
pygame.init()

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

# 设置窗口标题
pygame.display.set_caption("Animation with Frame Rate Control")

# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)

# 初始化矩形位置和速度
rect = pygame.Rect(100, 100, 50, 50)
rect_speed = [2, 2]

# 创建时钟对象
clock = pygame.time.Clock()

# 主循环标志
running = True

# 主循环
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 移动矩形
    rect.x += rect_speed[0]
    rect.y += rect_speed[1]

    # 碰到边界反弹
    if rect.left < 0 or rect.right > window_size[0]:
        rect_speed[0] = -rect_speed[0]
    if rect.top < 0 or rect.bottom > window_size[1]:
        rect_speed[1] = -rect_speed[1]

    # 填充背景色
    screen.fill(WHITE)

    # 绘制矩形
    pygame.draw.rect(screen, RED, rect)

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

    # 控制帧率
    clock.tick(60)  # 设置帧率为 60 FPS

# 退出 Pygame
pygame.quit()

运行这段代码,你会看到一个红色矩形在窗口中移动并反弹。

🔟 总结

通过这篇详细的 Pygame 教程,你已经学会了如何:

  1. 安装 Pygame。
  2. 创建一个简单的 Pygame 窗口。
  3. 绘制图形。
  4. 加载和显示图像。
  5. 处理用户输入(键盘和鼠标)。
  6. 移动图像。
  7. 添加背景音乐和音效。
  8. 处理碰撞检测。
  9. 实现动画并控制帧率。

这些基础知识将帮助你开始使用 Pygame 开发自己的游戏。

相关推荐
香菇滑稽之谈几秒前
责任链模式的C++实现示例
开发语言·c++·设计模式·责任链模式
码叔义21 分钟前
X509TrustManager信任SSL证书
python·网络协议·ssl
风莫寻22 分钟前
【Troubleshot】Qt 长按按键 keyPressEvent keyReleaseEvent 自动重复问题
开发语言·qt
ZC·Shou22 分钟前
Rust 之一 基本环境搭建、各组件工具的文档、源码、配置
开发语言·rust·cargo·rustc·rustup·clippy·rustfmt
Hello.Reader23 分钟前
深入理解 Rust 中的模式匹配语法
开发语言·rust
最胖的小仙女28 分钟前
通过动态获取后端数据判断输入的值打小
开发语言·前端·javascript
阿波拉33 分钟前
AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas’问题解决
开发语言·python
臣妾写不来啊1 小时前
使用dify的api连接外部知识库,dify连接ragflow的知识库(附java代码)
java·开发语言·spring boot
m0_748247801 小时前
Python连接SQL SEVER数据库全流程
数据库·python·sql
Luis Li 的猫猫2 小时前
基于MATLAB的冰块变化仿真
开发语言·图像处理·人工智能·算法·matlab