Python 课程16-Pygame

news2024/12/24 6:58:57

前言

Pygame 是一个基于 Python 的游戏开发库,专门用于多媒体应用程序开发,特别是 2D 游戏。它提供了处理图像、声音、键盘、鼠标等交互功能的 API,并且能够与 OpenGL 集成,用于更复杂的图形操作。Pygame 是初学者和业余开发者学习游戏开发的绝佳选择,它简洁易懂,且功能强大。

本教程将为你提供 Pygame 的超详细介绍,从基础的窗口创建、图像加载到高级的游戏开发技巧,涵盖所有关键功能。


目录

  1. Pygame 基础

    • 安装 Pygame
    • 创建窗口
    • 设置帧率与游戏循环
    • 加载与显示图像
  2. 事件处理与用户输入

    • 处理键盘输入
    • 处理鼠标输入
    • 退出游戏
  3. 图像与精灵

    • 使用图像与表面(Surface)
    • 精灵与精灵组
    • 动画与精灵更新
  4. 声音与音乐

    • 加载与播放声音
    • 控制音量与声音效果
  5. 碰撞检测

    • 矩形碰撞检测
    • 精灵之间的碰撞检测
  6. 游戏开发技巧

    • 计分系统与游戏状态
    • 定时器与倒计时
    • 随机事件生成

1. Pygame 基础

安装 Pygame

可以通过 pip 安装 Pygame:

pip install pygame

 导入 Pygame:

import pygame
创建窗口

Pygame 使用 pygame.display.set_mode() 函数来创建窗口。

  • 创建窗口并设置标题
import pygame

# 初始化 Pygame
pygame.init()

# 创建一个宽 800、高 600 的窗口
screen = pygame.display.set_mode((800, 600))

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

# 设置窗口背景颜色
screen.fill((0, 0, 255))  # 蓝色背景

# 更新窗口
pygame.display.update()

# 退出 Pygame
pygame.quit()
设置帧率与游戏循环

游戏的核心是游戏循环,它不断运行以更新屏幕和处理用户输入。可以使用 pygame.time.Clock() 来控制帧率。

  • 设置帧率
# 创建时钟对象
clock = pygame.time.Clock()

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

    # 更新窗口
    pygame.display.update()

    # 控制帧率为 60 帧/秒
    clock.tick(60)

pygame.quit()
加载与显示图像
  • 加载图像并显示
# 加载图像
player_image = pygame.image.load('player.png')

# 显示图像
screen.blit(player_image, (100, 100))  # 将图像绘制在 (100, 100) 位置
pygame.display.update()

你可以使用 pygame.image.load() 加载图片,然后使用 blit() 方法将图片绘制到屏幕上。


2. 事件处理与用户输入

处理键盘输入

你可以使用 pygame.event.get() 来获取用户的键盘输入事件,或者直接使用 pygame.key.get_pressed() 获取当前按键状态。

  • 检测键盘事件
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("Left arrow key pressed")
            if event.key == pygame.K_RIGHT:
                print("Right arrow key pressed")
  •  持续检测按键状态
keys = pygame.key.get_pressed()  # 获取当前按键状态
if keys[pygame.K_LEFT]:
    print("Holding left arrow key")
if keys[pygame.K_RIGHT]:
    print("Holding right arrow key")
处理鼠标输入

你可以通过 pygame.mouse.get_pos() 获取鼠标当前位置,或者使用事件来检测鼠标点击。

  • 获取鼠标位置
mouse_pos = pygame.mouse.get_pos()
print(f"Mouse position: {mouse_pos}")
  •  检测鼠标点击
for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:  # 左键点击
            print("Left mouse button clicked")
退出游戏

要确保游戏能够正确退出,需要检测 QUIT 事件

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False

3. 图像与精灵

使用图像与表面(Surface)

Surface 是 Pygame 中的基本图像元素,所有的游戏对象(如背景、角色)都是基于 Surface 绘制的。可以使用 blit() 函数将 Surface 绘制到屏幕上。

  • 创建自定义 Surface
# 创建一个 50x50 像素的红色矩形
red_square = pygame.Surface((50, 50))
red_square.fill((255, 0, 0))

