2016-04-13 23 views
1

下のコードでは、センターを追加し、その前にself.rect(これは学習とPygameの動作を理解するためのものです)の左上の属性を追加します。一番上の属性を追加すると、上が上書きされるように見えますが、左に中央が来るとブロックのx位置が変わります。左がセンターによって上書きされない理由を説明することはできますか?あなたがget_rect関数を呼び出すときに使用Pygame RectセンターはRectの左を上書きできません

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() 

答えて

2

キーワードは、最終的には、関数にdictとして渡されます。

Rectクラス*は、dictを反復処理し、適切なセッター機能を呼び出します。

dictのアイテムの順序は、そのアイテムを作成するときに使用した順序と同じではないことに注意してください。dictこれはより変わり、実装の詳細である(あなたが見ることができるようにあなたが...get_rect(left=400,center=(0,0))を使用する場合、

>>> {"top": 400, "center": (0, 0)} 
{'top': 400, 'center': (0, 0)} 
>>> {"left": 400, "center": (0, 0)} 
{'center': (0, 0), 'left': 400} 
>>> 

{'center': (0, 0), 'left': 400}ようdictが作成されます。

たとえば、あなたのPythonインタプリタに次のコードを実行してみてくださいあなたが使用するPythonインタプリタで)。

したがって、最初にcenterが設定され、次にleftが設定されます。

は今、あなたは{'top': 400, 'center': (0, 0)}のようなdictが生成されます、...get_rect(top=400,center=(0,0))使用している場合、およびtopは、最初に設定され、その後、centerが設定されます。

dictの内部動作の詳細については、thisをご覧ください。例えば、あなたが互いに衝突複数の属性、(のようなtopcenterなど)を設定したい場合は、手動でセッターを呼び出す必要があり、言われていること


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

それが最終的に作業を行うC関数ですので、それは、Cで実装されますので、*それは、本当にRectクラスではありません。

関連する問題