前言
到目前为止,飞船,子弹,外星人的创建,移动都已经完成。接下来我们需要完成功能主要就是子弹击中外星人和飞船接触到外星人两个中功能。
碰撞
我们需要实现的功能中,子弹击中外星人和飞船接触外星人本质上就是两个对象的边界互相接触。如果是单个对象,我们可以使用外接矩形的坐标来进行对象接触的判定,但是子弹和外星人的数量都是多个的,这要怎么判定它们是否接触呢?
在之前子弹与外星人的代码实现中,因为这两个对象的数量都是多个数量,所以我们使用了精灵组的概念,让对应的类继承sprite,从而实现使用组来控制屏幕中的子弹和外星人。而sprite中,将这种接触定义为碰撞,并带有处理组之间接触碰撞的函数。
pygame.sprite.spritecollideany
pygame.sprite.spritecollideany 是 Pygame 模块中的一个函数,用于检测两个精灵组之间的碰撞。这个函数会检查给定的精灵是否与另一个精灵组中的任何精灵发生碰撞。
参数说明
- sprite: 你要检测其是否与其他精灵发生碰撞的单个精灵对象。
- group: 一个精灵组,pygame.sprite.Group 对象,其中包含了多个精灵。
- collided: 可选参数,一个回调函数,用于自定义碰撞检测逻辑。如果未提供,则使用默认的矩形碰撞检测。
返回值
- 如果 sprite 与 group 中的任意精灵发生碰撞,则返回第一个发生碰撞的精灵;如果没有发生碰撞,则返回 None。
这个函数是用于单个单个精灵对象与精灵组之间的碰撞。那么在飞船与外星人的碰撞判断中,我们可以使用这个函数。
pygame.sprite.groupcollide
pygame.sprite.groupcollide 是 Pygame 中的一个函数,用于检测两个精灵组之间的碰撞。当你需要检查一组精灵是否与另一组精灵中的任何精灵发生碰撞时,这个函数非常有用。
参数说明
- group1: 第一个精灵组,通常为 pygame.sprite.Group 类型。
- group2: 第二个精灵组,同样为 pygame.sprite.Group 类型。
- dokill1: 布尔值,如果为 True,则在发生碰撞后,group1 中的精灵将被销毁。
- dokill2: 布尔值,如果为 True,则在发生碰撞后,group2 中的精灵将被销毁。
- collided: 可选参数,一个回调函数,用于自定义碰撞检测逻辑。如果未提供,则使用默认的矩形碰撞检测。
返回值 - 函数返回一个字典,其中键是 group1 中的精灵,值是与该精灵发生碰撞的 group2 中的精灵列表。
看看多贴心,甚至将碰撞的精灵(对象)都给你销毁了。
这个函数很明显,就非常适合于子弹与外星人的碰撞处理。
那么,开始进行我们实际的代码编写吧!
子弹击中外星人
作为子弹与外星人的碰撞,子弹是主动的一方,去撞击外星人,所以我们直接在子弹更新的函数中,对其与外星人进行碰撞处理。
那么我们的代码要作出如下改动:
- 在
main模块中,更新子弹位置的函数需要增加一个外星人组的参数,用与碰撞。 - 在
gf模块中,更新子弹的函数中,调用函数pygame.sprite.groupcollide
main模块修改gf.update_bullets()参数,代码如下:
import pygame
from pygame.sprite import Group
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Ship
def run_game():
"""启动游戏"""
--snip--
while True:
# 处理监听事件
gf.check_event(ship, setting, screen

最低0.47元/天 解锁文章
6485

被折叠的 条评论
为什么被折叠?