# 绘制到窗口
screen.blit(red_square, (200, 200))
pygame.display.update()
精灵与精灵组

精灵 是 Pygame 中表示游戏对象的类。你可以通过继承 pygame.sprite.Sprite 来创建自己的精灵,并使用 sprite.Group 组织精灵组以便于管理多个精灵。

  • 创建自定义精灵
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('player.png')
        self.rect = self.image.get_rect()
        self.rect.center = (400, 300)

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 5
        if keys[pygame.K_RIGHT]:
            self.rect.x += 5

# 创建精灵组
all_sprites = pygame.sprite.Group()

# 创建玩家精灵
player = Player()

# 将玩家精灵添加到精灵组
all_sprites.add(player)

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

    # 更新所有精灵
    all_sprites.update()

    # 绘制精灵
    screen.fill((0, 0, 0))
    all_sprites.draw(screen)
    pygame.display.update()

pygame.quit()
动画与精灵更新
  • 通过精灵更新动画
class AnimatedSprite(pygame.sprite.Sprite):
    def __init__(self, images):
        super().__init__()
        self.images = images
        self.index = 0
        self.image = self.images[self.index]
        self.rect = self.image.get_rect()

    def update(self):
        # 每帧切换到下一个图像
        self.index += 1
        if self.index >= len(self.images):
            self.index = 0
        self.image = self.images[self.index]

# 加载多个动画帧
frames = [pygame.image.load(f'frame_{i}.png') for i in range(5)]

# 创建动画精灵
animated_sprite = AnimatedSprite(frames)
all_sprites.add(animated_sprite)

通过定期更新精灵的图像,Pygame 可以实现流畅的动画效果。


4. 声音与音乐

Pygame 支持加载和播放声音与音乐文件,常用的音频格式有 WAVMP3OGG

加载与播放声音
  • 加载声音文件
# 加载音效
sound = pygame.mixer.Sound('sound.wav')

# 播放音效
sound.play()
控制音量与声音效果
  • 设置音量
sound.set_volume(0.5)  # 将音量设置为 50%
  •  停止播放
sound.stop()  # 停止播放声音
播放背景音乐
  • 加载并播放背景音乐
# 加载并播放背景音乐
pygame.mixer.music.load('background.mp3')
pygame.mixer.music.play(-1)  # 无限循环播放背景音乐
  •  停止背景音乐
pygame.mixer.music.stop()  # 停止播放背景音乐

 


5. 碰撞检测

矩形碰撞检测

Pygame 提供了简单的矩形碰撞检测机制,可以通过精灵的 rect 属性来检测两个对象是否发生碰撞。你可以使用 colliderect() 函数来检测两个矩形是否重叠。

  • 矩形碰撞检测示例
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('player.png')
        self.rect = self.image.get_rect()
        self.rect.center = (400, 300)

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 5
        if keys[pygame.K_RIGHT]:
            self.rect.x += 5

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('enemy.png')
        self.rect = self.image.get_rect()
        self.rect.center = (600, 300)

    def update(self):
        self.rect.x -= 3  # 让敌人向左移动

# 创建玩家和敌人
player = Player()
enemy = Enemy()

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

    # 更新精灵
    player.update()
    enemy.update()

    # 碰撞检测
    if player.rect.colliderect(enemy.rect):
        print("Collision detected!")
        running = False  # 停止游戏

    # 绘制屏幕
    screen.fill((0, 0, 0))
    screen.blit(player.image, player.rect)
    screen.blit(enemy.image, enemy.rect)
    pygame.display.update()

pygame.quit()
精灵之间的碰撞检测

Pygame 也提供了精灵组之间的碰撞检测功能,可以使用 pygame.sprite.collide_rect()pygame.sprite.groupcollide() 检测精灵组中的多个精灵是否发生碰撞。

  • 精灵组碰撞检测
# 使用 collide_rect 检测两个精灵是否碰撞
if pygame.sprite.collide_rect(player, enemy):
    print("Player and Enemy collided!")

