2013-03-03 85 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