Pygame如何使用精灵和碰撞检测


Posted in Python onNovember 17, 2021

在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。

精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示:

Pygame如何使用精灵和碰撞检测

图1:动作逐帧分解图

如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了动画精灵,您将会看到雄鹰展翅高飞、人在策马奔腾、运动员奋力跳远。

精灵有个特点就是允许精灵之间进行交互,也称之为碰撞,而碰撞检测,指的就是检测两个精灵之间是否发生了碰撞。比如在贪吃蛇游戏中蛇的头部是否与食物发生了碰撞,或者飞机大战游戏中子弹是否击中了外星人等等。当检测到碰撞发生后,接下来会触发某些事件,比如子弹击中外星人,外星人就会消失,玩家的得分也会随之增加,并且在游戏屏幕上又会出现一个外星人。

Pygame 专门提供了一个处理精灵的模块,也就是 sprite(pygame.sprite)模块。通常情况下,我们使用该模块的基类 Sprite 来创建一个子类,从而达到处理精灵的目的,该子类提供了操作精灵的常用属性和方法,如下所示:

 

属性&方法 说明
self.image 加载要显示的精灵图片,控制图片大小和填充色
self.rect 精灵图片显示在哪个位置
Sprite.update() 刷新精灵图,使其相应效果生效
Sprite.add() 添加精灵图到精灵组中(groups)
Sprite.remove() 从精灵组中删除选中的精灵图
Sprite.kill() 删除精灵组中全部的精灵
Sprite.alive() 判断某个精灵是否属于精灵组

注意,当游戏中有大量的精灵时,操作它们将变得复杂,此时通过构建精灵容器(group 类)也就是精灵组来统一管理这些精灵。构建方法如下:

# 创建精灵组
group = pygame.sprite.Group()
# 向组内添加一个精灵
group.add(sprite_one)

于此同时pygame.sprite模块也提供了多种检测精灵是否碰撞的方法,如下所示:

 

方法 说明
pygame.sprite.collide_rect()  两个精灵之间的矩形检测,即矩形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_circle() 两个精灵之间的圆形检测,即圆形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_mask()  两个精灵之间的像素蒙版检测,更为精准的一种检测方式。
pygame.sprite.spritecollide()  精灵和精灵组之间的矩形碰撞检测,一个组内的所有精灵会逐一地对另外一个单个精灵进行碰撞检测,返回值是一个列表,包含了发生碰撞的所有精灵。
pygame.sprite.spritecollideany() 精灵和精灵组之间的矩形碰撞检测,上述函数的变体,当发生碰撞时,返回组内的一个精灵,无碰撞发生时,返回 None。
pygame.sprite.groupcollide() 检测在两个组之间发生碰撞的所有精灵,它返回值是一个字典,将第一组中发生碰撞的精灵作为键,第二个组中发生碰撞的精灵作为值。

下面看一组简单的示例,代码如下所示:

import pygame
class Snake(pygame.sprite.Sprite):
    #定义构造函数
    def __init__(self,filename,location):
        # 调父类来初始化子类
        pygame.sprite.Sprite.__init__(self)
        # 加载图片
        self.image = pygame.image.load(filename)
        # 获取图片rect区域
        self.rect = self.image.get_rect()
        # 设置位置
        self.rect.topleft=location
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((500,400))
pygame.display.set_caption('C语言中文网')
# 填充为白色屏幕
screen.fill((255,255,255))
filename ="C:/Users/Administrator/Desktop/snake.png"
location =(100,150)
snake1 = Snake(filename,location)
# 碰撞检测,必须有两个精灵,因此再创建一个精灵,并使用location来控制第二个精灵的位置
location_2 = (100,80)
snake2 = Snake('C:/Users/Administrator/Desktop/logo.png',location_2)
# 调用 collide_rect()进行矩形区域检测,返回一个布尔值,碰撞返回True,否则返回False
crash_result = pygame.sprite.collide_rect(snake1,snake2)
if crash_result:
    print("精灵碰撞了!")
    pass
else:
    print('精灵没碰撞')
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    # 绘制精灵到屏幕上
    screen.blit(snake1.image,snake1.rect)
    screen.blit(snake2.image,snake2.rect)
    # 刷新显示屏幕
    pygame.display.update()

当精灵没有发生碰撞时,程序的运行结果如下:

Pygame如何使用精灵和碰撞检测

图2:运行结果

接下来,我们将 snake2 的location_2参数变为 (100,140),然后再次运行程序,这时两个精灵就会发生碰撞,运行结果如下:

Pygame如何使用精灵和碰撞检测

图3:运行结果

除上述内容外,Pygame 还提供许多其他模块,比如 mixer(声音)、movie(播放视频)、music(播放音频)、sndarray(操作声音数据)等模块,由于这些模块使用起来较为简单,因此这里不再逐一介绍,感兴趣的朋友可以阅读 Pygame 官方文档 —>点击前往

到此这篇关于Pygame如何使用精灵和碰撞检测的文章就介绍到这了,更多相关Pygame 精灵和碰撞检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
Python使用三种方法实现PCA算法
Dec 12 Python
Python unittest模块用法实例分析
May 25 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
python实现IOU计算案例
Apr 12 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
python利用while求100内的整数和方式
Nov 07 Python
Pygame Event事件模块的详细示例
Nov 17 #Python
利用python做数据拟合详情
Python Matplotlib库实现画局部图
Nov 17 #Python
python实现局部图像放大
Pygame Draw绘图函数的具体使用
Pygame Rect区域位置的使用(图文)
Nov 17 #Python
分析Python list操作为什么会错误
Nov 17 #Python
You might like
20个PHP常用类库小结
2011/09/11 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
php 删除cookie方法详解
2014/12/01 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
vue学习笔记之指令v-text && v-html && v-bind详解
2017/05/12 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
JS实现小星星特效
2019/12/24 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
python简单实现插入排序实例代码
2020/12/16 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
企业安全标语
2014/06/07 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
少先队中队工作总结
2015/08/14 职场文书
小学大队长竞选稿
2015/11/20 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python