我没有发现任何类似的问题,我正在努力理解我的代码现在在做什么。
我正在用pygame编写一个小益智游戏,这也是我第一次尝试面向对象编程。pygame提供 Rect
对象来定义屏幕的一部分(具有以下属性 x
, y
, width
, height
,等等)。因为我的游戏是文本密集型的,所以我创建了一个对象 Region
a组 Rect
用 font
对象和一些颜色信息,以便在需要快速切换到屏幕时使用:
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"])
(为了便于阅读,剪掉了其他区域对象。)
在代码的后面,我有一个函数,它在 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
复制 rect
属性自 progress_box
对象,但随后我重置了 width
属性的百分比 progress_box.rect
宽度。我没有给你分配任何东西 progress_box
本身,以及 progress_bar
是一个 Region
对象未连接到 Layout
类,所以我假设 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)
,但这并不能解释为什么在我没有直接为变量赋值的情况下变量会发生变化。我知道这些属性只初始化一次,所以对类属性的任何更改都将在每个循环中保持不变——我只是不知道为什么它会在第一时间发生更改。
暂无答案!
目前还没有任何答案,快来回答吧!