def _dimensions(obj): if isinstance(obj, Entity): return obj.dimensions() elif isinstance(obj, SpriteTile): return Point2D(obj.dimensions.x, obj.dimensions.y) else: return Point2D(TILE_SIZE * obj.repeat_x, TILE_SIZE * obj.repeat_y)
def __init__(self): center = (WIDTH // 2, HEIGHT // 2) super().__init__([ Button(40, center[1] - 30 + 110, Sprite('buttons/start_selected.png', Point2D(200, 60)), Sprite('buttons/start_deselected.png', Point2D(200, 60)), partial(self._set_state, 1)), Button(40, center[1] - 30 + 200, Sprite('buttons/quit_selected.png', Point2D(200, 60)), Sprite('buttons/quit_deselected.png', Point2D(200, 60)), partial(self._set_state, 2)) ]) self.state = 0
def __init__(self, x, y): super().__init__(Point2D(x, y), 5, False, AnimatedSprite('moth.png', Point2D(64, 64), 8), 60, 25, enemy=True) self.moving_random = 0 self.random_direction = (0, 0)
def __init__(self): super().__init__( Point2D(WIDTH / 2, PLAYER_SPAWN + 256), 10, True, 0.3, AnimatedSprite('player_idle.png', Point2D(25, 44), 3, speed=0.25), 100, 4) self.animation_state = self.PlayerStates.IDLE self.fading = False self.can_fade = True self.swinging = False self.can_shoot = True
def __init__(self, x, y): super().__init__(Point2D(x, y), 3, False, AnimatedSprite('fire_skull.png', Point2D(32, 50), 11, speed=0.25), 100, 0, enemy=True) self._can_fire = True
def __init__(self, x, y): super().__init__(Point2D(x, y), 8, False, 0.3, AnimatedSprite('spider_idle.png', Point2D(32, 32), 2, speed=0.25), 50, 20, enemy=True) self._midair = False
def __init__(self, x, y): super().__init__(Point2D(x, y), 5, False, AnimatedSprite('ice_demon.png', Point2D(32, 64), 4, speed=0.25), 60, 10, enemy=True) self._can_teleport = True self._invisible = False self._can_fire = True
def update(self): self.window.blit(self._title_screen, (0, 0)) x, y = pygame.mouse.get_pos() self._menu.update(Point2D(x, y), pygame.mouse.get_pressed()[0]) self.window.draw_menu(self._menu) self.state = self._menu.state return self.state != 2
def _end_teleport(self): self._sprite = AnimatedSprite('ice_demon.png', Point2D(32, 64), 4, speed=0.25) self.invulnerable = False self._can_teleport = True
def __init__(self, x, y): super().__init__( Point2D(x, y), 0, False, AnimatedSprite('final_boss.png', Point2D(144, 108), 32, speed=0.25), 400, 0, True) self.y_offset = 0 self.start_y = y self.downward = False self._spawned_moths = 0 self.phase = 0 self._spawned_fire_balls = 0 self._spawned_icicles = 0 self._teleported = 0 self._can_teleport = True self._set_phase_5_timer = False self._can_shoot = True
def _reappear(self): self._sprite = AnimatedSprite('ice_demon_teleport.png', Point2D(32, 64), 6, speed=0.25, reverse=True) self._invisible = False self.set_timer('end-teleport', 16, self._end_teleport)
def _die(self): self.health = 1 self._change_sprite( AnimatedSprite('icicle_death.png', Point2D(32, 32), 7, speed=0.25)) self._dead = True self.invulnerable = True self.damage = 0 self.set_timer('despawn', 24, self._despawn)
def update(self, player_pos): if self.force.y_mag != 0: self._midair = True self._change_sprite(Sprite('spider_midair.png', Point2D(32, 32))) self.transform(x=1 if player_pos.x > self.position.x else -1, y=1 if player_pos.y > self.position.y else -1) else: self._change_sprite( AnimatedSprite('spider_idle.png', Point2D(32, 32), 2, speed=0.25)) self.should_damage = False if randint(0, 10) == 0: self._jump() super().update()
def _reset(self): self._change_sprite( AnimatedSprite('final_boss.png', Point2D(144, 108), 32, speed=0.25)) if self._teleported > 15: self.phase = 6 else: self._can_teleport = True
def __init__(self, x, y, dx, dy, parent): super().__init__(AnimatedSprite('fire_ball.png', Point2D(25, 23), 3), x, y, dx, dy, 5, 50, parent, enemy=True)
def teleport(self): if not self._can_teleport: return self.invulnerable = True self._can_teleport = False self._sprite = AnimatedSprite('ice_demon_teleport.png', Point2D(32, 64), 6, speed=0.25) self.set_timer('disappear', 16, self._disappear)
def __init__(self, path, x, y, width, height, collidable=False, damage=0, frames=1, speed=0.25, render_first=False): self._path = 'sprites/' + path self._sprite = rm.load(self._path) self.frames = frames self.position = Point2D(x, y) self.dimensions = Point2D(width, height) self.collidable = collidable self.damage = damage self._animation_counter = 0 self._animation_speed = speed self.render_first = render_first
def __init__(self, x, y, dx, dy, parent): super().__init__(AnimatedSprite('icicle.png', Point2D(27, 7), 5), x, y, dx, dy, 7, 60, parent, enemy=True) self.set_timer('die', 1000, self._die) self._dead = False
def _update_paused(self): self.window.draw_overlay((125, 125, 125), 50) if not self._pause_menu: self._pause_menu = PauseMenu() x, y = pygame.mouse.get_pos() self._pause_menu.update(Point2D(x, y), pygame.mouse.get_pressed()[0] == 1) self.window.draw_menu(self._pause_menu) if self._pause_menu.state >= 1: self._paused = False if self._pause_menu.state == 2: self.player_alive = False self._pause_menu.state = 0
def _move(self, player_pos): if self._teleported > 15: self.position.x = WIDTH // 2 - 72 elif player_pos.x - 72 < 1: self.position.x = 1 elif player_pos.x - 72 > 572: self.position.x = 572 else: self.position.x = player_pos.x - 72 self._change_sprite( AnimatedSprite('final_boss_teleport.png', Point2D(144, 108), 7, speed=0.5)) self.set_timer('reset', 14, self._reset)
def __init__(self, x, y, sprite_x, sprite_y, repeat_x=1, repeat_y=1, collidable=True, damage=0, render_first=False): self.position = Point2D(x, y) self.sprite_x, self.sprite_y = sprite_x, sprite_y self.repeat_x, self.repeat_y = repeat_x, repeat_y self.collidable = collidable self.damage = damage self.render_first = render_first
def __init__(self, sprite, x, y, dx, dy, speed, damage, parent, enemy=False): super().__init__(Point2D(x, y), speed, False, sprite, 1, damage, enemy=enemy) self._update_rotation(dx, dy) # 0 out dx and dy self.dx, self.dy = 0, 0, self._flatten_direction(dx, dy) self.parent = parent
def animate(self): if self.health == 0: am.play_sound('death.ogg', volume=0.2) self._change_sprite(Sprite('player_dead.png', Point2D(44, 13))) elif self.animation_state == self.PlayerStates.SWINGING: self._change_sprite( AnimatedSprite('player_swing.png', Point2D(50, 43), 5, speed=0.5)) elif self.animation_state == self.PlayerStates.SWING_RUNNING: self._change_sprite( AnimatedSprite('player_swing_running.png', Point2D(50, 44), 5, speed=0.5)) elif self.animation_state == self.PlayerStates.SHOOTING: self._change_sprite( AnimatedSprite('player_shoot.png', Point2D(25, 44), 5, speed=0.5)) elif self.force.y_mag != 0: self._change_sprite(Sprite('player_midair.png', Point2D(25, 44))) am.stop_sound('running_on_grass.ogg') elif self.animation_state == self.PlayerStates.RUNNING: self._change_sprite( AnimatedSprite('player_running.png', Point2D(25, 44), 7)) am.play_sound('running_on_grass.ogg') self.animation_state = self.PlayerStates.IDLE else: self._change_sprite( AnimatedSprite('player_idle.png', Point2D(25, 44), 3, speed=0.25)) am.stop_sound('running_on_grass.ogg')
def __init__(self, x, y, width, height, destination): super().__init__(Point2D(x, y), 0, False, None, 1, 0) self.width, self.height = width, height self.destination = destination
def __init__(self, x, y, facing, player): dx = -1 if facing else 1 super().__init__(Sprite('arrow.png', Point2D(19, 5)), x, y, dx, 0, 20, 15, player)
def __init__(self, x, y, sprite_selected, sprite_deselected, fn): self.position = Point2D(x, y) self.sprite_selected = sprite_selected self.sprite_deselected = sprite_deselected self.selected = False self._click_event = fn
def __init__(self, x, y, width, height): self.position = Point2D(x, y) self.dimensions = Point2D(width, height)
def __init__(self, x): super().__init__( Point2D(x, 0), 0, False, AnimatedSprite('death_field.png', Point2D(144, 480), 7), 1, 100, False) self.time_alive = 0
def update(self, player_pos, entities): super().update() if len(self.children) != 0: return if self.phase == 0: if self._spawned_moths < 2 and randint(0, 40) == 0: self.children.append(Moth(self.position.x, self.position.y)) self._spawned_moths += 1 elif self._spawned_moths > 1 and len( [x for x in entities if isinstance(x, Moth)]) == 0: self.children.extend([ Icicle(self.position.x, self.position.y, 0, 0, self), Icicle(self.position.x + 72, self.position.y, 0, 0, self), Icicle(self.position.x + 144, self.position.y, 0, 0, self) ]) self.phase = 1 elif self.phase == 1: if len([x for x in entities if isinstance(x, Icicle)]) == 0: self.phase = 2 elif self.phase == 2: self._spawn_fire_ball() self.phase = 3 elif self.phase == 4: if len([x for x in entities if isinstance(x, Heart) ]) == 0 and not self._set_phase_5_timer: self.set_timer('progress-5', 30, self._set_to_5) self._set_phase_5_timer = True elif self.phase == 5: if self._can_teleport and randint(0, 5) == 0: self._teleport(player_pos) elif self.phase == 6: self._spawn_icicle() self.phase = 7 elif self.phase == 8: if len([x for x in entities if isinstance(x, Heart)]) == 0: self.phase = 9 elif self.phase == 9: if self.position.y > TILE_SIZE * 2: self.position.y -= 1 else: self.phase = 10 return elif self.phase == 10: if self.health < 50: self.invulnerable = True self.phase = 11 elif self._can_shoot: self._shoot_fireball(player_pos) return elif self.phase == 11: self._change_sprite( AnimatedSprite('final_boss_death.png', Point2D(144, 108), 8, speed=0.25)) self.set_timer('death-timer', 24, self._die) self.phase = 12 return else: return self.position.y = self.start_y + self.y_offset if abs(self.y_offset) > 16: self.downward = not self.downward if self.downward: self.y_offset -= 0.25 else: self.y_offset += 0.25
def _disappear(self): self._sprite = Sprite(None, Point2D(32, 64)) self._invisible = True self.set_timer('reappear', 50, self._reappear)