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,逻辑更简洁效率更高:
- 修改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
- 初始化level时改为:
level=Level({(0,0): screen_1},0,"Name")
- 切换屏幕的逻辑可以简化为:
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
相关产品推荐
相关产品推荐

