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'
正在回答
同学你好:这一部分代码中出现的问题是image和rect及shoot_sound的前面需要加上self.,表示是实例属性,如下图。
而报错的AttributeError: 'OurPlane' object has no attribute 'rect'也是类似的原因,但出现在plane.py的代码中,同学可以自行检查一下,如果找不到原因请提供一下plane.py的代码,方便老师定位问题。
如果解决了你的疑惑,请采纳,祝学习愉快~
我又回去看了一遍课程,然后回来还是没有发现错误出在哪里,下面是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
代码更新:
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)
我发现刚刚的代码不是我最终的代码,这个是我最终的代码但是错误信息仍然存在,错误类型也没有变
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星