返回顶部
首页 > 资讯 > 后端开发 > Python >一文详解pygame.sprite的精灵碰撞
  • 727
分享到

一文详解pygame.sprite的精灵碰撞

Python 官方文档:入门教程 => 点击学习

摘要

目录前言pygame.sprite.Sprite - 可见游戏对象的简单基类。pygame.sprite.Group - 用于保存和管理多个 Sprite 对象的容器类。pygame

前言

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)

总结

到此这篇关于pygame.sprite精灵碰撞的文章就介绍到这了,更多相关pygame.sprite精灵碰撞内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文详解pygame.sprite的精灵碰撞

本文链接: https://lsjlt.com/news/178338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文详解pygame.sprite的精灵碰撞
    目录前言pygame.sprite.Sprite - 可见游戏对象的简单基类。pygame.sprite.Group - 用于保存和管理多个 Sprite 对象的容器类。pygame...
    99+
    2023-01-28
    pygame精灵碰撞代码 pygame.sprite精灵碰撞 pygame精灵碰撞检测
  • Python Pygame中精灵和碰撞检测详解
    Pygame精灵和碰撞检测 今天来看看python最出名的游戏库pygame。学习两个名词:精灵和碰撞检测。 精灵英文字母是Sprite。Sprite是二维的图形,在游戏中可以用做各...
    99+
    2024-04-02
  • 详解教你Win10如何使用一键还原精灵
    一键还原精灵是Windows 10操作系统自带的恢复工具,可以帮助用户在系统出现问题时恢复到之前的状态。下面是详细的使用教程:1. ...
    99+
    2023-09-17
    win10
  • Android Flutter实现精灵图的使用详解
    目录前言如何使用精灵图自定义实现加载Flame加载精灵图前言 在日常开发中遇到的图片展示一般是静态图和Gif图两种形式(静态和动态的不同)。与此同时当需要对图片做效果时让其动起来,常...
    99+
    2024-04-02
  • Python与计算机视觉的精彩碰撞:从图像理解到人工智能的无限可能
    图像处理与分析 Python丰富的图像处理库和工具,使得其在图像处理与分析方面具有强大的功能。像Scikit-image、OpenCV和Pillow等库提供了各种图像处理和分析功能,如图像读写、图像格式转换、图像增强、图像分割、特征提取等...
    99+
    2024-02-07
    Python 计算机视觉 图像处理与分析 机器学习 深度学习 图像理解 人工智能。
  • 一文详解PHPJSV8的用法
    PHPJSV8 是一个基于 V8 引擎的 PHP 扩展,它允许你在 PHP 中运行 JavaScript 代码。本文将介绍 PHPJSV8 的用法。安装 PHPJSV8要使用 PHPJSV8,首先需要将它安装到你的 PHP 环境中。以下是通...
    99+
    2023-05-14
  • 一文详解JavaScript中的Mixin
    目录什么是 Mixin显示混入隐式混入总结类的出现最终使 JavaScript 非常容易使用继承语法,JavaScript 类比大多数人意识到的更强大,它是构建真正的 mixins ...
    99+
    2023-05-18
    JavaScript 中的 Mixin JavaScript Mixin介绍 JavaScript Mixin
  • 一文详解git push的用法
    git push的用法在软件开发中,GIT是一种常用的版本控制系统,常常用来协作开发和版本控制。其中,git push是GIT中的一个命令,是将本地的代码提交到远程仓库的命令。本文主要介绍git push的用法及其相关注意事项。基础用法gi...
    99+
    2023-10-22
  • 一文详解Golang中的反射
    本篇文章带大家主要来聊聊Golang中反射,希望对你有新的认知。虽然很多人使用 Go 语言有一定时间了,甚至有的使用了 1 年 2 年,然后对于 Go 语言中的反射还是模棱两可,使用起来的时候,心里也不是非常有底气。【相关推荐:Go视频教程...
    99+
    2023-05-14
    反射 go语言 Golang
  • 一文详解golang中的注释
    Golang是一种编程语言,它有着比较高的代码可读性和简洁性。然而,在编写代码时,总有些地方需要添加注释来帮助解释某些细节或者增加代码的可读性。在这篇文章中,我们将介绍一些关于Golang注释的内容。一、单行注释单行注释是在代码行的末尾添加...
    99+
    2023-05-14
    go语言 Golang 注释
  • 一文详解Golang中的方法
    Golang(也被称为Go)是一种并发编程语言,它是由谷歌公司开发的。Golang很流行,因为它的代码简洁、易读并且能够处理高并发。一个Golang程序在编写时包含有函数和方法,本文将会关注Golang的方法。方法是面向对象编程中的关键部分...
    99+
    2023-05-14
    Golang go语言
  • 一文详解JavaScript中的闭包
    JavaScript 闭包是一种重要的概念,在 JavaScript 编程中被广泛使用。尽管它可能会让初学者感到困惑,但它是理解 JavaScript 语言核心的关键概念之一。本文将深入探讨 JavaScript 闭包,让你了解它是如何工作...
    99+
    2023-05-14
    闭包 前端 JavaScript
  • 一文详解JavaNetty中的Constant类
    目录ConstantChannelConfigNetty中重要的Constant实现类:ChannelOption和AttributeKeyChannelOptionAttribut...
    99+
    2023-05-19
    Java Netty中的Constant类 Netty Constant类 Java Constant
  • Golang文件读取的方法详解:从入门到精通
    Golang文件读取的方法详解:从入门到精通 Golang是一种有着强大且高效的编程语言,被广泛应用于云计算、大数据和网络编程等领域。在这些应用场景中,文件读取是一项基本的操作。本文将介绍Golang的文件读...
    99+
    2024-01-19
    Golang 文件读取 精通
  • 一文详解Golang中的位操作
    本篇文章带大家深入了解下Golang中的位操作,介绍一下详述每个操作符以及它们如何使用的案例,希望对大家有所帮助!php零基础到就业直播视频课:进入学习全程直播 + 实战授课 + 边学 + 边练 + 边辅导【推荐】《接口如何自动化测试?单流...
    99+
    2024-04-02
  • 一文详解Redis中的持久化
    目录1. 前言2. RDB2.1 手动触发2.2 自动触发3. bgsave大致流程4. RDB持久化方式的优缺点5. AOF6. AOF的使用方式7. AOF流程剖析7.1 命令写入7.2 文件同步7.3 重写机制7....
    99+
    2024-04-02
  • 一文详解Python中的super 函数
    目录实战场景实战编码单继承使用实战场景 经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? super() 函数...
    99+
    2024-04-02
  • 一文详解JavaScript中prototype的使用
    目录prototype初步认识函数有prototype属性,函数创建的对象没有获得当前对象的属性父和子的扩展子的proto和prototype的区别扩展得到的东西到底从哪来的prot...
    99+
    2024-04-02
  • 一文详解SpringSecurity的基本用法
    目录1.引入依赖2.用户名和密码在哪里设置3.UserDetailsService接口详解3.1JdbcDaoImpl实现类3.2InMemoryUserDetailsManager...
    99+
    2024-04-02
  • 一文详解Oracle中RAC的用法
    目录1. oracle RAC介绍1.1 基本概念1.2 Oracle RAC应用场景1.3 Oracle RAC的优缺点2. Oracle RAC架构3. Oracle RAC 的安装1. Oracle RAC介绍 1...
    99+
    2023-06-16
    Oracle RAC用法 Oracle RAC
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作