《Python飞机大战》项目实战_哔哩哔哩_bilibili
https://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


3215

被折叠的 条评论
为什么被折叠?



