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

Python Arcade实现玩家死亡显示死亡界面报AttributeError错误

问题根因

报错来自两个核心用法错误,还有一个隐藏的后续会触发的逻辑bug:

  1. 你的MyGame类直接继承自arcade.Window,本身就是窗口实例,不存在self.window属性——self.window是arcade.View子类被加载到窗口后才会自动绑定的属性,用来指向所属窗口对象,在Window子类里调用自身方法不需要走.window中转。
  2. 你调用show_view()时传入的是GameOverView类本身,不是类的实例对象,就算修复了前面的属性问题,这里也会触发类型错误。
  3. 隐藏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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:48:22