首页 文章

检查pygame中精灵的多次碰撞

提问于
浏览
-1

我目前正在使用pygame,我想创建多个精灵并检查至少两次碰撞 . 我提出了两个while循环的想法,但它最终变得非常复杂 . 还有其他方法可以尝试吗?

1 回答

  • 0

    使用pygame.sprite.spritecollide获取与播放器发生碰撞的精灵列表,然后遍历此列表以对碰撞的精灵执行某些操作 .

    还有groupcollide,您可以使用它来检测两个精灵组之间的碰撞 . 它返回一个字典,其中包含组1的精灵作为键,组2的碰撞精灵作为值 .

    import sys
    import pygame as pg
    from pygame.math import Vector2
    
    
    class Player(pg.sprite.Sprite):
    
        def __init__(self, pos, *groups):
            super().__init__(*groups)
            self.image = pg.Surface((120, 60))
            self.image.fill(pg.Color('dodgerblue'))
            self.rect = self.image.get_rect(center=pos)
    
    
    class Enemy(pg.sprite.Sprite):
    
        def __init__(self, pos, *groups):
            super().__init__(*groups)
            self.image = pg.Surface((120, 60))
            self.image.fill(pg.Color('sienna1'))
            self.rect = self.image.get_rect(center=pos)
    
    
    def main():
        screen = pg.display.set_mode((640, 480))
        clock = pg.time.Clock()
        all_sprites = pg.sprite.Group()
        enemy_group = pg.sprite.Group(Enemy((200, 250)), Enemy((350, 250)))
        all_sprites.add(enemy_group)
        player = Player((100, 300), all_sprites)
    
        done = False
    
        while not done:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    done = True
                elif event.type == pg.MOUSEMOTION:
                    player.rect.center = event.pos
    
            all_sprites.update()
            # Check which enemies collided with the player.
            # spritecollide returns a list of the collided sprites.
            collided_enemies = pg.sprite.spritecollide(player, enemy_group, False)
    
            screen.fill((30, 30, 30))
            all_sprites.draw(screen)
            for enemy in collided_enemies:
                # Draw rects around the collided enemies.
                pg.draw.rect(screen, (0, 190, 120), enemy.rect, 4)
    
            pg.display.flip()
            clock.tick(30)
    
    
    if __name__ == '__main__':
        pg.init()
        main()
        pg.quit()
        sys.exit()
    

相关问题