【发布时间】:2021-09-20 01:18:07
【问题描述】:
我没有发现任何类似的问题,我正在努力理解我的代码现在在做什么。
我正在使用 Pygame 编写一个小型益智游戏,这也是我第一次涉足面向对象编程。 Pygame 提供Rect 对象来定义屏幕的一部分(具有x、y、width、height 等属性)。由于我的游戏文本较多,因此我创建了一个对象Region 来将Rect 对象与font 对象和一些颜色信息组合在一起,以便我需要在屏幕上进行blit 时使用:
def __init__(self, rect, bg_color, font, font_color):
self.rect = rect
self.bg_color = bg_color
self.font = font
self.font_color = font_color
然后我创建了一个Layout 类,该类将包含Region 对象的集合,以及一个集中的调色板和一些用于重绘屏幕元素的方法。由于这个游戏只有一个“棋盘”,我只需要一个Layout对象,所以我做了Region对象类属性:
...
progress_box: region(pygame.Rect(5, 340, 275, 10),
colors["white"],
pygame.font.SysFont('arialblack', 12),
colors["black"])
(为了便于阅读,剪掉了其他 Region 对象。)
在代码的后面,我有一个在progress_box 中绘制进度条的函数,如下所示:
def display_progress(score, viz, max_score):
progress = round(score/max_score, 4)
progress_bar = region(viz.boxes["progress_box"].rect, "gold", None, None)
progress_bar.rect.width = int(progress * progress_box.rect.width)
viz.box_blit(progress_bar) ##viz is my layout object
据我所知,应该发生的是progress_bar 从progress_box 对象复制rect 属性,但随后我将width 属性重置为progress_box.rect 宽度的百分比。我没有为progress_box 本身分配任何东西,而progress_bar 是一个未连接到Layout 类的Region 对象,所以我假设progress_box.rect.width 在每个循环中都保持不变。
相反,我分配给progress_bar.rect.width 的任何值也会分配给progress_box.rect.width。当然,这意味着在第一次通过循环时,这两个值都设置为 0,因为玩家的得分为 0,之后它们就永远不会改变。
如果我将progress_bar.rect.width = int(progress * progress_box.rect.width) 更改为progress_bar.rect.width = int(progress * 275),该函数将按预期工作,但这并不能向我解释为什么当我没有直接分配任何东西时变量会发生变化。我知道这些属性只初始化一次,所以对类属性的任何更改都会在每个循环中持续存在——我只是不确定为什么它首先会发生变化。
【问题讨论】:
-
“据我所知,应该发生的是 progress_bar 从 progress_box 对象复制 rect 属性” 不,这样的直接对象分配不会执行“深度复制”,因此修改一个对象也会改变另一个对象。 Relevant
-
谢谢@CoryKramer,从我使用的参考资料中看不清楚!
标签: python class pygame variable-assignment class-attributes