【问题标题】:Pygame Rect center can't overwrite Rect's leftPygame Rect 中心无法覆盖 Rect 的左边
【发布时间】:2016-04-13 11:12:53
【问题描述】:

在下面的代码中,我在 self.rect 中添加了一个 center 和一个 top 和一个 left 属性(这仅用于学习和理解 pygame 行为)。当我添加顶部属性时,顶部似乎会被中心覆盖,但是在中心出现之前有一个左边会改变块的 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()

【问题讨论】:

    标签: python pygame rect


    【解决方案1】:

    您在调用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)) 时,会创建一个类似于{'center': (0, 0), 'left': 400}dict(这是一个实现细节,可能会根据您使用的python 解释器而改变)。

    所以,首先设置center,然后设置left

    现在如果你使用...get_rect(top=400,center=(0,0)),会生成一个dict,比如{'top': 400, 'center': (0, 0)},先设置top,再设置center

    有关dict 内部工作原理的更多信息,请查看this 很好的答案。


    话虽如此,如果您想设置多个相互冲突的属性(例如topcenter),您应该手动调用设置器,例如

    self.rect = self.image.get_rect(center=(0,0)) 
    self.rect.top = 400
    

    * 它不是真正的Rect,因为它是用 C 实现的,所以它是一个 C 函数,最终完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多