在下面的代码中,我添加了一个中心,在它之前有一个top和left属性到self.rect(这仅用于学习和理解pygame行为)。当我添加top属性时,似乎顶部将被中心覆盖,但是在中心之前有一个左边会改变块的x位置。任何人都可以解释为什么左边没有被中心覆盖?
import pygame
pygame.init()
screen=pygame.display.set_mode((500,500))
class Block(pygame.sprite.Sprite):
def __init__(self):
super(Block, self).__init__()
self.image=pygame.Surface((50,50))
self.image.fill((0,0,200))
self.rect=self.image.get_rect(top=400,center=(0,0))
#this will obviously be overwritten by center, but not the following, why?
#self.rect=self.image.get_rect(left=400,center=(0,0))
b=Block()
blockGrp=pygame.sprite.Group()
blockGrp.add(b)
print blockGrp
while 1:
pygame.time.wait(50)
for e in pygame.event.get():
if e.type==pygame.QUIT:
pygame.quit()
blockGrp.draw(screen)
pygame.display.flip()
答案 0 :(得分:2)
调用get_rect
函数时使用的关键字最后会以dict
的形式传递给函数。
然后Rect
类*遍历此dict
并调用相应的setter函数。
现在请注意,dict
中商品的顺序与创建dict
时使用的顺序不同。
例如,尝试在python解释器中运行以下代码:
>>> {"top": 400, "center": (0, 0)}
{'top': 400, 'center': (0, 0)}
>>> {"left": 400, "center": (0, 0)}
{'center': (0, 0), 'left': 400}
>>>
正如您所看到的,当您使用...get_rect(left=400,center=(0,0))
时,会创建dict
之类的{'center': (0, 0), 'left': 400}
(这是一个实现细节,可能会根据您使用的python解释器而改变)。< / p>
因此,首先设置center
,然后设置left
。
现在,如果您使用...get_rect(top=400,center=(0,0))
,则会生成dict
之类的{'top': 400, 'center': (0, 0)}
,并且会先设置top
,然后会设置center
。
有关dict
内部如何运作的详细信息,请查看this精彩答案。
话虽这么说,如果你想设置多个相互冲突的属性(例如top
和center
),你应该手动调用setter,例如。
self.rect = self.image.get_rect(center=(0,0))
self.rect.top = 400
*它不是真正的Rect
类,因为它是用C实现的,所以它是一个最终完成工作的C函数。