转载:python中的pygame编写飞机大战(六) 碰撞检查

作者:还在琢磨 
来源:CSDN 
原文:https://blog.csdn.net/mbl114/article/details/78075821 
版权声明:本文为博主原创文章,转载请附上博文链接

当英雄飞机发射的子弹击中敌人的飞机,那么敌人飞机和子弹都应该马上消失。根据我们的设计,子弹只需要设置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

这个似乎不难,打飞机就是 打敌人飞机,不让敌人的飞机打我们,所有原作者没有给出 敌人飞机打我们的代码,可以让我们体验英雄的无敌乐趣。

我还是老实点,让英雄也能中弹,但死不了,只是输出一个 结果。

#检查敌人子弹是否和英雄相碰,列出所有的敌人,可以优化下,可见的子弹才碰
        for enemy in self.enemy_list:
            #找到所有子弹
            for bullet in enemy.bullets:
                #碰撞
                if (pygame.Rect.colliderect(bullet.rect, self.hero.rect) 
                      or pygame.Rect.colliderect(enemy.rect,self.hero.rect)):
                # 从预先创建完毕的爆炸中取出一个爆炸对象
                # 下面的代码后面的文章 爆炸效果
                    for bomb in self.bombs:
                        if not bomb.visible:
                            # 爆炸对象设置爆炸位置
                            bomb.set_pos(self.hero.rect[0], self.hero.rect[1])
                            # 爆炸对象状态设置为True
                            bomb.visible = True
                            bullet.visible = False
                            print('hero dead')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值