pygame报错AttributeError: 'pygame.Surface'无bullet_width属性如何解决
问题根因
报错AttributeError: 'pygame.Surface' object has no attribute 'bullet_width'的核心原因是函数参数传递顺序不匹配:本该接收Settings类实例的形参,实际接收到了pygame.Surface类型的屏幕对象,所以调用bullet_width属性时报错。
具体错误点及修复方案
1. 修正check_events函数参数顺序
主模块alien_invasion.py调用gf.check_events时的传参顺序是(ai_settings, ship, screen, bullets),但game_functions.py中check_events的定义参数顺序不匹配,修改如下:
# game_functions.py 修改前 def check_events(ship, ai_settings, screen, bullets): # game_functions.py 修改后 def check_events(ai_settings, ship, screen, bullets):
2. 修正check_keydown_events的参数顺序与调用逻辑
check_events内部调用check_keydown_events的传参,和check_keydown_events的定义参数顺序不匹配,统一调整:
# game_functions.py 修改前 def check_keydown_events(event, ship, screen, ai_settings, bullets): # game_functions.py 修改后 def check_keydown_events(event, ai_settings, ship, screen, bullets):
同时修改check_events中调用check_keydown_events的传参顺序:
# game_functions.py check_events 内部修改前 check_keydown_events(event, ship, ai_settings, screen, bullets) # 修改后 check_keydown_events(event, ai_settings, ship, screen, bullets)
3. 修正Bullet实例化的传参顺序
Bullet类的__init__方法定义参数顺序是(ai_settings, ship, screen),但实例化时传参顺序颠倒,修改如下:
# game_functions.py check_keydown_events 内部修改前 new_bullet = Bullet(ai_settings, screen, ship) # 修改后 new_bullet = Bullet(ai_settings, ship, screen)
4. 额外修复:调整画面渲染顺序(避免子弹被背景覆盖)
update_screen函数当前先绘制子弹再填充背景,会导致子弹被背景挡住,调整顺序:
# game_functions.py 修改前 def update_screen(ai_settings, screen, ship, bullets): for bullet in bullets.sprites(): bullet.draw_bullet() screen.fill(ai_settings.bg_color) ship.blitme() pygame.display.flip() # 修改后 def update_screen(ai_settings, screen, ship, bullets): screen.fill(ai_settings.bg_color) for bullet in bullets.sprites(): bullet.draw_bullet() ship.blitme() pygame.display.flip()
内容的提问来源于stack exchange,提问作者kepsk1y
相关产品推荐
相关产品推荐

