Ejemplo n.º 1
0
def main(screen, window_size):
    """
    :param screen: the surface object
    :param window_size: the window size as a tuple
    :return: void
    This is the main game loop
    """
    FPS = 30
    FPS_CLOCK = pygame.time.Clock()

    pygame.mixer.music.load('battle.ogg')
    pygame.mixer.music.play(-1)
    whip = pygame.mixer.Sound('whip.ogg')
    boom = pygame.mixer.Sound('boom.ogg')
    pond = pygame.image.load('pond.png')

    # Draw Frogs
    frog1 = Frog(1, window_size)
    crosshair1 = Crosshair(window_size, 1)

    frog2 = Frog(2, window_size)
    crosshair2 = Crosshair(window_size, 2)

    # Fly Setup
    fly_sprites = pygame.sprite.Group()
    FLY_SPAWN = pygame.USEREVENT + 1
    pygame.time.set_timer(FLY_SPAWN, 1000)

    # Dragonfly Setup
    dfly_sprites = pygame.sprite.Group()
    DFLY_SPAWN = pygame.USEREVENT + 2
    pygame.time.set_timer(DFLY_SPAWN, 5000)

    fireballs1 = pygame.sprite.Group()
    fireballs2 = pygame.sprite.Group()

    # Text
    start_ticks = pygame.time.get_ticks()
    timer = 61
    timer_font = pygame.font.SysFont('berlinsansfb', 50)
    score_font = pygame.font.SysFont('berlinsansfb', 30)

    p1_move_right = False
    p1_move_left = False
    p1_charge = 0
    p1_score = 0
    p1_fire = 0

    p2_move_right = False
    p2_move_left = False
    p2_charge = 0
    p2_score = 0
    p2_fire = 0
    while True:  # <--- main game loop

        seconds = (pygame.time.get_ticks() - start_ticks)/1000

        # render objects
        SCREEN.blit(pond, (0, 0))
        frog1.draw(SCREEN)
        frog2.draw(SCREEN)

        if len(dfly_sprites) > 0:
            dfly_sprites.update()
            dfly_sprites.draw(SCREEN)
        if len(fly_sprites) > 0:
            fly_sprites.update()
            fly_sprites.draw(SCREEN)
        if len(fireballs1) > 0:
            fireballs1.update()
            fireballs1.draw(SCREEN)
            frogs_stunned = pygame.sprite.spritecollide(frog2, fireballs1, True)
            if len(frogs_stunned) > 0:
                frog2.stunned = True
                p2_charge = 0
                crosshair2.charging = 0
                frog2.time_of_stun = timer - seconds
        if len(fireballs2) > 0:
            fireballs2.update()
            fireballs2.draw(SCREEN)
            frogs_stunned = pygame.sprite.spritecollide(frog1, fireballs2, True)
            if len(frogs_stunned) > 0:
                frog1.stunned = True
                p1_charge = 0
                crosshair1.charging = 0
                frog1.time_of_stun = timer - seconds

        # draw targeting line and charge meter for frog 1
        draw_line(screen, frog1.mouth, (crosshair1.x + crosshair1.size[0]/2, crosshair1.y + crosshair1.size[1]/2))
        crosshair1.draw(SCREEN, p1_charge * 5)

        # draw targeting line and charge meter for frog 2
        draw_line(screen, frog2.mouth,  (crosshair2.x + crosshair2.size[0]/2, crosshair2.y + crosshair2.size[1]/2))
        crosshair2.draw(SCREEN, p2_charge * 5)

        for event in pygame.event.get():
            if event.type == QUIT:  # QUIT event to exit the game
                pygame.quit()
                sys.exit()

            # Fly event timer
            if event.type == FLY_SPAWN:
                if len(fly_sprites) < 10:
                    if random.randrange(0, 2) == 0:
                        fly = Fly(0, random.randrange(175, 501), random.randrange(1, 11))
                        fly_sprites.add(fly)
                    else:
                        fly = Fly(700, random.randrange(175, 501), random.randrange(1, 11))
                        fly_sprites.add(fly)

            # Dragonfly event timer
            if event.type == DFLY_SPAWN:
                if len(dfly_sprites) < 1:
                    if random.randrange(0, 2) == 0:
                        dragonfly = Dragonfly(0, random.randrange(175, 450), random.randrange(5, 11), random.randrange(3,11))
                        dfly_sprites.add(dragonfly)
                    else:
                        dragonfly = Dragonfly(700, random.randrange(175, 450), random.randrange(5, 11), random.randrange(3,11))
                        dfly_sprites.add(dragonfly)

            # Input events
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    return 0
                # Player 1
                if event.key == K_LEFT:
                    p1_move_left = True
                if event.key == K_RIGHT:
                    p1_move_right = True
                if event.key == K_DOWN and not frog1.stunned:
                    crosshair1.charging = True

                # Player 2
                if event.key == K_a:
                    p2_move_left = True
                if event.key == K_d:
                    p2_move_right = True
                if event.key == K_s and not frog2.stunned:
                    crosshair2.charging = True

                # Quit
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()

            if event.type == KEYUP:
                # Player 1
                if event.key == K_LEFT:
                    p1_move_left = False
                if event.key == K_RIGHT:
                    p1_move_right = False
                if event.key == K_DOWN and not frog1.stunned:
                    whip.play()
                    crosshair1.charging = False
                    xhair1 = (crosshair1.x + crosshair1.size[0]/2,crosshair1.y + crosshair1.size[1]/2)
                    hit_list, is_dragon = frog1.fire_tongue(SCREEN, p1_charge, xhair1[0], xhair1[1], fly_sprites, dfly_sprites)
                    p1_score += len(hit_list)
                    if len(hit_list) > 0 and p1_charge >= 15:
                        p1_score += 2
                    if is_dragon:
                        p1_fire += 1
                        p1_score += 1
                    p1_charge = 0
                if event.key == K_UP and not frog1.stunned:
                    if p1_fire > 0:
                        boom.play()
                        fireball = Fireball(1, frog1.x + 50, frog1.y)
                        fireballs1.add(fireball)
                        p1_fire -= 1

                # Player 2
                if event.key == K_a:
                    p2_move_left = False
                if event.key == K_d:
                    p2_move_right = False
                if event.key == K_s and not frog2.stunned:
                    whip.play()
                    crosshair2.charging = False
                    xhair2 = (crosshair2.x + crosshair2.size[0]/2, crosshair2.y + crosshair2.size[1]/2)
                    hit_list, is_dragon = frog2.fire_tongue(SCREEN, p2_charge, xhair2[0], xhair2[1], fly_sprites, dfly_sprites)
                    p2_score += len(hit_list)
                    if len(hit_list) > 0 and p2_charge >= 15:
                        p2_score += 2
                    if is_dragon:
                        p2_fire += 1
                        p2_score += 1
                    p2_charge = 0
                if event.key == K_w and not frog2.stunned:
                    if p2_fire > 0:
                        boom.play()
                        fireball = Fireball(2, frog2.x + 50, frog2.size[1] - 45)
                        fireballs2.add(fireball)
                        p2_fire -= 1

        # Player 1 crosshair events
        if p1_move_left and not crosshair1.x < 0:
            crosshair1.change_x(-15)
        if p1_move_right and not crosshair1.x > window_size[0] - crosshair1.size[0]:
            crosshair1.change_x(15)
        if crosshair1.charging:
            if p1_charge < 20:
                p1_charge += 0.5

        # Player 2 crosshair events
        if p2_move_left and not crosshair2.x < 0:
            crosshair2.change_x(-15)
        if p2_move_right and not crosshair2.x > window_size[0] - crosshair2.size[0]:
            crosshair2.change_x(15)
        if crosshair2.charging:
            if p2_charge < 20:
                p2_charge += 0.5

        # Calculate, render timers
        if timer - seconds > 0:
            timer_text = str(round(timer - seconds, 2))
        else:
            timer_text = 'GAME OVER'
        if frog1.stunned:
            if (timer - seconds) < frog1.time_of_stun - 2:
                frog1.stunned = False
        if frog2.stunned:
            if (timer - seconds) < frog2.time_of_stun - 2:
                frog2.stunned = False
        SCREEN.blit(timer_font.render(timer_text, False, (255, 0, 0)), (25, 25))
        if (timer - seconds) <= 0:
            if p1_score > p2_score:
                return 1
            elif p2_score > p1_score:
                return 2
            elif p1_score == p2_score:
                return 3

        # render HUD info
        p1_score_text = 'Player 1: ' + str(p1_score)
        p1_fire_text = 'Fireballs: ' + str(p1_fire)

        p2_score_text = 'Player 2: ' + str(p2_score)
        p2_fire_text = 'Fireballs: ' + str(p2_fire)

        SCREEN.blit(score_font.render(p1_score_text, True, (0, 0, 0)),
                    (window_size[0]/2 + frog1.size[0]/2 + 25, window_size[1] - 75))
        SCREEN.blit(score_font.render(p1_fire_text, True, (0, 0, 0)),
                    (window_size[0]/2 + frog1.size[0]/2 + 25, window_size[1] - 50))
        SCREEN.blit(score_font.render(p2_score_text, True, (0, 0, 0)),
                    (window_size[0]/2 + frog1.size[0]/2 + 25, 25))
        SCREEN.blit(score_font.render(p2_fire_text, True, (0, 0, 0)),
                    (window_size[0]/2 + frog1.size[0]/2 + 25, 50))

        pygame.display.update()
        FPS_CLOCK.tick(FPS)