pygame编写飞机大战(8)-碰撞检测

《Python飞机大战》项目实战_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1nw411Y75L/

当英雄飞机发射的子弹击中敌人的飞机,那么敌人飞机和子弹都应该马上消失。根据我们的设计,子弹只需要设置visible属性为False即可,而敌人飞机只需要重新设置下初始位置,飞行速度即可。

我们子弹和飞机都维护了一个矩形,rect(x, y, width, height), 其中x和y是矩形在窗口上的坐标,碰撞检测我们只需要循环遍历每一颗已经发射的子弹,也就是visible为True的子弹和每一个敌人飞机的矩形是否相交,如果相交,说明子弹击中了敌机,我们对应做行为就可以了。

我们现在在GameScene类的detect_conlision函数内做矩形是否相交的检测,这里我们还是比较简单,我们只判断子弹是否和敌人飞机相交,至于英雄飞机和敌人飞机是否相撞,实现思路一样,请大家自行尝试。

    # 碰撞检测
    def detect_conlision(self):
        # 检测英雄子弹是否和敌机碰撞
        for bullet in self.hero.bullets:
            # 如果子弹不可见,说明子弹处于闲置状态,直接continue
            if not bullet.visible:
                continue
            for enemy in self.enemy_list:
                # 判断子弹的矩形和飞机的矩形是否相交
                if pygame.Rect.colliderect(bullet.rect, enemy.rect):
                    # 子弹设置为不可见
                    bullet.visible = False
                    # 敌人飞机重新设置位置和速度
                    enemy.set_pos(random.randint(0, self.size[1] - enemy.rect[2] - 20), 0)
                    enemy.speed = random.randint(2, 5)
                    break

完成程序代码为:

import pygame
import random


# 子弹
class Bullet(object):
    # 初始化子弹
    def __init__(self, scene, enemy=False):
        # 子弹移动速度
        self.speed = 2
        # 是否是敌人子弹
        self.is_enemy = enemy
        # 子弹资源
        if self.is_enemy:
            # 加载敌人子弹图片
            self.image = pygame.image.load("./res/bullet_1.png")
            # 设置子弹移动方向
            self.speed = self.speed
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值