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)
def prepare_launch(self): player = self.level.engine.player self.explosion = ExplosionParticleSystem(self) self.explosion.max_lifetime = 1 self.explosion.min_lifetime = 0.5 self.explosion.min_particles = 30 self.explosion.max_particles = 40 self.explosion.max_scale = 0.4 self.explosion.min_angle = -(4 * math.pi) / 3 self.explosion.max_angle = -(5 * math.pi) / 3 self.explosion.repeat = True self.explosion.start(self.container.rect.centerx, self.large_probe.rect.bottom) shake_effect = ShakeEffect(self.large_probe) shake_effect.start() timer = Timer(3000, self.launch_probe, one_shot=True) timer.start()
def on_added(self, layer): self.effect = ShakeEffect(self) self.effect.start()