我有两个精灵组,ship_list
有20个精灵,all_sprites
有20个精灵,加上玩家精灵。在主循环中,当在玩家和ships_list
中的任何内容之间检测到碰撞时,我理解与玩家相撞的船只精灵将从ships_list
中移除。当我运行程序时,所有精灵都会出现,并且通过将玩家移动到船精灵中它会消失。一切都很好,除了..我不明白为什么他们正在消失。原因是虽然我知道船只在碰撞后从ships_list
被移除,但all_sprites
列表实际上是每帧重绘的,我没有明确地删除任何内容。那么碰撞是否也会从all_sprites
移除船精灵?
ship_list = pygame.sprite.Group() # just ship sprites
all_sprites = pygame.sprite.Group() # ship sprites + player sprite
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT or score == 20:
done = True
screen.fill(BLACK)
pos = pygame.mouse.get_pos()
player.rect.x = pos[0]
player.rect.y = pos[1]
**# is this line removing sprites from all_sprites??**
ships_hit_list = pygame.sprite.spritecollide(player, ship_list, True) # detect collisions
for ship in ships_hit_list:
score += 1
print score
all_sprites.draw(screen) # seems to lose sprites when ships_list does..
ship_list.update() # updating the position
pygame.display.flip()
clock.tick(24)
# properly quit
pygame.quit()
来自https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollide
pygame.sprite.spritecollide()
在与另一个精灵相交的组中查找精灵。
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list
返回一个列表,其中包含与之相交的所有Sprite 另一个雪碧。通过比较确定交叉点 每个Sprite的Sprite.rect属性。
dokill论证是一个布尔。如果设置为True,则表示所有Sprite collide将从集团中删除。(它没有提及将其从任何其他组中删除..)
答案 0 :(得分:6)
如果您查看精灵打印时显示的内容,您会看到它显示精灵存在的组数。
Sprite有一个名为kill
的方法:
从所有群组中删除精灵
kill() - >无
Sprite将从包含它的所有组中删除。这不会 改变关于Sprite状态的任何信息。有可能 调用此方法后继续使用Sprite, 包括将其添加到群组。
似乎sprite_collide
做了什么,如果发生了碰撞,它只会在精灵上调用kill()
。