碰撞精灵与消灭精灵
我有两个精灵组,ship_list
里面有20个船的精灵,而all_sprites
里面除了这20个船的精灵,还有玩家的精灵。在主循环中,当检测到玩家和ship_list
里的任何东西发生碰撞时,我知道和玩家碰撞的船精灵会从ship_list
中被移除。当我运行程序时,所有的精灵都会出现,当玩家碰到船的精灵时,船就消失了。一切看起来都很好,但我不明白为什么它们会消失。原因是,虽然我知道船在碰撞后会从ship_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.rect 属性来判断的。
dokill 参数是一个布尔值。如果设置为 True,所有发生碰撞的精灵将从组中移除。(这里没有提到它会从其他组中移除..)
1 个回答
7
如果你查看一个精灵(sprite)被打印出来时的信息,你会发现它显示了这个精灵存在于多少个组里。
一个精灵有一个叫做 kill
的方法:
这个方法会把精灵从所有的组中移除。
kill() -> None
调用这个方法后,精灵会从所有包含它的组中被移除。不过,这不会改变精灵的状态。也就是说,在调用这个方法之后,你仍然可以继续使用这个精灵,包括把它添加到其他组里。
看起来 sprite_collide
的作用就是在发生碰撞时,调用精灵的 kill()
方法。