具有基本精灵碰撞的AttributeError

时间:2014-01-12 20:22:46

标签: pygame collision-detection sprite

刚开始使用pygame中的精灵碰撞。运行此代码时,弹出一个AttributeError,表示''Group'对象没有属性'rect''。我无法弄清楚为什么会出现这种错误。建议?

from random import randint
import pygame
pygame.init()


white = [255,255,255]
blue = [0,0,255]
red = [255,0,0]

size = (400,400)
screen = pygame.display.set_mode(size)
pygame.display.set_caption('Simple character')

clock = pygame.time.Clock()

class Ball(pygame.sprite.Sprite):

    def __init__(self, xDelta, yDelta, color):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([20,20])
        self.image.fill(white)
        self.image.set_colorkey(white)

        self.xDelta = xDelta
        self.yDelta = yDelta
        self.color = color

        self.rect = self.image.get_rect()

        pygame.draw.circle(self.image, self.color,
                           [(self.rect.x + 10), (self.rect.y + 10)], 10)



    def update(self):
        self.rect.x += self.xDelta
        self.rect.y += self.yDelta

        if self.rect.y <= 0 or self.rect.y >= 380:
            self.yDelta *= -1    
        if self.rect.x >= 380 or self.rect.x <= 0:
            self.xDelta *= -1

allSprites = pygame.sprite.Group()
blues = pygame.sprite.Group()
reds = pygame.sprite.Group()

for i in range(5):
    circle = Ball(randint(1, 10), randint(1, 10), blue)
    circle.rect.x = randint(0,380)
    circle.rect.y = randint(0,380)
    blues.add(circle)
    allSprites.add(circle)

    circle2 = Ball(randint(1, 10), randint(1, 10), red)
    circle2.rect.x = randint(0,380)
    circle2.rect.y = randint(0,380)
    reds.add(circle2)
    allSprites.add(circle2)

play = True

while play:
    clock.tick(20)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            play = False

    allSprites.update()

    collision = pygame.sprite.spritecollide(blues, reds, True)
    for circle in collision:
        circle.xDelta = circle.yDelta = 0

    screen.fill(white)

    allSprites.draw(screen)

    pygame.display.flip()

pygame.quit()

1 个答案:

答案 0 :(得分:0)

您正在类Group的两个对象上调用spritecollide。该函数采用Sprite和Group。

spritecollide(sprite, group, dokill, collided = None) -> Sprite_list

你可以做的是循环遍历所有blues精灵,并用一个蓝色球调用spritecollide

for blueball in blues.sprites:
    collision = pygame.sprite.spritecollide(blues, reds, True)
        for circle in collision:
            circle.xDelta = circle.yDelta = 0