AttributeError求助:'User_input_responses'对象无'screen'属性
错误修复:AttributeError: 'User_input_responses' object has no attribute 'screen'
你判断的问题本质完全正确:User_input_responses初始化时,把自身实例传给了Ship类,但Ship需要的是拥有screen属性的Alien_Invasion主类实例。以下是具体修复方案:
核心修复思路
- 让
User_input_responses复用主类已创建的Ship实例,而非自行创建 - 给
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
相关产品推荐
相关产品推荐

