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

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 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程