如何使用精灵组和杀死精灵组

问题描述

代码

import pygame

def enemie():
    global speed_x
    ball.y += speed_x

    if ball.colliderect(player):
        groups.kill()


pygame.init()
running = True

clock = pygame.time.Clock()

speed_x = 10

ball = pygame.Rect(250,20,20)
player = pygame.Rect(250,450,50,50)
screen = pygame.display.set_mode((500,500))

Groups = pygame.sprite.Group()
Groups.add(ball)
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                running = False
    enemie()

    screen.fill((255,255,255)) #color

    pygame.draw.ellipse(screen,[0,255],player)
    pygame.draw.ellipse(screen,[255,0],ball)
    pygame.display.flip()

    clock.tick(30)
pygame.quit()

错误


TypeError: pygame.sprite.AbstractGroup.add() argument after * must be an iterable,not int

During handling of the above exception,another exception occurred:

AttributeError: 'int' object has no attribute 'add_internal'

During handling of the above exception,another exception occurred:

TypeError: unhashable type: 'pygame.Rect'

首先,我以前从未见过如此巨大的错误。我正在尝试创建一个游戏,其中您有一个球从上方传来,当它接触到您的蓝色角色时,红球将被删除。我一切都很好,直到我试图在触球时将球移开。我使用了一个精灵组,所以我可以“杀死”这个组。我在这里做错了什么?

解决方法

你不能杀死一个精灵,但你可以杀死一个精灵kill 从所有组中删除一个精灵。您只需将 pygame.sprite.Sprite 对象转换为 pygame.sprite.Groupball 只是一个 pygame.Rect 对象。因此它不能添加到


工作示例:

import pygame

def enemie():
    global speed_x
    ball.rect.y += speed_x
    if ball.rect.colliderect(player.rect):
        player.kill()

pygame.init()
screen = pygame.display.set_mode((500,500))
clock = pygame.time.Clock()

# ball sprite
ball = pygame.sprite.Sprite()
ball.rect = pygame.Rect(250,20,20)
ball.image = pygame.Surface((20,20),pygame.SRCALPHA)
pygame.draw.circle(ball.image,(255,0),(10,10),10)
speed_x = 10

# player sprite
player = pygame.sprite.Sprite()
player.rect = pygame.Rect(250,450,50,50)
player.image = pygame.Surface((50,50),pygame.SRCALPHA)
pygame.draw.circle(player.image,(0,255),(25,25),25)

# group with all sprites
group = pygame.sprite.Group()
group.add(ball)
group.add(player)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                running = False
    enemie()

    screen.fill((255,255,255)) #color
    group.draw(screen)
    pygame.display.flip()
    clock.tick(30)

pygame.quit()