0

以下のコードは基本的に、スプライトとグループを理解するためのテストです。クラスのインスタンスを 10 個作成しBall、それぞれをランダムに配置して移動し、画面上でバウンドさせることになっています。問題は、それらはすべて独立して配置されますが、ループ中に何らかの理由ですべてが同じ座標を継承しているように見えるため、跳ね返るボールが 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

私はpygame.imageがどのように機能するかを理解していないと思います.Ball.imageは実際にはすべてのインスタンスで共有される同じオブジェクトですが、それを証明する方法も解決する方法もわかりません.

4

1 に答える 1

4

そうです、Ball.image はすべてのインスタンスで共有されます。クラススコープで作成したため、rectなどを含む他のすべての変数も同様です-これはpygameとは関係ありません。

次のようなマジック メソッドをクラスに追加__init__します。

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

そして、クラス スコープで対応する割り当てを削除します。

于 2013-03-03T13:12:10.097 に答える