python - 如何检测 pygame 中的碰撞?
问题描述
我正在制作一款小行星太空射击游戏,但我不知道如何在我的子弹与小行星/外星人,当然还有飞船之间进行碰撞。
我尝试过检查位置,但我的方法过于复杂,落后于游戏,实际上根本不起作用。
我的尝试:
for missile in missiles:
for asteroid in asteroids:
if missiles[missile][0] > asteroids[asteroid][0] or missiles[missile][0] + 20 < asteroids[asteroid][0] + 70:
# remove missile and asteroid
假设我有一颗小行星和一艘船,还有一颗子弹,我想要它,这样当小行星和子弹相撞时,它们都被摧毁而船没有,但是当小行星和船相撞时,它们都被摧毁。
解决方案
PyGame 已经提供了 Sprite 之间的碰撞检测。碰撞检测交给了一些 C 代码,并经过高度优化。您不应该尝试在 Python 中重新评估碰撞计算,因为它肯定不会像 PyGame 的原生解决方案那样快,并且它正在引入新错误的机会。
在此处查看文档:https ://www.pygame.org/docs/ref/sprite.html
它将提供有关如何在精灵之间实现正确碰撞检测的信息。
对于您给定的示例,我假设您的单个导弹和小行星都是 PyGame 中的精灵。
然后我假设单个导弹和小行星在名为“导弹”和“小行星”的 Sprite 组中。
如果这是真的,您可以简单地执行以下操作:
pygame.sprite.groupcollide(missiles, astroids, true, true)
这将检查导弹和小行星之间的碰撞,并杀死/摧毁任何检测到碰撞的精灵。如果您的精灵没有“rect”值,您还可以提供自定义碰撞计算函数来确定碰撞。
推荐阅读
- c# - C#中关闭表单后的使用方法
- cython - 在 Cython 中使用 malloc 进行分配
- php - 使用switch case时函数不返回任何内容
- hashicorp-vault - vault write 和 vault kv put 有什么区别?
- android - 导航抽屉中的默认后退按钮不起作用
- codeigniter - $cofig [modules_locations] 未加载数据表
- postgresql - Docker 容器中 Alpine Linux (arm32v6) 上的 PostgreSQL 9.6.9 - 如何安装正确的 postgresql-contrib 包?
- java - bean:define 的 JSTL 标记替换
- objective-c - Objective-C 代码中的解析错误
- laravel - Laravel cicle foreach 一个垃圾对象