广告位联系
返回顶部
分享到

pygame.sprite的精灵碰撞的介绍

python 来源:互联网 作者:佚名 发布时间:2023-01-26 10:39:25 人浏览
摘要

pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用。 pygame.sprite.Sprite - 可见游戏对象的简单基类。 Sprite(*groups

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使用。

1

2

3

4

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 区域的矩形,将用于计算碰撞。

可用的回调函数

1

2

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 。

1

2

# 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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

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)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://blog.csdn.net/peanutfish/article/details/123935394
    Tag :
相关文章
  • pip安装python库时报Failed building wheel for xxx错误的解

    pip安装python库时报Failed building wheel for xxx错误的解
    一、问题描述 如题,在使用pip install xxx的方法安装python库,或者是基于python的软件时,报错ERROR: Failed building wheel for xxx(某个库) 这个报错
  • pygame.sprite的精灵碰撞的介绍

    pygame.sprite的精灵碰撞的介绍
    pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用。 pygame.sprite.S
  • python利用lxml库剩下操作svg图片

    python利用lxml库剩下操作svg图片
    在大多数场景中,我们都用lxml库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析
  • Python学习之configparser模块的使用

    Python学习之configparser模块的使用
    1 configparser安装 1 pip3 install configparser 2 configparser简介 用来读取配置文件的python包; 一般做自动化测试的时候,会使用到这个模块,用来封装
  • 20个解决日常编程问题的Python代码

    20个解决日常编程问题的Python代码
    使用这些有用的 Python 代码片段提升你的编程技能,在本文中,我将分享 20 个 Python 代码片段,以帮助你应对日常编程挑战,你可能已经知道
  • Python实现.gif图片拆分为.png图片的实现

    Python实现.gif图片拆分为.png图片的实现
    实现效果展示: 未转化前的gif图片 经转化后: ---------------------------------------------------------------------------------------图一-------------------------
  • pandas实战:分析三国志人物的实现

    pandas实战:分析三国志人物的实现
    简介 背景 Pandas 是 Python 的一个工具库,用于数据分析。 由 AQR Capital Management 于 2008 年 4 月开发,2009 年开源,最初被作为金融数据分析工具
  • 教你用Python提取PPT中的图片

    教你用Python提取PPT中的图片
    一、前言 今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到
  • Python3微信支付(小程序支付)V3接口的实现
    起因: 因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付
  • YOLOv8训练自己的数据集(详细教程)

    YOLOv8训练自己的数据集(详细教程)
    等了好久终于等到了V8,赶紧测测效果,放张官网的比对图 官网链接 https://github.com/ultralytics/ultralytics 再下载自己所需要的权重 https://githu
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计