作者:还在琢磨
来源: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')