想请老师帮我看一下,我的子弹为什么打不死敌人!其他的都可以满足

想请老师帮我看一下,我的子弹为什么打不死敌人!其他的都可以满足

"""
                   飞机的基类
       我方的飞机       敌方的小型飞机       敌方的中型飞机       敌方的大型飞机
"""
import random

import pygame
import constants
from game.bullet import Bullet


class Plane(pygame.sprite.Sprite):
   """
   飞机的基础类
   """
   # 飞机的图片
   plane_images = []
   # 飞机爆炸的图片
   destroy_images = []
   # 坠毁的音乐地址
   down_sound_src = None
   #飞机的状态: True,活的,False,死的
   active = True
   # 该飞机发射的子弹精灵组
   bullets = pygame.sprite.Group()

   def __init__(self,screen ,speed=None):
       super().__init__()
       self.screen = screen
       # 加载静态资源
       self._img_list = []
       self._destroy_img_list = []
       self.down_sound = None
       self.load_src()

       #飞行的速度
       self.speed = speed or 10
       # 获取飞机的位置
       self.rect = self._img_list[0].get_rect()

       # 游戏窗口的宽度和高度
       self.width, self.height = self.screen.get_size()
       # 飞机的体积计算
       self.P_width, self.P_height = self._img_list[0].get_size()

       #改变飞机的初始化位置,放在屏幕下方
       self.rect.left = int((self.width - self.P_width)/2)
       self.rect.top = int(self.height - self.P_height)

   def load_src(self):
       """加载静态资源"""
       # 飞机图像
       for img in self.plane_images:
           self._img_list.append(pygame.image.load(img))
       # 飞机坠毁的图片
       for img in self.destroy_images:
           self._destroy_img_list.append(pygame.image.load(img))
       #坠毁的音乐
       if self.down_sound_src:
           self.down_sound = pygame.mixer.Sound(self.down_sound_src)

   @property
   def image(self):
       return self._img_list[0]

   def blit_me(self):
       self.screen.blit(self.image, self.rect)

   def move_up(self):
       """飞机向上移动"""
       self.rect.top -= self.speed

   def move_down(self):
       """飞机向下移动"""
       self.rect.top += self.speed
   def move_left(self):
       """飞机向左移动"""
       self.rect.left -= self.speed

   def move_right(self):
       """飞机向右移动"""
       self.rect.left += self.speed


   def broken_down(self):
       """飞机坠毁效果"""
       #1.播放坠毁音乐
       if self.down_sound:
           self.down_sound.play()
       #2.播放坠毁的动画
       for img in self._destroy_img_list:
           self.screen.blit(img, self.rect)
       #3.坠毁后..
       self.active = False


   def shoot(self):
       """飞机发射子弹"""
       bullet = Bullet(self.screen,self,50)
       self.bullets.add(bullet)


class OurPlane(Plane):
   """我方的飞机"""
   #飞机的图片
   plane_images = [constants.OUR_PALNE_IMG_1,constants.OUR_PALNE_IMG_2]
   #飞机爆炸的图片
   destroy_images = constants.OUR_DESTROY_IMG_LIST
   #坠毁的音乐地址
   down_sound_src = None

   def update(self,war):
       """更新飞机的动画效果"""
       #1. 切换飞机的动画效果
       if war.frame % 5:
           self.screen.blit(self._img_list[0],self.rect)
       else:
           self.screen.blit(self._img_list[1],self.rect)
       # 飞机撞击检测
       rest = pygame.sprite.spritecollide(self,war.enemies,False)
       if rest:
           #1.游戏结束
           war.status = war.OVER
           #2.敌方飞机清除
           war.enemies.empty()
           war.small_enemies.empty()
           #3.我方飞机坠毁
           self.broken_down()
           #4.记录游戏成绩


   def move_up(self):
       """向上移动,超出范围之后,不能出屏幕范围"""
       super().move_up()
       if self.rect.top <= 0:
           self.rect.top = 0

   def move_down(self):
       """向下移动,超出范围之后,不能出屏幕范围"""
       super().move_down()
       if self.rect.top >= self.height - int(self.P_height):
           self.rect.top = self.height- int(self.P_height)

   def move_left(self):
       """向左移动,超出范围之后,不能出屏幕范围"""
       super().move_left()
       if self.rect.left <= 0:
           self.rect.left = 0

   def move_right(self):
       """向右移动,超出范围之后,不能出屏幕范围"""
       super().move_right()
       if self.rect.left >= self.width - int(self.P_width):
           self.rect.left = self.width - int(self.P_width)


