Python Arcade实现玩家死亡显示死亡界面报AttributeError错误
问题根因
报错来自两个核心用法错误,还有一个隐藏的后续会触发的逻辑bug:
- 你的
MyGame类直接继承自arcade.Window,本身就是窗口实例,不存在self.window属性——self.window是arcade.View子类被加载到窗口后才会自动绑定的属性,用来指向所属窗口对象,在Window子类里调用自身方法不需要走.window中转。 - 你调用
show_view()时传入的是GameOverView类本身,不是类的实例对象,就算修复了前面的属性问题,这里也会触发类型错误。 - 隐藏bug:
GameOverView的绘制逻辑里直接读取self.score,但你没有给死亡视图传递游戏分数,切屏后会触发属性不存在的报错。
修复步骤
- 找到
on_update方法里玩家血量归零的判断逻辑,把原来的self.window.show_view(GameOverView)替换为实例化视图、传分数、直接调用窗口方法的逻辑:
if self.health == 0: self.player_sprite.remove_from_sprite_lists() # 实例化死亡视图 game_over_view = GameOverView() # 把当前游戏分数传给死亡视图 game_over_view.score = self.score # MyGame本身是窗口实例,直接调用show_view方法 self.show_view(game_over_view)
- (可选功能补全)你在死亡界面写了"Click to restart"的提示,但没有加对应的点击重启逻辑,可以给
GameOverView类补充鼠标点击事件方法实现重开:
def on_mouse_press(self, x, y, button, modifiers): # 重新创建游戏视图、初始化资源,切回游戏 new_game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) new_game.setup() self.window.show_view(new_game)
关键逻辑说明
arcade.Window作为顶层容器,自身持有视图切换、渲染等所有窗口级方法,直接通过self调用即可- 所有传给
show_view()的视图必须是实例化后的对象,不能直接传类名 - 不同视图之间传递数据(比如分数、存活时长),直接给视图实例动态赋值对应属性即可,不需要修改类的初始化方法就能在视图的绘制、更新逻辑里读取。
内容的提问来源于stack exchange,提问作者riley
相关产品推荐
相关产品推荐

