2017-04-05 76 views
2

我想要使用Sprite模塊中的Group類繪製一個區域或部分精靈。通過在Pygame中使用Group類來繪製區域或部分精靈

所以我有這個類來處理我的精靈:
(...是的,pygame的已被導入。)

class Sprite(pygame.sprite.Sprite): 
    def __init__(self, player): 
     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.image.load(player) 
     self.image = pygame.transform.scale(self.image, (300, 75)) 

     startPoint = (100, 500) 
     self.rect = self.image.get_rect() 
     self.rect.bottomleft = (startPoint) 

然後,我上傳使用精靈:

someFile = Sprite(join('res', 'file.png')) 
spriteGroup = pygame.sprite.RenderUpdates(someFile) 

最後,我通過使用spriteGroup.draw(source)

然而,我的問題是,我想只繪製一個小區域或部分原始文件im年齡。現在,我知道使用Surface.blit()我可以傳遞一個可選的區域矩形,代表要繪製的源表面的較小部分。

集團子類RenderUpdatesdraw()方法,所以它不會接受這種參數...同時,Surface.blit()(即使我可以用它)是不是一種選擇,因爲blit()預計座標繪製來源,但我已經從上面的課程中定義了這些。

所以......我怎麼能通過像(0, 0, 75, 75)這樣的參數分別表示我的精靈的第一個x和y,寬度和高度,以便只繪製那部分?

回答

1

這是我的建議。

  1. 裏面你__init__功能,將圖像存儲在2個變量。

    # Stores the original image 
    self.ogimage = pygame.image.load(player) 
    self.ogimage = pygame.transform.scale(self.image, (300, 75)) 
    # Stores the image that is displayed to the screen 
    self.image = self.ogimage 
    
  2. 然後,更新函數內:設置在原始圖像上的剪輯,獲取新的圖像,並將其存儲在圖像(即自動繪製到屏幕的一個)。現在

    def update(self): 
        self.ogimage.set_clip(pygame.Rect(0, 0, 100, 100)) 
        self.image = self.ogimage.get_clip() 
    

你的精靈的圖像尺寸是100×100,從原始圖像的原點測量。你可以撥弄pygame.Rect裏面的set_clip得到你想要的圖像。

+0

你是個天才!我讀了關於set_clip(),但我不知道如何在我的精靈上使用它...原始圖像。感謝您的幫助! –

0

我找到了解決這個問題的方法。其實,set_clip()方法不起作用。這是我的方式使用image.subsurfacedoc

subsurface() 
    create a new surface that references its parent 
    subsurface(Rect) -> Surface 

在您的代碼中,您可以嘗試以下操作來繪製Rect(0,0,75,75)

class Sprite(pygame.sprite.Sprite): 
    def __init__(self, player): 
     pygame.sprite.Sprite.__init__(self) 

     self.original = pygame.image.load(player) 
     self.original = pygame.transform.scale(self.image, (300, 75)) 
     self.image = self.original.subsurface(Rect(0, 0, 75, 75)) 
     self.rect = self.image.get_rect() 

然後,更新self.imageself.rectupdate函數中。