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

Pygame关卡编辑器Screen对象screenpos属性异常复用viewed_screen_pos问题

问题根因

你的问题核心是Python可变对象的引用传递特性:
你全局定义的viewed_screen_pos是列表类型(属于可变对象),创建Screen实例时直接把这个列表赋值给了Screen.screenpos属性,本质是所有Screen实例的screenpos都指向同一个全局列表对象。当你修改viewed_screen_pos的值时,所有已创建的Screen的screenpos属性会同步更新,导致后续切换位置时,遍历判断viewed_screen_pos == screen.screenpos永远为真,不会触发新建逻辑。

修复方案

只需要修改创建新Screen的代码,传入viewed_screen_pos的副本而非原对象即可:
把所有新建Screen的语句

current_screen=Screen([],viewed_screen_pos,[500,500])

修改为:

# 用list()创建列表副本,每个Screen的screenpos都是独立对象
current_screen=Screen([], list(viewed_screen_pos), [500,500])

可选优化建议

你可以把Level类的screen_array改成字典存储,以坐标元组为key,无需遍历就能快速判断位置是否存在对应Screen,逻辑更简洁效率更高:

  1. 修改Level定义:
class Level():
    def __init__(self,screen_dict,level_num,level_name):
        self.screen_dict=screen_dict # 存储格式 {(x,y): Screen实例}
        self.level_num=level_num
        self.level_name=level_name
  1. 初始化level时改为:
level=Level({(0,0): screen_1},0,"Name")
  1. 切换屏幕的逻辑可以简化为:
if event.key==pygame.K_RIGHT:
    viewed_screen_pos[0]+=1
    pos_key = tuple(viewed_screen_pos)
    if pos_key in level.screen_dict:
        current_screen = level.screen_dict[pos_key]
    else:
        current_screen=Screen([], list(viewed_screen_pos), [500,500])
        level.screen_dict[pos_key] = current_screen

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:03