class RunnerLayer(cocos.layer.ColorLayer, Layer): """State""" is_event_handler = True def __init__(self, game, interface, meta): super().__init__(242, 242, 242, 255) background_sprite = Sprite('fondo_final.svg', anchor=(0, 0)) background_sprite.position = (0, 0) background_sprite.scale = 0.1 self.add(background_sprite, z=0) self.game = game self.toaster = None self.meta = meta self.meta["current_world"] = 0 self.current_screen = 0 self.space_used = 1 self.interface = interface self.main_character = CollidableSprite('ppepotato.svg', anchor=(0, 0)) self.collision_manager = CollisionManagerBruteForce() self.collision_manager.add(self.main_character) self.add(self.main_character) self.sprites_by_id = {} self.explosions = [] self.do_draw() self.schedule_interval(self.check_collisions, 0.1) self.schedule_interval(self.check_finished, 0.1) def do_draw(self): """Draw a screen.""" self.main_character.x = 0 self.main_character.y = 0 self.main_character.do( MoveTo((self.interface.width, self.main_character.y), 10)) for character in self.characters: with suppress(Exception): self.remove(character.sprite) for explosion in self.explosions: with suppress(Exception): self.remove(explosion) self.explosions = [] self.collision_manager.clear() if self.toaster: self.remove(self.toaster) self.toaster = CollidableSprite("toaster00.svg") self.toaster.scale = 0.1 self.toaster.position = (2 * random.randint(0, self.width) / 3 + self.width / 3), (random.randint( 0, round(2 * self.height / 3))) self.add(self.toaster) self.collision_manager.add(self.toaster) self.current_screen += 1 for character in self.characters: self.sprites_by_id[id(character.sprite)] = character self.collision_manager.add(character.sprite) self.add(character.sprite) self.draw() def check_finished(self, *args, **kwargs): """Check if has finished.""" if self.main_character.x > self.interface.width: self.do_draw() def check_collisions(self, *args, **kwargs): """Check for collisions.""" for elem in self.collision_manager.iter_colliding(self.main_character): if elem == self.toaster: position = self.toaster.position self.remove(self.toaster) self.toaster = CollidableSprite("toaster01.svg") self.toaster.scale = 0.1 self.toaster.position = position self.add(self.toaster) director.replace( FadeTRTransition(self.meta['scenes']['toaster'])) continue if not id(elem) in self.sprites_by_id: continue self.sprites_by_id[id(elem)].touched = True explosion = Sprite('explosion.svg') explosion.scale = 0.5 explosion.position = elem.position self.explosions.append(explosion) with suppress(Exception): self.remove(elem) self.add(explosion) def on_key_press(self, key, _): """Jumps.""" if key == pyglet.window.key.SPACE: self.main_character.do( JumpTo((self.main_character.x + 50, 10), 100, 1, 0.8)) @property def world(self): """Get current world.""" return self.game.state[self.meta["current_world"]] @property def characters(self): """Get current drawable characters""" return self.interface.screens[self.current_screen].characters
class MiCapa(Layer): is_event_handler = True def on_key_press(self, k, _): Personaje.pulsar_tecla[k] = 1 def on_key_release(self, k, _): Personaje.pulsar_tecla[k] = 0 def __init__(self, HUD): super().__init__() self.ancho_ventana, self.alto_ventana = director.get_window_size() self.man_col = CollisionManagerBruteForce() self.HUD = HUD self.lanzar_personaje() self.enemigo() self.schedule(self.update) # Cargamos el fondo self.fondo = Sprite(load('Fondo3.png'), (400, 325)) self.add(self.fondo, z=0) #Posicionamos al personaje en la pantalla def lanzar_personaje(self): self.personaje = Personaje('Personaje.png', self.ancho_ventana * 0.5, 50) self.add(self.personaje, z=1) #Posicionamos los enemigos en pantalla def enemigo(self): for i in range(2): self.enemigo = Enemigo("Enemigo.png", self.ancho_ventana * 0.5, 560 - i * 40) self.add(self.enemigo, z=1) #Llamamos a todos los métodos update() def update(self, dt): self.man_col.clear() for _, node in self.children: if isinstance(node, Actor): node.update(dt) for _, node in self.children: if isinstance(node, Actor): self.man_col.add(node) self.collide(self.personaje) #Definimos el método de colisiones def collide(self, node): if node is not None: for other in self.man_col.iter_colliding(node): if self.children.count((1, other)) != 0: other.kill() if isinstance(other, Enemigo): self.HUD.puntos += 10 self.HUD.update() if self.children.count((1, node)) != 0: node.kill() seq = ImageGrid(load('Explosion.png'), 1, 1) anim = Animation.from_image_sequence(seq, 0.05, False) self.sprite = Sprite(anim, (other.x, other.y)) self.add(self.sprite) self.do(Delay(0.8) + CallFunc(self.sprite.kill))