问题描述
代码:
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.Group
。 ball
只是一个 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()