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__