# 使用 groupcollide 检测两个精灵组中的精灵是否碰撞
collisions = pygame.sprite.groupcollide(player_group, enemy_group, False, True)
if collisions:
    print("Collision detected between sprite groups!")

 groupcollide() 的参数:

  • 第一个参数是第一个精灵组。
  • 第二个参数是第二个精灵组。
  • 第三个参数表示是否在发生碰撞时删除第一个组中的精灵。
  • 第四个参数表示是否在发生碰撞时删除第二个组中的精灵。

 


6. 游戏开发技巧

计分系统与游戏状态

在游戏中,我们经常需要追踪分数和管理游戏状态(如游戏是否结束)。你可以使用变量来存储游戏的分数,并在屏幕上显示。

  • 计分系统示例
# 初始化分数
score = 0
font = pygame.font.Font(None, 36)  # 设置字体

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

    # 更新分数
    score += 1

    # 绘制屏幕
    screen.fill((0, 0, 0))

    # 在屏幕上显示分数
    score_text = font.render(f'Score: {score}', True, (255, 255, 255))
    screen.blit(score_text, (10, 10))

    pygame.display.update()

pygame.quit()
定时器与倒计时

你可以使用 pygame.time.get_ticks() 来获取从程序开始运行以来经过的时间(以毫秒为单位)。通过计算时间差,你可以实现倒计时功能。

  • 倒计时示例
# 初始化倒计时
start_time = pygame.time.get_ticks()
countdown = 30  # 30 秒倒计时

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

    # 计算剩余时间
    elapsed_time = (pygame.time.get_ticks() - start_time) // 1000
    remaining_time = max(0, countdown - elapsed_time)

    # 绘制倒计时
    screen.fill((0, 0, 0))
    timer_text = font.render(f'Time: {remaining_time}', True, (255, 255, 255))
    screen.blit(timer_text, (10, 50))
    pygame.display.update()

    # 如果时间到了,结束游戏
    if remaining_time <= 0:
        running = False

pygame.quit()
随机事件生成

Pygame 可以使用 Python 的 random 模块来生成随机事件,如生成敌人的随机位置或道具掉落。

  • 生成随机位置的敌人
import random

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('enemy.png')
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, 800)
        self.rect.y = random.randint(0, 600)

    def update(self):
        self.rect.x -= 3  # 让敌人向左移动

# 创建敌人精灵组
enemy_group = pygame.sprite.Group()

# 生成 5 个随机位置的敌人
for _ in range(5):
    enemy = Enemy()
    enemy_group.add(enemy)

你可以通过 random.randint() 随机生成数值,并将这些数值用于控制对象的生成位置、运动方向等。


结论

通过本详细的 Pygame 教程,你已经学习了如何使用 Pygame 创建游戏,包括窗口设置、用户输入处理、图像与精灵管理、声音播放、碰撞检测和游戏逻辑控制。通过掌握这些功能,你可以轻松开发 2D 游戏,并逐步构建复杂的游戏机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

erlang学习:mnesia数据库与ets表1

Mnesia 和 ETS 都是 Erlang 提供的表管理工具&#xff0c;用于存储和检索数据&#xff0c;但它们之间有一些重要的区别和共同点。 共同点 都是Erlang提供的表存储机制&#xff1a;ETS 和 Mnesia 都允许你在内存中创建表&#xff0c;并且可以用来存储键值对或者更复杂的数据结…

实战16-RVP定义完成适配

新增文件 //设计搞总宽度 const DRAFT_WIDTH 360//将元素的设计搞大小转化为真机中的大小 export default function rvp(val: number) {/*计算元素真正的大小&#xff1b;* 元素在设计稿的大小 / 设计搞总宽度 x / 真机宽度 (保证元素在不同设备占比相同)x 元素在设计稿的大…

论文不会写?分享6款AI论文写作免费一键生成网站!

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享6款免费一键生成AI论文写作网站&#xff0c;并重点推荐千笔-AIPassPaper。 …

uniapp富文本editor输入二次扩展兼容微信小程序

在uni-app中开发富文本输入功能&#xff0c;并使其兼容微信小程序&#xff0c;需要注意一些特定的限制和解决方案。由于微信小程序本身对HTML的支持有限&#xff0c;直接在小程序中实现像Web那样完整的富文本编辑功能&#xff08;如使用CKEditor、Quill等&#xff09;是不可能的…

