2016-06-21 26 views
0

HeyGuys!我剛剛加入了這個網站,所以我對這個問題的處理方式很輕鬆。Pygame Sprites bug?

所以,我最近開始玩PyGames,並使用pygame.sprite.Sprite模塊進行了一些測試。這裏是我的代碼:

#Game 

import pygame 

pygame.init() 

screen_width, screen_height = 800, 600 
screen = pygame.display.set_mode((screen_width,screen_height)) 
clock = pygame.time.Clock() 
black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

class Block(pygame.sprite.Sprite): 
    def __init__(self, block_color = white, block_width = 64, block_height = 64): 
     super(Block, self).__init__() 
     self.image = pygame.Surface((block_width, block_height)) 
     self.image.fill(block_color) 
     self.rect = self.image.get_rect() 

    def set_position(self, x, y): 
     self.rect.x = x 
     self.rect.y = y 

    def change_color(self, color): 
     self.image.fill(color) 

    def load_image(self, url): 
     self.image = pygame.image.load(url) 
     self.rect = self.image.get_rect() 

block_group = pygame.sprite.Group() 
a_block = Block(green) 
b_block = Block(red) 
c_block = Block(blue) 
d_block = Block() 
a_block.set_position(0,0) 
b_block.set_position(0,64) 
c_block.set_position(64,0) 
d_block.set_position(64,64) 
d_block.load_image("brick.png") 

block_group.add(a_block,b_block,c_block,d_block) 

running = True 
while running: 
    screen.fill(black) 
    block_group.draw(screen) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       pygame.quit() 
       quit() 
    pygame.display.update() 
    clock.tick(10) 

正如你已經可以推斷出,我意在打造this,而是得到 this這都是錯誤的。奇怪的是,每次我運行該文件時,#1和#2都是異想天開地繪製而沒有模式,所以我想知道它是否與我在while循環中更新屏幕的方式有關。

有關如何解決此問題的任何想法?在此先感謝,我希望更經常地使用此網站!

回答

0

當你調用

def load_image(self, url): 
    self.image = pygame.image.load(url) 
    self.rect = self.image.get_rect() 

你雪碧的矩形設置圖像的矩形。但是,該矩形具有位置(0,0)。這意味着綠色矩形和塊都在(0,0)處繪製。

一個精靈組並不一定保留精靈的順序,這說明了爲什麼你看到#1(block_d最後繪製)或#2(最後繪製了block_a)的行爲。

顛倒你的圖片加載和位置設置代碼,你應該很好去。

block_group = pygame.sprite.Group() 
a_block = Block(green) 
b_block = Block(red) 
c_block = Block(blue) 
d_block = Block() 
d_block.load_image("brick.png") 
a_block.set_position(0,0) 
b_block.set_position(0,64) 
c_block.set_position(64,0) 
d_block.set_position(64,64) 

block_group.add(a_block,b_block,c_block,d_block) 

如果你需要保持在所加入精靈的順序雪碧組,您可以使用pygame.sprite.OrderedUpdates

+0

感謝您的深刻解答,現在我的代碼正在按照我的要求工作:^)。 – Yourchingoo

+0

很高興我可以幫助並歡迎來到StackOverflow!如果這解決了您的問題,您可以考慮使用複選標記接受此答案作爲正確答案,以便其他人知道您的問題已得到解決。 :) – Isa

+0

gotchyu breh .... – Yourchingoo