一文详解pygame.sprite的精灵碰撞
作者:peanutfish 发布时间:2022-08-13 23:09:11
前言
pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用。
pygame.sprite.Sprite - 可见游戏对象的简单基类。
Sprite(*groups) -> Sprite
pygame.sprite.Sprite.add - 将精灵添加到组中
pygame.sprite.Sprite.remove - 从组中删除精灵
pygame.sprite.Sprite.kill - 从所有组中删除Sprite
pygame.sprite.Sprite.alive - 精灵属于任何组的检测
pygame.sprite.Sprite.groups - 包含此Sprite的组列表
pygame.sprite.Sprite.update - 控制精灵行为的方法
pygame.sprite.Group - 用于保存和管理多个 Sprite 对象的容器类。
Group(*sprites) -> Group
pygame.sprite.Group.sprites - 此组包含的 Sprite 列表
pygame.sprite.Group.copy - 复制组
pygame.sprite.Group.add - 将 Sprite 添加到此组
pygame.sprite.Group.remove - 从组中删除 Sprite
pygame.sprite.Group.has - 测试一个 Group 是否包含 Sprite
pygame.sprite.Group.update - 在包含的 Sprite 上调用 update 方法
pygame.sprite.Group.draw - blit Sprite 的图像
pygame.sprite.Group.clear - 在 Sprites 上绘制背景
pygame.sprite.Group.empty - 删除所有 Sprite`
上面两个基类是pygame中最常用,相当轻量级,只为大多数游戏常见的代码提供了一个起始点。
Sprite 类旨在用作游戏中不同类型对象的基类,为我们碰撞检测做准备。还有一个基本的 Group 类,它只存储 sprite 对象, 这样方便不同类型的精灵进行碰撞检测, 通常的操作 in / len / bool / iter 都对这个group使用。
in test if a Sprite is contained
len the number of Sprites contained
bool test if any Sprites are contained
iter iterate through all the Sprites
pygame.sprite.spritecollide() - 在与另一个精灵相交的组中查找精灵
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list
返回一个sprite列表,其中包含与另一个 Sprite 相交的 Group 中的所有 Sprite 。 通过比较每个 Sprite 的 Sprite.rect 属性来确定交集。
dokill 参数是一个布尔值。如果设置为 True,则将从组中删除所有碰撞的 Sprite 。
collided 碰撞参数是一个回调函数,用于计算两个精灵是否发生碰撞。 它应该将两个精灵作为值,并返回一个 bool 值,指示它们是否发生碰撞。 如果未传递碰撞,则所有精灵必须具有 rect 值,该值是 sprite 区域的矩形,将用于计算碰撞。
可用的回调函数
collide_rect, collide_rect_ratio, collide_circle,
collide_circle_ratio, collide_mask
pygame.sprite.collide_rect - 使用 rects 检测两个精灵之间的碰撞。
Collision detection between two sprites, using rects. 使用函数pygame rect colliderect检测碰撞并将结果返回给*collide, 精灵必须具有 ‘rect’ 属性。
collide_rect(left, right) -> bool
pygame.sprite.collide_rect_ratio - 使用按比例缩放的 rects 检测两个精灵之间的碰撞。
Collision detection between two sprites, using rects scaled to a ratio. 使用 ratio 创建,然后将实例作为碰撞回调函数传递给 *collide 函数。
ratio 是浮点数 - 1.0 是相同的大小,2.0 是两倍大,0.5 是大小的一半。
collide_rect_ratio(ratio) -> collided_callable
pygame.sprite.collide_circle - 使用圆圈检测两个精灵之间的碰撞。
*Collision detection between two sprites, using circles.*测试两个精灵之间的碰撞,通过测试以查看精灵中心的两个圆是否重叠。
如果精灵具有 radius(半径) 属性,用于创建圆,否则会创建一个足够大的圆,以完全包围由 rect 属性给出的精灵矩形。作为碰撞回调函数传递给 *collide 函数。精灵必须具有 rect 和可选的 radius 属性。
collide_circle(left, right) -> bool
pygame.sprite.collide_circle_ratio - 使用按比例缩放的圆圈检测两个精灵之间的碰撞。
Collision detection between two sprites, using circles scaled to a ratio. 使用浮点数 ratio 创建,然后将实例作为碰撞回调函数传递给 *collide 函数。ratio 是浮点数 - 1.0 是相同的大小,2.0 是两倍大,0.5 是大小的一半。
两个精灵之间的碰撞创建的可调用测试,通过测试以查看以精灵为中心的两个圆是否重叠,在通过存储的比例缩放圆半径之后。如果精灵具有 radius 半径属性,用于创建圆,否则会创建一个足够大的圆,以完全包围由 rect 属性给出的精灵矩形。打算作为碰撞回调函数传递给 *collide 函数。
精灵必须具有 rect 和可选的 radius 属性。
collide_circle_ratio(ratio) -> collided_callable
pygame.sprite.collide_mask - 使用蒙版在两个精灵之间进行碰撞检测。
*Collision detection between two sprites, using masks. *返回 masks 碰撞的 mask 上的第一个点,如果没有碰撞,则返回 None 。
通过测试它们的 bitmasks( pygame.mask.Mask.overlap()
) 是否重叠来测试两个精灵之间的碰撞。 如果精灵具有 mask 属性,该属性用作 mask,否则将从精灵图像创建 mask 。 作为碰撞回调函数传递给 *collide 函数。
精灵必须具有 rect 和可选的 mask 属性。
如果要多次检查碰撞,应该考虑在加载时为精灵创建一个mask。这将提高性能,否则这可能是一个昂贵的功能,因为它会在每次检查碰撞时创建 mask 。
# Example of mask creation for a sprite.
sprite.mask = pygame.mask.from_surface(sprite.image)
collide_mask(sprite1, sprite2) -> (int, int)
collide_mask(sprite1, sprite2) -> None
pygame.sprite.groupcollide - 查找在两个组之间发生碰撞的所有精灵。
Find all sprites that collide between two groups.
This will find collisions between all the Sprites in two groups. Collision is determined by comparing the
Sprite.rect
attribute of each Sprite or by using the collided function if it is not None.
Every Sprite inside group1 is added to the return dictionary. The value for each item is the list of Sprites in group2 that intersect. 像这个格式{group1_sprite: group2_sprite}如果*collide没有指定回调函数,则所有的sprite需要有rect属性
groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict
EG:
class Block(pygame.sprite.Sprite):
# Constructor. Pass in the color of the block,
# and its x and y position
def __init__(self, color, width, height):
# Call the parent class (Sprite) constructor
pygame.sprite.Sprite.__init__(self)
# Create an image of the block, and fill it with a color.
# This could also be an image loaded from the disk.
self.image = pygame.Surface([width, height])
self.image.fill(color)
# Fetch the rectangle object that has the dimensions of the image
# Update the position of this object by setting the values of rect.x and rect.y
# give radius and mask attribute
self.rect = self.image.get_rect()
self.radius = self.rect.width / 2
self.mask = pygame.image.from_surface(self.image)
class File(pygame.sprite.Sprite):
# Constructor. Pass in the color of the block,
# and its x and y position
def __init__(self, color, width, height):
# Call the parent class (Sprite) constructor
pygame.sprite.Sprite.__init__(self)
# Create an image of the block, and fill it with a color.
# This could also be an image loaded from the disk.
self.image = pygame.Surface([width, height])
self.image.fill(color)
# Fetch the rectangle object that has the dimensions of the image
# Update the position of this object by setting the values of rect.x and rect.y
self.rect = self.image.get_rect()
self.radius = self.rect.width / 2
self.mask = pygame.image.from_surface(self.image)
block_group = pygame.sprite.Group()
for i in range(5):
block = Block(color, width, height)
block_group.add(block)
# there is another sprite group called file_group, which have same setting as block_group.
file_group = pygame.sprite.Group()
for i in range(5):
file = File(color, width, height)
file_group.add(file)
# the collide check will like:
hit_list1 = pygame.sprite.spritecollide(block, file_group, False, pygame.sprite.collide_rect
hit_list2 = pygame.sprite.spritecollide(block, file_group, False, pygame.sprite.collide_rect_ratio(.75))
hit_list3 = pygame.sprite.spritecollide(block, file_group, False, pygame.sprite.collide_circle
hit_list4 = pygame.sprite.spritecollide(block, file_group, False, pygame.sprite.collide_circle_ratio(.25))
hit_list5 = pygame.sprite.spritecollide(block, file_group, False, pygame.sprite.collide_mask
# select the collided function whatever you like
hit_list6 = pygame.sprite.spritecollide(block_group, file_group, False, False, pygame.sprite.collide_XXX)
来源:https://blog.csdn.net/peanutfish/article/details/123935394
猜你喜欢
- 最近项目使用c++操作Python脚本,选用boost.python库。在window下编译安装很顺利,但是在Linux下一直编译不通过,总
- MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(
- pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在
- python-docx的简单使用'''设置表格所有单元格的四个边为0.5磅,黑色,实线可以使用返回值,也可以不使用&
- python从ftp上下载文件的方法:首先导入ftp模块;然后使用【chdir】命令切换工作路径;再使用“self.ftp.nlst()”命
- 前言:pandas中排序的几种常用方法,主要包括sort_index和sort_values。基础数据:import pandas as p
- 如下所示:def list_dict_duplicate_removal(): data_list = [{"a&qu
- 之前有写利用md5方式来做差异备份,但是这种md5方式来写存在以下问题:•md5sum获取有些软连接的MD5值存在问题 •不支持对空目录进行
- mapmap(function,iterable)x = [1,2,3,4,5]def square(num): return num*nu
- import numpy as npimport pandas as pdimport matplotlib.pylab as pltif
- 这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 实例 1基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径。/AAA选择根
- 一、技术背景损失函数是机器学习中直接决定训练结果好坏的一个模块,该函数用于定义计算出来的结果或者是神经网络给出的推测结论与正确结果的偏差程度
- 这篇文章主要介绍了python列表生成器迭代器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 目的:基于办公与互联网隔离,自带的office软件没有带本地帮助工具,因此在写vba程序时比较不方便(后来发现07有自带,心中吐血,瞎折腾些
- Session作用Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:1、判断用户是否登录。2、购物车功能。s
- 需要准备环境:python3.6、vultr(或者其他服务器)、xshell第一步:python安装必备环境Django库Xshell链接远
- 由于网络带宽以及某些WAP服务器DECK传输的限制,所以DECK越小越好,最好不要超过1.2K。如果你的需求很复杂,最好分成几个DECK来完
- 上一小节讲解了行高与单行纯文字的垂直居中,而如果行内含有图片和文字,在浏览器内浏览时,读者可以发现文字和图片在垂直方向并不是沿中线居中,而是
- 一、SQLAlchemy简介1.1、SQLAlchemy是什么?sqlalchemy是一个python语言实现的的针对关系型数据库的orm库