class SmallEnemyPlane(Plane):
   """敌方的小型飞机"""
   # 飞机的图片
   plane_images = constants.SMALL_ENEMY_PLANE_IMG
   # 飞机爆炸的图片
   destroy_images = constants.SMALL_ENEMY_DESTROY_IMG_LIST
   # 坠毁的音乐地址
   down_sound_src = constants.SMALL_ENEMY_PLANE_DOWN_SOUND

   def __init__(self, screen, speed):
       super().__init__(screen, speed)
       #每次生成一架新的小型飞机的时候,随机的位置出现在屏幕中
       #改变飞机的随机位置
       self.init_pos()


   def init_pos(self):
       """改变飞机的随机位置"""
       #屏幕的宽度-飞机的宽度
       self.rect.left = random.randint(0,self.width - self.P_width)
       # 屏幕之外的随机高度
       self.rect.top = random.randint(-5 * self.P_height, -self.P_height)

   def update(self, *args):
       """更新飞机的移动"""
       super().move_down()

       #画在屏幕上
       self.blit_me()

       # 超出范围后如何处理
       # 1. 重用
       if self.rect.top >= self.height:
           self.active = False
           # self.kill()
           self.reset()
       # todo 2. 多线程,多进程

   def reset(self):
       """ 重置飞机的状态,达到复用的效果 """
       self.active = True
       # 屏幕的宽度-飞机的高度
       self.init_pos()

   def broken_down(self):
       """飞机坠毁效果"""
       super().broken_down()
       # 重复利用飞机对象
       self.reset()

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕美 2020-07-08 09:44:42

同学,你好。在调用broken_down()方法时,缺少括号

http://img1.sycdn.imooc.com//climg/5f0524cf09d0303c03680215.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~

提问者 weixin_慕的地2281013 2020-07-07 23:10:27

图中是war代码,因为超过1500字节,只能发图片!

http://img1.sycdn.imooc.com//climg/5f04902d0973bf7a05280778.jpg

http://img1.sycdn.imooc.com//climg/5f04902d09acac2705590775.jpg

http://img1.sycdn.imooc.com//climg/5f04902d09af7e2007460775.jpg

http://img1.sycdn.imooc.com//climg/5f04902e09e6df6306020591.jpg


好帮手慕美 2020-07-07 09:44:38

同学,你好。同学可以看下子弹类中碰撞检测功能的代码有没有写错,或者同学可以将相关代码提供下,方便更好的为您解决

http://img1.sycdn.imooc.com//climg/5f03d34f093bf0e409600735.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 没有办法直接上传压缩包,不然我就传了,只能这样复制了,麻烦老师了: import pygame import constants class Bullet(pygame.sprite.Sprite): """子弹类""" # 子弹状态,True: 活着 active = True def __init__(self,screen,plane,speed=None): super().__init__() self.screen = screen #速度 self.speed = speed or 20 self.plane = plane #加载子弹的图片 self.image = pygame.image.load(constants.BULLET_IMG) # 改变子弹的位置 self.rect = self.image.get_rect() self.rect.centerx = plane.rect.centerx self.rect.top = plane.rect.top # 发射的音乐效果 self.shoot_sound = pygame.mixer.Sound(constants.BULLET_SHOOT_SOUND) self.shoot_sound.set_volume(0.3) self.shoot_sound.play() def update(self, war): """更新子弹的位置""" self.rect.top -= self.speed #超出屏幕的范围 if self.rect.top < 0: self.remove(self.plane.bullets) print(self.plane.bullets) #绘制子弹 self.screen.blit(self.image, self.rect) #子弹的碰撞检测,检测子弹是否已经碰撞到了敌机 rest = pygame.sprite.spritecollide(self,war.enemies,False) print(rest,666) for r in rest: # 1. 子弹消失 self.kill() # 2. 飞机爆炸,坠毁效果 r.broken_down # 3. 统计游戏成绩
    2020-07-07 23:00:59
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师