class EntityPulseExplosion(Entity):
    color = (3, 169, 244)

    def __init__(self, game, x, y, max_radius=None):
        super().__init__(game, BoundBox(Vector2(x, y), Vector2(x, y)))

        self.radius = 0
        self.radius_speed = 0

        if max_radius is None:
            max_radius = math.hypot(game.width / 2, game.height / 2)

        self.max_radius = max_radius
        self.fade_tick = 30

        self.screen = pygame.Surface((game.width, game.height))
        self.screen.set_colorkey((240, 240, 240))
        self.renderer = Render(self.screen)

    def update(self, events):
        super().update(events)

        if self.radius < self.max_radius:
            self.radius_speed += 1
            self.radius += self.radius_speed

        else:
            self.fade_tick -= 1

            if self.fade_tick < 0:
                self.set_dead()

    def render(self, render):
        self.renderer.fill((240, 240, 240))
        self.screen.set_alpha(self.fade_tick / 30 * 255)

        self.renderer.circle(self, self.radius, self.color)

        render.screen.blit(self.screen, (0, 0))
示例#2
0
class Game(object):
    entities = {}
    players = []
    mobs = []
    death_note = []
    life_note = []
    last_entity_id = 0
    key_maps = dict.fromkeys(Keys.list_keys(), False)
    width = 1280
    height = 720
    background = (240, 240, 240)
    passed_patterns = 0
    patterns = []
    avail_patterns_easy = [PatternThorn, PatternRain, PatternFakey]
    avail_patterns_normal = [PatternCircular, PatternDrop, PatternLaser]
    avail_patterns_hard = [PatternTurret, PatternTriangle]
    pre_ui = []
    ui = []

    def __init__(self):
        self.tick = 0
        pygame.init()

        screen = pygame.display.set_mode((self.width, self.height),
                                         pg_vars.DOUBLEBUF)

        pygame.display.set_caption('orange:phobia')

        self.renderer = Render(screen)
        register_all_skills()

        self.skill_ui = None

    def handle_event(self, event):
        for elem in self.ui:
            if elem.ui_event:
                elem.update_event(event)

        if event.type is pg_vars.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type is pg_vars.KEYDOWN:
            if event.key in self.key_maps:
                self.key_maps[event.key] = True

            elif event.key == Keys.KEY_SKILL_UI_TOGGLE:
                # self.toggle_skill_window()
                pass

        elif event.type is pg_vars.KEYUP:
            if event.key in self.key_maps:
                self.key_maps[event.key] = False

    def update(self, events):
        self.tick += 1

        for event in events:
            self.handle_event(event)

        for e in self.entities.values():
            e.update(events)

        for pattern in self.patterns:
            pattern.update()

        for death in self.death_note:
            if death in self.entities:
                death_entity = self.entities[death]

                del self.entities[death]

                if death_entity in self.mobs:
                    self.mobs.remove(death_entity)

        for life in self.life_note:
            life.entity_id = self.last_entity_id
            self.last_entity_id += 1
            self.entities[life.entity_id] = life

        self.life_note = []
        self.death_note = []

    def render(self):
        self.render_background()

        for element in self.pre_ui:
            element.render(self.renderer)

        for entity in self.entities.values():
            entity.render(self.renderer)

        for element in self.ui:
            element.render(self.renderer)

        self.renderer.update()

    def render_background(self):
        self.renderer.fill(self.background)

    def toggle_skill_window(self):
        if self.skill_ui is None:
            return

        if self.skill_ui.is_hidden:
            self.skill_ui.show()

        else:
            self.skill_ui.hide()

    def new_pattern(self, end=True):
        if len(self.players) < 1:
            return

        if end:
            self.players[0].score += 100
            self.passed_patterns += 1

        @delay(1)
        def start_pattern():
            if len(self.players) < 1:
                return

            if self.passed_patterns < 4:
                if random.randint(0, 10) >= 4:
                    chosen_pattern = random.choice(self.avail_patterns_easy)

                else:
                    chosen_pattern = random.choice(self.avail_patterns_normal)

            elif self.passed_patterns < 7:
                if random.randint(0, 10) >= 4:
                    chosen_pattern = random.choice(self.avail_patterns_normal)

                else:
                    chosen_pattern = random.choice(self.avail_patterns_easy)

            else:
                if random.randint(0, 10) >= 4:
                    chosen_pattern = random.choice(self.avail_patterns_hard)

                elif random.randint(0, 10) >= 8:
                    chosen_pattern = random.choice(self.avail_patterns_easy)

                else:
                    chosen_pattern = random.choice(self.avail_patterns_normal)

            chosen_pattern(self, self.players[0]).activate()

        start_pattern()