AttributeError:

AttributeError:

bullet.py

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.plane = plane
       self.speed = speed or 10

       # 加载子弹的图片
       image = pygame.image.load(constants.BULLET_IMG)

       # 改变子弹的位置
       rect = image.get_rect()
       rect.centerx = plane.rect.centerx
       rect.top = plane.rect.top

       # 发射的音乐效果
       shoot_sound = pygame.mixer.Sound(constants.BULLET_SHOOT_SOUND)
       shoot_sound.set_volume(0.3)
       shoot_sound.play()

   def update(self, *args):
       """ 更新子弹的位置 """
       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)

ps: 运行的时候出现这样的错误,

AttributeError: 'OurPlane' object has no attribute 'rect'


正在回答

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

3回答

同学你好:这一部分代码中出现的问题是image和rect及shoot_sound的前面需要加上self.,表示是实例属性,如下图。

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

而报错的AttributeError: 'OurPlane' object has no attribute 'rect'也是类似的原因,但出现在plane.py的代码中,同学可以自行检查一下,如果找不到原因请提供一下plane.py的代码,方便老师定位问题。

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


  • MaxLu 提问者 #1
    我还是没有发现错误出在哪里,plane.py 的代码我上传在下面了
    2020-05-30 17:52:34
  • 好帮手慕觉浅 回复 提问者 MaxLu #2
    同学你好:AttributeError: 'OurPlane' object has no attribute 'rect' 这个报错是说'OurPlane'对象没有'rect'属性。通过你plane.py中的代码可以看出同学将课程中的rect属性更名为了plane_rect,但相对应的调用时没有修改,还是使用rect调用,因此会报错。同学可以找到提示错误的具体哪一行,然后将rect改成plane_rect即可。或者将plane.py中的所有plane_rect改成rect也可以,同学可以使用Ctrl+R快捷键,在上面的框中输入plane_rect,在下面的框中输入rect,然后点击Replace All,这样可以快速替换。 如果解决了你的疑惑,请采纳,祝学习愉快~
    2020-05-30 18:11:33
提问者 MaxLu 2020-05-30 17:51:40

我又回去看了一遍课程,然后回来还是没有发现错误出在哪里,下面是plane.py 的代码

import constants
import pygame

from game.bullet import Bullet


class Plane(pygame.sprite.Sprite):
   """
   飞机基础类
   """
   # 飞机的图片
   plane_images = []

   # 飞机状态, True:飞机存活, False:飞机坠毁
   active = True

   # 子弹精灵组
   bullets = pygame.sprite.Group()

   def __init__(self, screen, speed=None):
       super().__init__()
       self.screen = screen
       self.speed = speed or 10
       self.img_list = []

       self.load_src()
       # 飞机的初始位置
       self.plane_rect = self.img_list[0].get_rect()
       self.plane_w, self.plane_h = self.img_list[0].get_size()
       self.width, self.height = self.screen.get_size()
       self.plane_rect.left = (self.width - self.plane_w) / 2
       self.plane_rect.top = self.height / 2

   def load_src(self):
       """ 加载飞机的图片到实例上 """
       for img in self.plane_images:
           self.img_list.append(pygame.image.load(img))

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

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

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

   def move_down(self):
       """ 飞机向下移动 """
       self.plane_rect.top += self.speed

   def move_left(self):
       """ 飞机向左移动 """
       self.plane_rect.left -= self.speed

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

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


class OurPlane(Plane):
   """ 我方飞机类 """
   plane_images = constants.OUR_PLANE_IMG_LIST

   def update(self, frame):
       """更新飞机的动画效果"""
       if frame % 5:
           self.screen.blit(self.img_list[0], self.plane_rect)
       else:
           self.screen.blit(self.img_list[1], self.plane_rect)

   def move_up(self):
       super().move_up()
       if self.plane_rect.top < 0:
           self.plane_rect.top = 0

   def move_down(self):
       super().move_down()
       if self.plane_rect.top > (self.height - self.plane_h):
           self.plane_rect.top = (self.height - self.plane_h)

   def move_left(self):
       super().move_left()
       if self.plane_rect.left < 0:
           self.plane_rect.left = 0

   def move_right(self):
       super().move_right()
       if self.plane_rect.left > self.width - self.plane_w:
           self.plane_rect.left = self.width - self.plane_w

提问者 MaxLu 2020-05-30 17:22:13

代码更新:

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.plane = plane
       self.speed = speed or 10

       # 加载子弹的图片
       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, *args):
       """ 更新子弹的位置 """
       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)

我发现刚刚的代码不是我最终的代码,这个是我最终的代码但是错误信息仍然存在,错误类型也没有变

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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