不睡觉就难过 2022-01-24 17:12 采纳率: 100%
浏览 313
已结题

python从入门到实践中的飞船项目,其显示AttributeError: 'Ship' object has no attribute 'screen,怎么解决?

问题如标题所述,代码运行显示如下错误:AttributeError: 'Ship' object has no attribute 'screen
代码如下:
分为三个文件:ship.py,alien_invasion.py,settings.py
# ship.py

import pygame


class Ship():

    def __init__(self, screen):
        # 初始化飞船并获取其初始位置

        # 加载飞船图像并获取其外接矩形
        self.image = pygame.image.load("images/ship.bmp")  # 返回了飞船的surface,并存储到self.image
        self.rect = self.image.get_rect()  # 通过get_rect()活动相应surface的属性rect。(矩形即rect对象)
        self.screen_rect = screen.get_rect()  # 将矩形存储到self.screent_rect

        # 将每艘新飞船放到屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx  
        self.rect.bottom = self.screen_rect.bottom

    def blitme(self):  # 定义此方法,让它根据self.rect的位置将图像绘制到屏幕上
        # 在指定位置绘制飞船
        self.screen.blit(self.image, self.rect)
# alien_invasion.py

import pygame

from settings import Settings
from ship import Ship
# 导入所需模块

def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()  # 初始化背景设置
    ai_settings = Settings()

    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")  # 显示在屏幕的左上角

    # 设置背景色
    # bg_color = (230,230,230) # RGB(红绿蓝三色)

    # 创建一艘飞船ship
    ship = Ship(ai_settings, screen)

    # 游戏的主循环
    while True:  
          # 监视键盘和鼠标事件
         for event in pygame.event.get():  # 事件循环
             # pygame.event.get()方法,所有的键盘和鼠标事件都会促使for循环运行。
             if event.type == pygame.QUIT:
                 # 若玩家单机游戏窗口的关闭按钮,将检测到pygame.QUIT事件,我们将调用sys.exit()来退出游戏
                 sys.exit()
        
        # 每次循环都重绘屏幕
        screen.fill(bg_color)  # 用背景色填充屏幕,只接受一个实参,一种颜色
        ship.blitme()
        
        # 让最近绘制的屏幕可见
        pygame.display.flip()  

run_game()
# settings.py

class Settings():
    # 存储alien_invasion的所有设置的类
    def __init__(self):
        # 初始化游戏设置
        # 屏幕设置
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
个人觉得可能是由于screen的数据类型没有搞清楚,但是查了好久不知道那里错了。
谢谢大家的帮助!
  • 写回答

2条回答 默认 最新

  • 关注

    你 Ship()类中只定义了 self.screen_rect 属性,没有定义 self.screen 属性啊

    Ship的def init():方法中应该加上self.screen = screen 吧

    # ship.py
     
    import pygame
     
     
    class Ship():
     
        def __init__(self, screen):
            # 初始化飞船并获取其初始位置
     
            # 加载飞船图像并获取其外接矩形
            self.screen = screen  #****************加上这行 
            self.image = pygame.image.load("images/ship.bmp")  # 返回了飞船的surface,并存储到self.image
            self.rect = self.image.get_rect()  # 通过get_rect()活动相应surface的属性rect。(矩形即rect对象)
            self.screen_rect = screen.get_rect()  # 将矩形存储到self.screent_rect
     
            # 将每艘新飞船放到屏幕底部中央
            self.rect.centerx = self.screen_rect.centerx  
            self.rect.bottom = self.screen_rect.bottom
     
        def blitme(self):  # 定义此方法,让它根据self.rect的位置将图像绘制到屏幕上
            # 在指定位置绘制飞船
            self.screen.blit(self.image, self.rect)
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 创建了问题 1月24日

悬赏问题

  • ¥15 模拟电路求复阻抗和传递函数,请各位拍照写一下解答过程
  • ¥60 不懂得怎么运行下载来的代码
  • ¥15 CST导出3D模型图为什么和软件显示不一样?
  • ¥15 加热反应炉PLC控制系统设计(相关搜索:梯形图)
  • ¥15 python 用Dorc包报错,我的写法和网上教的是一样的但是它显示无效参数,是什么问题
  • ¥15 经过滑动平均后的一维信号还原用什么结构好呢?
  • ¥15 指定IP电脑的访问设置
  • ¥30 matlab ode45 未发现警告,但是运行出错
  • ¥15 为什么devc++编译项目会失败啊
  • ¥15 vscode platformio