You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AttributeError求助:'User_input_responses'对象无'screen'属性

错误修复:AttributeError: 'User_input_responses' object has no attribute 'screen'

你判断的问题本质完全正确:User_input_responses初始化时,把自身实例传给了Ship类,但Ship需要的是拥有screen属性的Alien_Invasion主类实例。以下是具体修复方案:


核心修复思路

  1. 让User_input_responses复用主类已创建的Ship实例,而非自行创建
  2. 给User_input_responses传入Alien_Invasion实例,确保所有组件共享同一个游戏上下文

修改后的代码

1. 输入响应类(User_input_responses)

import pygame
import sys

class User_input_responses:
    # 接收主游戏实例和已初始化的飞船实例
    def __init__(self, game, ship):
        self.game = game
        self.ship = ship

    def user_input_reactions(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self.keydown(event)
            elif event.type == pygame.KEYUP:
                self.keyup(event)
    
    # 补充按键按下逻辑(配合飞船移动)
    def keydown(self, event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
    
    # 补充按键抬起逻辑
    def keyup(self, event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

2. 主游戏类(Alien_Invasion)

import pygame 
from ship_movement import User_input_responses
from settings import Settings
from ship_test import Ship

class Alien_Invasion:
    def __init__(self):
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width , self.settings.screen_height))
        pygame.display.set_caption("Alien Invader")
        self.bg_color = self.settings.bg_color

        self.clock = pygame.time.Clock()
        self.ship = Ship(self)
        # 传入主游戏实例和已创建的飞船实例
        self.movement = User_input_responses(self, self.ship)

    def update_screen(self):
        # 调整绘制顺序:先填充背景、绘制飞船,再刷新屏幕
        self.screen.fill(self.bg_color)
        self.ship.blitme()
        pygame.display.flip()

    def game(self):
        while True:
            self.movement.user_input_reactions()
            self.ship.ship_movement()
            self.update_screen()
            self.clock.tick(60)

if __name__ == '__main__':
    game_launcher = Alien_Invasion()
    game_launcher.game()

3. 飞船类(Ship)

import pygame 

class Ship:
    def __init__(self, game):
        # 复用主游戏的配置实例,避免重复初始化
        self.settings = game.settings
        self.screen = game.screen
        self.screen_rect = self.screen.get_rect()

        self.image = pygame.image.load("images/ship.bmp")
        self.rect = self.image.get_rect()

        self.rect.center = self.screen_rect.center
        self.x = float(self.rect.x)
        self.y = float(self.rect.y) 
        # 添加移动状态标记
        self.moving_right = False
        self.moving_left = False
    
    def ship_movement(self):
        # 根据按键状态更新飞船位置
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
        # 同步rect对象的位置
        self.rect.x = self.x
    
    def blitme(self):
        self.screen.blit(self.image, self.rect)

额外说明

  • 修复后所有组件共享同一个Alien_Invasion实例,彻底解决属性获取错误
  • 调整了屏幕刷新顺序,避免画面闪烁问题
  • 补充了飞船移动的核心逻辑,让输入响应能真正控制飞船移动

内容的提问来源于stack exchange,提问作者Wade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:56:35