コード例 #1
0
ファイル: start_game.py プロジェクト: tomislater/kill_spiders
class Main(object):
    def __init__(self):
        self.clock = pygame.time.Clock()
        pygame.mouse.set_visible(0)

        self.surface = main_surface
        self.deadline = 120  # for monster :))

        self.font = pygame.font.Font(None, 30)
        self.background = load_image('background.png')
        pygame.mixer.music.load(load_sound('background.ogg'))

        self.brushing()

        self.level_formula = lambda x: (x + random.randint(5, x + 5))

        self.MAIN_LOOP = self.MENU_LOOP = self.OPTIONS_LOOP = False

        pygame.mixer.music.play(-1, 0.0)
        self.show_menu()
        self.start()

    def brushing(self):
        self.weapons = []
        self.spiders = []
        self.effects = []
        self.dead_spiders = []
        self.hud = Hud()
        self.player = Player()
        self.bonus_time = 0
        self.bonus_timmer = 30
        self.double_bonus = False
        self.tripple_bonus = False
        self.level = 0

    def check_bonus_time(self):
        if self.double_bonus or self.tripple_bonus:
            if time.time() - self.bonus_time >= self.bonus_timmer:
                self.bonus_time = 0
                self.double_bonus = False
                self.tripple_bonus = False

    def event(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                self.MAIN_LOOP = False
            elif event.type == KEYUP:
                if event.key == K_LCTRL:
                    if self.tripple_bonus:
                        self.weapons.\
                            append(WhiteSkull(self.player.rect.centerx - 20, self.player.rect.centery + 20, self.player.direction))
                        self.weapons.\
                            append(WhiteSkull(self.player.rect.centerx + 20, self.player.rect.centery + 20, self.player.direction))
                    elif self.double_bonus:
                        self.weapons.\
                            append(WhiteSkull(self.player.rect.centerx - 20, self.player.rect.centery + 20, self.player.direction))
                    self.weapons.\
                        append(WhiteSkull(self.player.rect.centerx, self.player.rect.centery, self.player.direction))
                elif event.key == K_SPACE:
                    if self.player.black_skulls:
                        self.weapons.\
                            append(BlackSkull(self.player.rect.centerx, self.player.rect.centery, self.player.direction))
                        self.player.black_skulls -= 1
                elif event.key == K_ESCAPE:
                    self.brushing()
                    self.show_menu()

        keys = pygame.key.get_pressed()
        self.player.update(keys)

    def event_menu(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                self.MAIN_LOOP = self.MENU_LOOP = False
            elif event.type == KEYUP:
                if event.key == K_UP:
                    self.catch_pos_menu(-1)
                elif event.key == K_DOWN:
                    self.catch_pos_menu(1)
                elif event.key == K_RETURN:
                    if self.menu_pos == 2:  # exit game
                        self.MAIN_LOOP = self.MENU_LOOP = False
                    elif self.menu_pos == 1:  # options
                        self.options_menu()
                    elif self.menu_pos == 0:  # start game
                        self.MAIN_LOOP = True
                        self.MENU_LOOP = False

    def options_menu(self):
        self.OPTIONS_LOOP = True
        while self.OPTIONS_LOOP:
            self.surface.blit(self.background, (0, 0))
            text_level = self.font.render("LEVEL {0}".format(self.level + 1), True, SILVER)
            text_levelR = text_level.get_rect(centerx=SCREEN_WIDTH / 2, centery=SCREEN_HEIGHT / 2)
            self.surface.blit(text_level, text_levelR)
            pygame.draw.polygon(self.surface, SILVER, ((text_levelR.centerx - 10, text_levelR.centery - 30),
                                                       (text_levelR.centerx + 10, text_levelR.centery - 30),
                                                       (text_levelR.centerx, text_levelR.centery - 40)))
            pygame.draw.polygon(self.surface, SILVER, ((text_levelR.centerx - 10, text_levelR.centery + 30),
                                                       (text_levelR.centerx + 10, text_levelR.centery + 30),
                                                       (text_levelR.centerx, text_levelR.centery + 40)))
            for event in pygame.event.get():
                if event.type == QUIT:
                    self.OPTIONS_LOOP = self.MAIN_LOOP = self.MENU_LOOP = False
                elif event.type == KEYUP:
                    if event.key == K_UP:
                        self.level += 1
                    elif event.key == K_DOWN:
                        if not self.level == 0:
                            self.level -= 1
                    elif event.key in (K_ESCAPE, K_RETURN):
                        self.OPTIONS_LOOP = False

            pygame.display.update()
            self.clock.tick(FPS)

    def catch_pos_menu(self, pos):
        temp_pos = self.menu_pos + pos
        if temp_pos < 0:
            self.menu_pos = 0
        elif temp_pos > 2:
            self.menu_pos = 2
        else:
            self.menu_pos = temp_pos

    def check_collision_spiders(self):
        for i in reversed(xrange(len(self.spiders))):
            # collision with deadline and player
            spider = self.spiders[i]
            if spider.rect.top < self.deadline or (spider.rect.colliderect(self.player) and self.player.alive()):
                self.player.hit()
                self.spiders[i].get_rect_for_dead_spider()
                self.dead_spiders.append(self.spiders.pop(i))
                continue

        for i in reversed(xrange(len(self.dead_spiders))):
            # collision with bottom screen
            if self.dead_spiders[i].rect_dead.top > SCREEN_HEIGHT:
                del self.dead_spiders[i]
                continue

    def check_collision_weapons(self):
        for i in reversed(xrange(len(self.weapons))):
            # collision with spiders
            index_spider = self.weapons[i].rect.collidelist(self.spiders)
            if index_spider != -1:
                (x, y) = self.spiders[index_spider].rect.centerx, self.spiders[index_spider].rect.centery
                self.effects.append(Effects(x, y))
                self.spiders[index_spider].hit(self.weapons[i].hit)
                if not self.spiders[index_spider].alive():
                    self.hud.update_score(self.spiders[index_spider].score)
                    # added bonus
                    if not self.double_bonus and not self.tripple_bonus:
                        if random.randint(self.spiders[index_spider].score, 100) >= 90:
                            if random.random() >= 0.8:
                                self.double_bonus = False
                                self.tripple_bonus = True
                            else:
                                self.double_bonus = True
                                self.tripple_bonus = False
                            self.bonus_time = time.time()
                    self.dead_spiders.append(self.spiders.pop(index_spider))
                del self.weapons[i]
                continue

            # collison with bottom screen
            if self.weapons[i].rect.bottom > SCREEN_HEIGHT:
                del self.weapons[i]
                continue

            self.weapons[i].update()
            self.weapons[i].draw(self.surface)

    def draw_effects(self):
        for i in reversed(xrange(len(self.effects))):
            if self.effects[i].alive():
                self.effects[i].update()
                self.effects[i].draw(self.surface)
            else:
                del self.effects[i]

    def draw_spiders(self):
        for spider in self.spiders:
            spider.update(self.level)
            spider.draw(self.surface)

    def draw_dead_spiders(self):
        for dead_spider in self.dead_spiders:
            dead_spider.update_dead()
            dead_spider.draw_dead(self.surface)

    def make_spiders(self):
        lvl_formula = self.level_formula(self.level)

        for x in xrange(0, lvl_formula):
            self.spiders.append(Spider())

        for x in xrange(0, lvl_formula / 3):
            self.spiders.append(PoisonSpider())

        if self.level >= 5:
            for x in xrange(0, self.level / 5):
                self.spiders.append(Tarantula())

        if self.level >= 10:
            for x in xrange(0, self.level / 10):
                self.spiders.append(GiantSpider())

        if self.level >= 20:
            for x in xrange(0, self.level / 20):
                self.spiders.append(WailingWidow())

    def check_spiders(self):
        if not self.spiders:
            self.player.black_skulls += 5
            self.level += 1

            text_level = self.font.render("LEVEL {0}".format(self.level), True, SILVER)
            text_level_r = text_level.get_rect(centerx=SCREEN_WIDTH / 2, centery=SCREEN_HEIGHT / 2)

            self.surface.blit(self.background, (0, 0))
            self.surface.blit(text_level, text_level_r)

            self.player.draw(self.surface)
            self.hud.draw(self.surface, self.player.health, self.level, self.player.black_skulls, time, self.bonus_time, self.bonus_timmer)

            self.make_spiders()
            self.weapons = []
            self.effects = []
            self.dead_spiders = []
            pygame.display.update()
            self.clock.tick(FPS)
            pygame.time.delay(1500)

    def check_health(self):
        if not self.player.alive():
            self.hud.save_highscore()
            self.animation_game_over()

    def animation_game_over(self):
        game_over_text = self.font.render("GAME OVER", 1, SILVER)
        game_over_text_r = game_over_text.get_rect(centerx=SCREEN_WIDTH / 2, centery=SCREEN_HEIGHT / 2)

        self.surface.blit(self.background, (0, 0))
        self.surface.blit(game_over_text, game_over_text_r)
        self.player.draw(self.surface)
        self.hud.draw(self.surface, self.player.health, self.level, self.player.black_skulls, time, self.bonus_time, self.bonus_timmer)

        pygame.display.update()
        self.clock.tick(FPS)
        pygame.time.delay(3000)

        self.brushing()
        self.show_menu()

    def show_menu(self):
        text_start = self.font.render("START", True, SILVER)
        text_options = self.font.render("OPTIONS", True, SILVER)
        text_exit = self.font.render("EXIT", True, SILVER)

        rect_options = text_options.get_rect(centerx=SCREEN_WIDTH / 2,
                                             centery=SCREEN_HEIGHT / 2)
        rect_start = text_start.get_rect(centerx=rect_options.centerx,
                                         centery=rect_options.centery - 50)
        rect_exit = text_exit.get_rect(centerx=rect_options.centerx,
                                       centery=rect_options.centery + 50)

        # cursors for menu
        self.cur = self.font.render("||", True, SILVER)
        self.l_curR = self.cur.get_rect(topleft=(rect_start.left - 20, rect_start.top))
        self.r_curR = self.cur.get_rect(right=rect_start.right + 20, top=rect_start.top)
        self.surface.blit(self.cur, self.l_curR)
        self.surface.blit(self.cur, self.r_curR)

        self.menu_pos = 0  # default "START"
        self.MENU_LOOP = True
        while self.MENU_LOOP:
            self.surface.blit(self.background, (0, 0))
            self.surface.blit(text_start, rect_start)
            self.surface.blit(text_options, rect_options)
            self.surface.blit(text_exit, rect_exit)

            self.draw_cursor(rect_start, rect_options, rect_exit)
            self.event_menu()

            pygame.display.update()
            self.clock.tick(FPS)

    def draw_cursor(self, start, options, exit):
        if self.menu_pos == 0:
            self.l_curR.left = start.left - 20
            self.r_curR.right = start.right + 20
            self.l_curR.top = start.top
            self.r_curR.top = start.top
            self.surface.blit(self.cur, self.l_curR)
            self.surface.blit(self.cur, self.r_curR)
        elif self.menu_pos == 1:
            self.l_curR.left = options.left - 20
            self.r_curR.right = options.right + 20
            self.l_curR.top = options.top
            self.r_curR.top = options.top
            self.surface.blit(self.cur, self.l_curR)
            self.surface.blit(self.cur, self.r_curR)
        elif self.menu_pos == 2:
            self.l_curR.left = exit.left - 20
            self.r_curR.right = exit.right + 20
            self.l_curR.top = exit.top
            self.r_curR.top = exit.top
            self.surface.blit(self.cur, self.l_curR)
            self.surface.blit(self.cur, self.r_curR)

    def start(self):
        if self.MAIN_LOOP:
            text_controls_ctrl = self.font.render("CTRL - White Skulls (Power: 1)", True, SILVER)
            text_controls_space = self.font.render("SPACE - Black Skulls (Power: 5)", True, SILVER)
            text_info = self.font.render("ONE BLACK SKULL FOR NEXT LEVEL", True, SILVER)
            text_controls_ctrl_r = text_controls_ctrl.get_rect(centerx=SCREEN_WIDTH / 2,
                                                               centery=(SCREEN_HEIGHT / 2) + 30)
            text_controls_space_r = text_controls_space.get_rect(centerx=text_controls_ctrl_r.centerx,
                                                                 centery=text_controls_ctrl_r.centery + 30)
            text_info_r = text_info.get_rect(centerx=text_controls_space_r.centerx,
                                             centery=text_controls_space_r.centery + 60)
            self.surface.blit(self.background, (0, 0))
            self.surface.blit(text_controls_ctrl, text_controls_ctrl_r)
            self.surface.blit(text_controls_space, text_controls_space_r)
            self.surface.blit(text_info, text_info_r)
            pygame.display.update()
            self.clock.tick(FPS)
            pygame.time.delay(5000)

        while self.MAIN_LOOP:
            pygame.display.set_caption("FPS: {0:.0f}".format(self.clock.get_fps()))

            self.surface.blit(self.background, (0, 0))

            self.draw_dead_spiders()

            self.check_spiders()
            self.draw_spiders()

            self.player.draw(self.surface)
            self.hud.draw(self.surface, self.player.health, self.level, self.player.black_skulls, time, self.bonus_time, self.bonus_timmer)
            self.event()

            self.check_collision_spiders()
            self.check_collision_weapons()

            self.check_health()

            self.draw_effects()

            self.check_bonus_time()

            pygame.display.update()
            self.clock.tick(FPS)

        pygame.mixer.music.stop()
        pygame.quit()