99网
您的当前位置:首页(十)通过pygame来进行碰撞检测

(十)通过pygame来进行碰撞检测

来源:99网

python飞机大战系列文章(按顺序)











什么是碰撞检测

pygame提供了两个方法可以实现碰撞检测

方法一:pygame.sprite.groupcollide()

  • pygame.sprite.groupcollide()–两个精灵组中所有精灵的碰撞检测
groundcollide(group1,group2,dokill1,dokill2,collided = None)

解读:
若dokill1=True:如果group1和group2发生碰撞,group1中的精灵就会被自动销毁

若dokill2=True:如果group1和group2发生碰撞,group2中的精灵就会被自动销毁

【我们在飞机大战中,当子弹碰到敌机,两者应该都同时被销毁。所以dokill1=True,dokill2=True】

collided参数是用于计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个rect属性

代码如下:

def __check_collide(self):

    #子弹摧毁敌机
    pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)

方法二: pygame.sprite.spritecollide()

  • pygame.sprite.spritecollide() —判断某个精灵和指定精灵组中的精灵的碰撞
spritecollide(sprite, group, dokill, collided = Noone)

解读:
若dokill值为True,则指定精灵组中发生碰撞的精灵会被自动移除

collided参数是用于计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个rect属性

返回值是 精灵组 中跟 精灵 发生碰撞的精灵列表

注意: 这里只能设置当敌机撞到英雄后,敌机被自动销毁,但是这显然不符合游戏需求,我们要求的是 当敌机撞到英雄时:英雄牺牲,并且结束游戏,那么需要怎么做呢?-----因为spritecollide的返回值是 精灵组 中跟 精灵 发生碰撞的精灵列表,我们可以来接收列表的值,如果列表有值,那么我们就让英雄牺牲,并且结束游戏

代码如下:

#敌机撞英雄
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
#判断是否有内容
if len(enemies) > 0:

    #牺牲英雄飞机
    self.hero.kill()
    #结束游戏
    PlaneGame.__game_over()

至此,plane_sprites.py完整代码为:

import random
import pygame

#屏幕大小的常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC = 60
#创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
#英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 1

class GameSprite(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    def __init__(self, image_name, speed=1):

        #调用父类的初始化方法
        super().__init__

因篇幅问题不能全部显示,请点此查看更多更全内容