首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pygame Rect中心无法覆盖Rect的左侧

Pygame Rect中心无法覆盖Rect的左侧
EN

Stack Overflow用户
提问于 2016-04-13 19:12:53
回答 1查看 245关注 0票数 1

在下面的代码中,我向self.rect添加了一个中心,在它之前添加了一个顶部和一个左侧属性(这只是为了学习和理解pygame行为)。当我添加top属性时,似乎顶部会被中心覆盖,但是在中心到来之前有一个左键会改变块的x位置。有没有人能解释一下为什么左边没有被中心覆盖?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-04-13 21:54:59

调用get_rect函数时使用的关键字最终将作为dict传递给该函数。

然后,Rect类*遍历此dict并调用适当的setter函数。

现在请注意,dict中项目的顺序与您在创建该dict时使用的顺序不同。

例如,尝试在python解释器中运行以下代码:

代码语言:javascript
复制
>>> {"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)),将会生成一个类似{'top': 400, 'center': (0, 0)}dict,首先设置top,然后设置center

有关dict内部工作方式的更多信息,请查看this look。

也就是说,如果你想设置多个相互冲突的属性(比如topcenter ),你应该手动调用setter,比如

代码语言:javascript
复制
self.rect = self.image.get_rect(center=(0,0)) 
self.rect.top = 400

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36596617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档