Python 所有精灵都移动到相同的坐标?

Python 所有精灵都移动到相同的坐标?,python,pygame,Python,Pygame,下面的代码基本上是我了解精灵和群组的一个测试。它应该创建10个Ball类的实例,然后随机定位和移动每个实例,并在屏幕上弹起它们。问题是,虽然它们都是独立定位的,但由于某些原因,它们在循环过程中似乎都继承了相同的坐标,因此似乎只有一个球在周围反弹 import pygame, sys, random pygame.init() size = width, height = 640, 400 screen = pygame.display.set_mode(size) class Ball(p

下面的代码基本上是我了解精灵和群组的一个测试。它应该创建10个
Ball
类的实例,然后随机定位和移动每个实例,并在屏幕上弹起它们。问题是,虽然它们都是独立定位的,但由于某些原因,它们在循环过程中似乎都继承了相同的坐标,因此似乎只有一个球在周围反弹

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)

我假设我不了解pygame.image是如何工作的,而且Ball.image实际上是在所有实例中共享的同一个对象,但是我真的不知道如何证明它,也不知道如何解决它。

你是对的,Ball.image是在所有实例中共享的。所有其他变量也是如此,包括rect等,因为它们是在类范围内创建的——这与pygame无关

\uuuu init\uuuu
魔术方法添加到类中,如下所示:

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

并删除类范围中相应的赋值。

没错,Ball.image在所有实例中共享。所有其他变量也是如此,包括rect等,因为它们是在类范围内创建的——这与pygame无关

\uuuu init\uuuu
魔术方法添加到类中,如下所示:

def __init__(self):
    self.rect = Ball.image.get_rect()
    self.speed = 0
    self.direction = [1, 1]
并删除类范围中相应的赋值