class Crossover(Sprite): def __init__(self, area): super(Crossover, self).__init__(None) self.collidable = False self.obey_gravity = False self.crossover_area = area def on_added(self, layer): self.effect = ShakeEffect(self) self.effect.start() def on_removed(self, layer): self.effect.stop() def update_image(self): if not self.image: possible_sprites = [] new_rect = pygame.Rect(0, 0, 0, 0) for layer in self.crossover_area.layers: if layer.index == self.layer.index: for sprite in layer.quad_tree.get_sprites(self.rect): if new_rect.width == 0: new_rect = sprite.rect else: new_rect = new_rect.union(sprite.rect) break if new_rect.width == 0: self.hide() return w = random.randint(300, 600) h = random.randint(300, 600) try: x = random.randint(max(new_rect.left, self.rect.left), min(new_rect.right, self.rect.right)) y = random.randint(max(new_rect.top, self.rect.top), min(new_rect.bottom, self.rect.bottom)) except ValueError: self.hide() return self.rect = pygame.Rect(x, y, w, h) self.image = pygame.Surface(self.rect.size).convert_alpha() self.image.fill((0, 0, 0, 0)) for sprite in layer.quad_tree.get_sprites(self.rect): pos = (sprite.rect.left - self.rect.left, sprite.rect.top - self.rect.top) self.image.blit(sprite.image, pos)