Python学习笔记48:游戏篇之外星人入侵(九)

前言

到目前为止,飞船,子弹,外星人的创建,移动都已经完成。接下来我们需要完成功能主要就是子弹击中外星人和飞船接触到外星人两个中功能。

碰撞

我们需要实现的功能中,子弹击中外星人和飞船接触外星人本质上就是两个对象的边界互相接触。如果是单个对象,我们可以使用外接矩形的坐标来进行对象接触的判定,但是子弹和外星人的数量都是多个的,这要怎么判定它们是否接触呢?

在之前子弹与外星人的代码实现中,因为这两个对象的数量都是多个数量,所以我们使用了精灵组的概念,让对应的类继承sprite,从而实现使用组来控制屏幕中的子弹和外星人。而sprite中,将这种接触定义为碰撞,并带有处理组之间接触碰撞的函数。

pygame.sprite.spritecollideany

pygame.sprite.spritecollideanyPygame 模块中的一个函数,用于检测两个精灵组之间的碰撞。这个函数会检查给定的精灵是否与另一个精灵组中的任何精灵发生碰撞。

参数说明

  • 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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值