算法笔记/USACO Guide GOLD金组DP 3. Paths on Grids

今天学习背包DP&#xff08;Knapsack DP) 是USACO Guide的DP章节中第三点 What is grid DP? -Summary DP problems often involve a 2D grid where paths are analyzed. Movement is restricted to one direction on the x-axis and y-axis, typically starting from one c…

AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例

&#x1f431;‍&#x1f409;背景 局部重绘相关的话题我们已经讨论和测试过很多次了&#xff0c;比如说inpaint模型、brushnet模型、powerpaint模型等等&#xff0c;最近对于flux模型重绘画面的案例也越来越多了&#xff0c;那我们就结合flux模型的重绘来试试看效果。 &…

体验几款AI论文写作工具后,我认为这个最值得尝试!

开学随之而来的论文写作肯定又让你头疼了吧&#xff0c;而现如今随着AI技术的飞快发展&#xff0c;许多人巧妙地借助AI论文辅助工具&#xff0c;迅速搭建起论文的基本框架&#xff0c;然后一键生成万字正文内容&#xff0c;准确获得大量文献引用&#xff0c;使得整个论文创作过…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…

基于python+django+vue的美术馆预约系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

WSL中使用AMBER GPU串行版

前提是已经安装过wsl 1 在 WSL 2 中启用 NVIDIA CUDA 参考在 WSL 2 上启用 NVIDIA CUDA | Microsoft Learn 注意&#xff1a;勿在 WSL 中安装任何 Linux 显示驱动程序。Windows 显示驱动程序将同时安装本机 Windows 和 WSL 支持的常规驱动程序组件。 2 在WSL2中配置Cuda 不安…

SEO之页面优化(一-页面标题2)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 &#xff08;接上一篇。。…

OpenCV_最简单的鼠标截取ROI区域

在OpenCV中也存在鼠标的操作&#xff0c;今天我们先介绍一下鼠标中的操作事件 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata0) setMousecallback参数说明&#xff1a; winname:窗口的名字 onMouse:鼠标响应函数&#xff0c;回调…

基于Springboot+vue的音乐网站

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c;包括可行性分析…

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学&#xff0c;这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了&#xff0c;大力赞叹华为云的 同时感谢华为云提供优惠卷&#xff0c;只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动&#xff0c;90款免…

人类行为识别系统源码分享

人类行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【资料分析】刷题日记1

第一套 第二个是相比2019年的增长率&#xff0c;错找为同比增长率 延申&#xff1a; 当出口和进口相比2019年的增长率相同时&#xff0c;可以用盐水解决 √ 一个假设分配&#xff08;第二次是1.4取1&#xff09;加法对比选项 基期倍数&#xff1a; 求A是B的多少倍&#x…

DBeaver纵向展示一行数据

DBeaver查询结果如果列数太多&#xff0c;横着看并不方便&#xff0c;这时可以点击左下角的【记录】按钮&#xff0c;然后可看到纵向的展示结果。如图 就这么一个小功能&#xff0c;没细看的话直接上网搜&#xff0c;不知为啥出来的都是一堆错误方法。所以这里记一下。

2、HDFS编程实践

目录 1、Hadoop三种Shell方式(1)目录操作1、查看目录2、创建目录3、删除目录 &#xff08;2&#xff09;文件操作1、创建文件2、上传文件3、下载文件4、拷贝文件 2、利用Web界面管理HDFS3、利用Java API 与 HDFS 进行交互&#xff08;1&#xff09;安装eclipse包&#xff08;2&…

【Python报错已解决】 Requests.exceptions.ProxyError: HTTPSConnectionPool

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

千益畅行:旅游卡免费服务,包含哪些内容?

​凭此卡可免费旅游&#xff0c;单卡支持2-6人同行&#xff0c;免费服务内容包含&#xff1a;酒店住宿、团餐、景区首道大门票、导游、大巴、旅游责任险、接送机等&#xff0c;目前支持全国40多条旅游线路&#xff0c;爱旅游的朋友们可以约起来&#xff01; #旅游卡服务#