2013-03-03 86 views
0

下面的代碼基本上是一個測試,讓我瞭解Sprites和Groups。它應該創建Ball類的10個實例,然後隨機定位並移動每個實例,並將它們反射到屏幕上。問題在於,儘管它們都是獨立定位的,但出於某種原因,它們在循環過程中似乎都繼承了相同的座標,所以似乎只有1個彈跳球。所有精靈都移動到相同的座標?

import pygame, sys, random 

pygame.init() 

size = width, height = 640, 400 
screen = pygame.display.set_mode(size) 

class Ball(pygame.sprite.Sprite): 
    image = pygame.image.load('assets/ball.gif').convert() 
    rect = image.get_rect() 
    max_speed = 2 
    speed = 0 
    direction = [1, 1] 

    def randomize(self): 
     random.seed() 
     self.rect.x = random.random() * width 
     self.rect.y = random.random() * height 
     self.speed = random.random() * self.max_speed 
     print ('%s %s %s') % (self.rect.x, self.rect.y, self.speed) 

    def update(self): 
     if self.rect.left < 0: 
      self.direction[0] = 1 
     if self.rect.right > width: 
      self.direction[0] = -1 
     if self.rect.top < 0: 
      self.direction[1] = 1 
     if self.rect.bottom > height: 
      self.direction[1] = -1 

     self.rect.x += self.speed * self.direction[0] 
     self.rect.y += self.speed * self.direction[1] 

layers = pygame.sprite.LayeredUpdates() 
black = 0, 0, 0 
clock = pygame.time.Clock() 

for i in range(0,10): 
    ball = Ball() 
    ball.randomize() 
    layers.add(ball) 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: sys.exit() 

    screen.fill(black) 
    layers.update() 
    layers.draw(screen) 
    pygame.display.flip() 
    clock.tick(30) 

下面是從Ball.randomize()輸出:

454 317 0.268577946144 
560 175 0.777246064841 
446 161 1.71602882781 
337 221 0.298744471713 
9 122 1.19615176471 
304 351 1.45267115709 
255 397 0.478593408657 
135 213 1.04660721161 
96 26 0.758952705602 
389 106 0.954778970584 

我認爲我不理解Ball.image實際上是如何pygame.image作品和以某種方式在所有實例共享同一個對象,但是我真的不知道如何證明它,也不知道如何解決它。

回答

4

你是對的,Ball.image是在所有實例中共享的。所有其他變量,包括矩形等,因爲你在類作用域創建它們 - 這與pygame無關。

添加__init__魔術方法類,類似以下內容:

def __init__(self): 
    self.rect = Ball.image.get_rect() 
    self.speed = 0 
    self.direction = [1, 1] 

而在類範圍中刪除相應的分配。

+1

哎呀!謝謝 :) – DanH 2013-03-03 14:41:23