コード例 #1
0
def game_screen(screen):
    # Carrega todos os assets uma vez só e guarda em um dicionário
    assets = load_assets(img_dir, snd_dir, fnt_dir)

    # Variável para o ajuste de velocidade
    clock = pygame.time.Clock()

    # Carrega o fundo do jogo
    background = assets["background"]
    background_rect = background.get_rect()

    pygame.mixer.music.load(
        path.join(
            snd_dir,
            'LightingGrass+Wind EffectSound Test-[AudioTrimmer.com].ogg'))
    pygame.mixer.music.set_volume(0.4)

    # Cria uma nave. O construtor será chamado automaticamente.
    player = Player(assets["boneco_anim"])
    score_font = assets["score_font"]

    #    # Carrega a fonte para desenhar o score.
    #    score_font = assets["score_font"]

    # Cria um grupo de todos os sprites e adiciona a nave.
    all_sprites = pygame.sprite.Group()
    all_sprites.add(player)

    # Cria um grupo dos meteoros

    mobs1 = pygame.sprite.Group()
    mobs2 = pygame.sprite.Group()
    mobs3 = pygame.sprite.Group()
    mobs4 = pygame.sprite.Group()
    mobs5 = pygame.sprite.Group()
    life = pygame.sprite.Group()

    # Cria 2 meteoros e adiciona no grupo meteoros

    m = HOLE(assets["hole_img"])
    all_sprites.add(m)
    mobs1.add(m)

    w = HOLE(assets["hole_img"])

    u = UNIC(assets["uni_anim"])
    all_sprites.add(u)
    mobs2.add(u)

    b = BARRIL(assets["bar_anim"])
    all_sprites.add(b)
    mobs3.add(b)

    p = Premio(assets["premio_img"])
    all_sprites.add(p)
    mobs4.add(p)

    p2 = PREMIO(assets["saco_2"])
    all_sprites.add(p2)
    mobs5.add(p2)

    lives = 3
    PLAYING = 0
    DONE = 2
    x = 00
    score = 0
    tesouros = 0
    contador = 0

    pygame.mixer.music.play(loops=-1)

    for i in range(lives):

        l = LIVES(assets["lives_img"], x)
        life.add(l)
        x += 40

    state = PLAYING
    while state != DONE:
        # Ajusta a velocidade do jogo.
        clock.tick(FPS)
        if state == PLAYING:
            # Processa os eventos (mouse, teclado, botão, etc).
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    state = DONE

                # Verifica se apertou alguma tecla.
                if event.type == pygame.KEYDOWN:
                    # Dependendo da tecla, altera a velocidade.
                    if event.key == pygame.K_LEFT:
                        player.speedx = -8
                    if event.key == pygame.K_RIGHT:
                        player.speedx = 9
#                     Se for um espaço atira!
                    if event.key == pygame.K_SPACE:
                        player.speedy = -30
                        assets["pulando"].play()

                # Verifica se soltou alguma tecla.
                if event.type == pygame.KEYUP:
                    # Dependendo da tecla, altera a velocidade.
                    if event.key == pygame.K_LEFT:
                        player.speedx = 0
                    if event.key == pygame.K_RIGHT:
                        player.speedx = 0
                    if event.key == pygame.K_SPACE:
                        player.speedy = 50

        # Depois de processar os eventos.
        # Atualiza a acao de cada sprite.
        all_sprites.update()

        if state == PLAYING:
            #
            # Verifica se houve colisão entre nave e meteoro
            if player.rect.left >= 930:
                x = lives * 40
                lives += 1
                l = LIVES(assets["lives_img"], x)
                life.add(l)
                life.draw(screen)
                b.rect.left = 1000
                u.rect.left = 1000
                score += 100
                if score >= 700:
                    all_sprites.remove(w)
                    mobs1.remove(w)
                    u.speedx = -7
                    b.speedx = -3
                    all_sprites.add(w)
                    mobs1.add(w)
                    w.rect.left = m.rect.left + 250
                if contador == 1 or contador % 4 == 3:
                    p = Premio(assets["premio_img"])
                    all_sprites.add(p)
                    mobs4.add(p)
                    p.rect.left = random.randint(750, 900)
                    p.rect.bottom = 635 - 110

                contador += 1
                if contador % 3 == 1:
                    background = assets["background2"]
                    background_rect = background.get_rect()
                    m.rect.left = random.randint(450, 1000)
                    m.rect.bottom = 710

                elif contador % 3 == 2:
                    background = assets["background3"]
                    background_rect = background.get_rect()
                    m.rect.left = random.randint(450, 1000)
                    m.rect.bottom = 710

                elif contador % 3 == 0:
                    background = assets["background"]
                    background_rect = background.get_rect()
                    m.rect.left = random.randint(450, 1000)
                    m.rect.bottom = 710

            for e in [mobs1, mobs2, mobs3]:
                hits = pygame.sprite.spritecollide(player, e, True)
                if hits:

                    player.rect.left = 100
                    lives -= 1
                    life.empty()
                    if e == mobs1 and score < 700:
                        m = HOLE(assets["hole_img"])
                        all_sprites.add(m)
                        mobs1.add(m)
                    elif e == mobs1 and score >= 700:
                        m.kill()
                        w.kill()
                        m = HOLE(assets["hole_img"])
                        all_sprites.add(m)
                        mobs1.add(m)
                        w = HOLE(assets["hole_img"])
                        all_sprites.add(w)
                        mobs1.add(w)
                        w.rect.left = m.rect.left - random.randint(200, 400)
                    if e == mobs2:
                        assets["unicornio"].play()
                        u = UNIC(assets["uni_anim"])
                        all_sprites.add(u)
                        mobs2.add(u)
                    if e == mobs3:
                        b = BARRIL(assets["bar_anim"])
                        all_sprites.add(b)
                        mobs3.add(b)
                    a = 0
                    for i in range(lives):
                        l = LIVES(assets["lives_img"], a)
                        life.add(l)

                        a += 40
                    life.draw(screen)

            hits = pygame.sprite.spritecollide(player, mobs4, True)

            if hits:
                tesouros += 1
                score += 150
            if len(str(score)) == 1:
                p2.rect.left = 100
            elif len(str(score)) == 3:
                p2.rect.left = 150
            elif len(str(score)) == 4:
                p2.rect.left = 175
            if lives <= 0:
                player.kill()
                pygame.mixer.music.stop()
                assets["musica_fim"].play()
                return FIM, score

            # A cada loop, redesenha o fundo e os sprites
            screen.fill(BLACK)
            screen.blit(background, background_rect)
            all_sprites.draw(screen)
            life.draw(screen)

            text_surface = score_font.render("{:0}X ".format(score), True,
                                             YELLOW)
            text_rect = text_surface.get_rect()
            text_rect.left = 45

            text_rect.top = 51
            text_rect.bottom = 101

            screen.blit(text_surface, text_rect)

        # Depois de desenhar tudo, inverte o display.
        pygame.display.flip()
    return QUIT, tesouros
コード例 #2
0
def tela_mostra_pontuacao(screen, nomecolocado, pont):

    # fontes com os tamanhos 
    largeText = pygame.font.Font(path.join(fnt_dir, "PressStart2P.ttf"), 27)
    maiortext = pygame.font.Font(path.join(fnt_dir, "PressStart2P.ttf"), 40)
    clock = pygame.time.Clock()

    # todas as informações na tela, junto com a imagem de fundo
    background = pygame.image.load(path.join(img_dir, "tela_inicial.png")).convert()
    background_rect = background.get_rect()
    screen.blit(background, background_rect)

    poetexto, thenew = text_object(f"{nomecolocado}", maiortext)
    thenew.center = ((WIDTH/2),(HEIGHT/2-360))
    screen.blit(poetexto, thenew)

    poetexto2, thenew = text_object("SUA PONTUAÇÃO:", largeText)
    thenew.center = ((WIDTH/2),(HEIGHT/2 - 300))
    screen.blit(poetexto2, thenew)

    poenome, thenew = text_object(f"{pont}", maiortext)
    thenew.center = ((WIDTH/2),(HEIGHT/2 - 250))
    screen.blit(poenome, thenew)

    # Colocando os botões 
    button("RESTART (R)", 180, 540, 75, 50, YELLOW, bright_YELLOW)
    button("QUIT (Q)", 345, 540, 75, 50, WHITE, WHITE)

    # Vendo se a pessoa foi recordista ou não
    maior_pontuacao = get_high_score()
    if pont >= maior_pontuacao:
        poenome, thenew = text_object("O MAIS NOVO", largeText)
        thenew.center = ((WIDTH/2),(HEIGHT/2 - 100))
        screen.blit(poenome, thenew)
        poenome, thenew = text_object("RECORDISTA!", largeText)
        thenew.center = ((WIDTH/2),(HEIGHT/2 - 40))
        screen.blit(poenome, thenew)

    pygame.display.flip()
    clock.tick(30)

    # Coloca ações para os "botões" do final do jogo
    done = False
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    principal("")
                    done = True
                if event.key == pygame.K_r:
                    principal(nomecolocado) 
                    done = True

        # Carrega a fonte para desenhar o score.
        score_font = assets["score_font"]

        # Cria um carrinho. O construtor será chamado automaticamente. O for é para a animação da roda
        carro=[]
        for i in range(4):
            carrinho = "game_over{}.png".format(i)
            player_img = pygame.image.load(path.join(img_dir, carrinho)).convert()
            player_img = pygame.transform.scale(player_img, (58, 75))
            player_img.set_colorkey(WHITE)
            carro.append(player_img)
        player = Player(carro)

        # Cria todos os sprites e adiciona o player em tal
        all_sprites = pygame.sprite.Group()
        all_sprites.add(player)

        # Cria um grupo só dos carrinhos inimigos. O for é para a animação das rodas
        mobs = pygame.sprite.Group()
        inimigo=[]
        for i in range(4):
            filename = "inimigo{}.png".format(i)
            inimigo_img = pygame.image.load(path.join(img_dir, filename)).convert()
            inimigo_img = pygame.transform.scale(inimigo_img, (58, 75))  
            inimigo_img.set_colorkey(WHITE)
            inimigo.append(inimigo_img)
        
        # grupo para moedas
        mais = pygame.sprite.Group()

        # grupo para caixas
        box = pygame.sprite.Group()


        #grupo de tiros
        tiro = pygame.sprite.Group()

        # cria carrinhos e add em mobs
        for i in range(4):
            m = Mob(inimigo)
            all_sprites.add(m)
            mobs.add(m)
            
        #cria as moedas
        imagem_mais=[]
        for i in range(9):
            filename = "mais{}.png".format(i)
            Mais_img = pygame.image.load(path.join(img_dir, filename)).convert()
            Mais_img = pygame.transform.scale(Mais_img, (35, 35))
            Mais_img.set_colorkey(WHITE)
            imagem_mais.append(Mais_img)

        # adiciona as moedas nos
        c = Mais(imagem_mais)
        all_sprites.add(c)
        mais.add(c)
        
        # define quantos tiros a pessoa começa e quantos pontos
        contagemdetiros = 3
        score = 0
          
        
            nomecolocado = tela_inicial(screen)

        # loop principal
        running = True
        while running:

            # ajusta a velocidade do jogo
            clock.tick(FPS)

    
            # sortear caixinha
            if random.randrange(1, 700) == 1:
                b = Box(assets["box_img"])
                all_sprites.add(b)
                box.add(b)

            # sortear moeda
            if random.randrange(1,500) == 1:
                m = (imagem_mais)
                all_sprites.add(c)
                mais.add(c)
    
            # eventos (mouse, teclado, botão, etc).
            for event in pygame.event.get():
                
                #  fechado.
                if event.type == pygame.QUIT:
                    running = False
                
                # apertou alguma tecla.
                if event.type == pygame.KEYDOWN:
                    
                    # dependendo da tecla, altera a velocidade.
                    fator = 0
                    if estanevando or estanevando_tempo > 0:
                        fator = 2
                    if event.key == pygame.K_LEFT:
                        speedx = -5 + fator
                    if event.key == pygame.K_RIGHT:
                        speedx = 5 + fator
                    
                    # se for um espaço, atira! (se tiver)
                    if contagemdetiros > 0:    
                        if event.key == pygame.K_SPACE:
                            tiroo = Tiro(assets["tiro_img"], player.rect.centerx, player.rect.top)
                            all_sprites.add(tiro)
                            tiro.add(tiroo)
                            pew_sound.play()
                            contagemdetiros -= 1
                                      
                # se soltou alguma tecla.
                if event.type == pygame.KEYUP:
                    fator = 0
                    if estanevando or estanevando_tempo > 0:
                        fator = 2
                    
            
            # velocidade em x do player (carro)
            player.speedx = speedx
                        
            # se jogador encostou a parede. Se encostar, morre.
            if player.rect.right > 519:
                batida_sound.play()
                running = False
            if player.rect.left < 89:
                batida_sound.play()
                running = False    
            
        
            all_sprites.update()
                
            # se tiro acertou carrinhos
            hits = pygame.sprite.groupcollide(mobs, tiro, True, True)
            for hit in hits:
                #precisa gerar outro
                destroy_sound.play()
                m = Mob(inimigo) 
                all_sprites.add(m)
                mobs.add(m)
                score += 5
            
            # se bater
            hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)
            if hits:
                boom_sound.play()
                # Precisa esperar senão fecha duma vez
                time.sleep(0.5)
                running = False
            
            # pegar o mais
            hits = pygame.sprite.spritecollide(player, mais, True, False)
            if hits:
                mais.play()
                score += 10

            # pegar a caixa
            hits = pygame.sprite.spritecollide(player, caixa, True, False)
            for hit in hits:
                Ta_Da.play()
                score += 5
                contagemdetiros += 3
                

            # vai aumentando e estabiliza em 18
            if velocidade < 18:
                velocidade += aceleracao

            # a cada loop, redesenha o fundo e os sprites  
            background_y_cima += velocidade
            background_y += velocidade
    
            if background_y >= HEIGHT:
                background_y = 0
                background_y_cima = -HEIGHT

            background_rect_cima.y = background_y_cima
            background_rect.y = background_y               

            screen.blit(background, background_rect_cima)
            screen.blit(background, background_rect)
            all_sprites.draw(screen)

            # Desenha o score, por tempo
            timee += 1
            pont = (timee//FPS)+score
            text_surface = score_font.render("{:01d}".format(pont), True, BLACK)           
            text_rect = text_surface.get_rect()
            text_rect.midtop = (WIDTH-300,  10)
            screen.blit(text_surface, text_rect)

            if contagemdetiros > 0:
                text_surface = score_font.render("SPACE:{:01d} ESPECIAIS".format(contagemdetiros), True, BLACK)
                text_rect = text_surface.get_rect()
                text_rect.midtop = (WIDTH/2,  HEIGHT-130)
                screen.blit(text_surface, text_rect)                

           
            pygame.display.flip()

            # para ver se a pessoa fez a maior pontuação
            maior_pontuacao(pont, nomecolocado)

        # maior pontuador
        maior_pontuacao(pont, nomecolocado)

        # tela final para mostrar a pontuação da pessoa
        tela_mostra_pontuacao(screen, nomecolocado, pont)

        # Matando os mobs e o player para fazê-lo novamente quando voltar o loop
        for mobs in all_sprites:
            mobs.kill()
            player.kill()
コード例 #3
0
ファイル: agora_vai.py プロジェクト: williamars/SPEEDRETRO
def principal(nomecolocado):

    game_roda = True
    while game_roda:

        # Sorteia uma música para o jogo
        a = random.randint(0, 10)
        if a % 2 == 0:
            pygame.mixer.music.load(path.join(snd_dir, 'top_gear.wav'))
            pygame.mixer.music.set_volume(1)
        else:
            pygame.mixer.music.load(path.join(snd_dir, 'top_gear0.wav'))
            pygame.mixer.music.set_volume(1)

        # Carrega a fonte para desenhar o score.
        score_font = assets["score_font"]

        # Cria um carrinho. O construtor será chamado automaticamente. O for é para a animação da roda
        carro = []
        for i in range(4):
            carrinho = 'finally{}.png'.format(i)
            player_img = pygame.image.load(path.join(img_dir,
                                                     carrinho)).convert()
            player_img = pygame.transform.scale(player_img, (58, 75))
            player_img.set_colorkey(WHITE)
            carro.append(player_img)
        player = Player(carro)

        # Cria todos os sprites e adiciona o player em tal
        all_sprites = pygame.sprite.Group()
        all_sprites.add(player)

        # Cria um grupo só dos carrinhos inimigos. O for é para a animação das rodas
        mobs = pygame.sprite.Group()
        inimigo = []
        for i in range(4):
            filename = 'inimigo{}.png'.format(i)
            inimigo_img = pygame.image.load(path.join(img_dir,
                                                      filename)).convert()
            inimigo_img = pygame.transform.scale(inimigo_img, (58, 75))
            inimigo_img.set_colorkey(WHITE)
            inimigo.append(inimigo_img)

        # Cria grupo para as moedas
        coin = pygame.sprite.Group()

        # Cria um grupo para as caixas
        box = pygame.sprite.Group()

        #Cria grupo para os flocos
        flocos = pygame.sprite.Group()

        #Cria um grupo para o laser
        laser = pygame.sprite.Group()

        # Cria carrinhos e adiciona no grupo mobs
        for i in range(4):
            m = Mob(inimigo)
            all_sprites.add(m)
            mobs.add(m)

        #Cria as moedas
        imagem_coin = []
        for i in range(9):
            filename = 'Gold_0{}.png'.format(i)
            Coin_img = pygame.image.load(path.join(img_dir,
                                                   filename)).convert()
            Coin_img = pygame.transform.scale(Coin_img, (35, 35))
            Coin_img.set_colorkey(WHITE)
            imagem_coin.append(Coin_img)

        # Adiciona as moedas nos
        c = Coin(imagem_coin)
        all_sprites.add(c)
        coin.add(c)

        # Função para criar o floco de neve (FUNÇÃO POIS SÓ QUER UM POR VEZ)
        def chama_floco():
            f = Floco(assets["flocos_img"])
            all_sprites.add(f)
            flocos.add(f)

        # Chama a função que é usada posteriormente também
        chama_floco()

        estanevando = False
        estanevando_tempo = 0
        speedx = 0
        timee = 0
        clock.tick(FPS)
        pygame.mixer.music.play(loops=-1)
        velocidade = 0
        aceleracao = 0.75
        background_y_cima = -HEIGHT
        background_y = 0

        # Define quantos tiros a pessoa começa e quantos pontos
        contagemdetiros = 3
        score = 0

        # Um if para caso a pessoa aperte RESTART não precise colocar o nome novamente
        if nomecolocado == "":
            # Pegar o nome colocado pela pessoa chamando a função da tela inicial
            nomecolocado = tela_inicial(screen)

        # Loop principal
        running = True
        while running:

            # Ajusta a velocidade do jogo
            clock.tick(FPS)

            # Para o x parar de acelerar (derrapagem) quando se pega a neve em algum momento
            estanevando_tempo -= 1
            if estanevando_tempo == 1:
                estanevando_tempo = 0
                speedx = 0
                estanevando = False

            # Probabilidade de sortear caixinha
            if random.randrange(1, 700) == 1:
                b = Box(assets["box_img"])
                all_sprites.add(b)
                box.add(b)

            # Probabilidade de sortear moeda
            if random.randrange(1, 500) == 1:
                c = Coin(imagem_coin)
                all_sprites.add(c)
                coin.add(c)

            # Processa os eventos (mouse, teclado, botão, etc).
            for event in pygame.event.get():

                # Verifica se foi fechado.
                if event.type == pygame.QUIT:
                    running = False

                # Verifica se apertou alguma tecla.
                if event.type == pygame.KEYDOWN:
                    # Dependendo da tecla, altera a velocidade.
                    fator = 0
                    if estanevando or estanevando_tempo > 0:
                        fator = 2
                    if event.key == pygame.K_LEFT:
                        speedx = -5 + fator
                    if event.key == pygame.K_RIGHT:
                        speedx = 5 + fator

                    # Se for um espaço, atira! (caso tenha tiro)
                    if contagemdetiros > 0:
                        if event.key == pygame.K_SPACE:
                            laserr = Laser(assets['laser_img'],
                                           player.rect.centerx,
                                           player.rect.top)
                            all_sprites.add(laserr)
                            laser.add(laserr)
                            pew_sound.play()
                            contagemdetiros -= 1

                # Verifica se soltou alguma tecla.
                if event.type == pygame.KEYUP:
                    fator = 0
                    if estanevando or estanevando_tempo > 0:
                        fator = 2
                    # Dependendo da nevasca, altera a velocidade.
                    if event.key == pygame.K_LEFT:
                        speedx = fator
                    if event.key == pygame.K_RIGHT:
                        speedx = fator

            # Aponta a velocidade em x do player (carro)
            player.speedx = speedx

            # Verifica se jogador encostou a parede. Se encostar, morre.
            if player.rect.right > 519:
                boom_sound.play()
                running = False
            if player.rect.left < 89:
                boom_sound.play()
                running = False

            # Atualiza a acao de cada sprite.
            all_sprites.update()

            # Verifica se houve colisão entre Laser e carrinhos
            hits = pygame.sprite.groupcollide(mobs, laser, True, True)
            for hit in hits:
                # O carrinho é destruido e precisa ser recriado
                destroy_sound.play()
                m = Mob(inimigo)
                all_sprites.add(m)
                mobs.add(m)
                score += 5

            # Verifica se houve colisão entre os carrinhos
            hits = pygame.sprite.spritecollide(player, mobs, False,
                                               pygame.sprite.collide_circle)
            if hits:
                boom_sound.play()
                # Precisa esperar senão fecha duma vez
                time.sleep(0.5)
                running = False

            # Verifica se houve colisão com a moeda. Se houve, soma pontos
            hits = pygame.sprite.spritecollide(player, coin, True, False)
            if hits:
                moeda.play()
                score += 10

            # Verifica se houve colisão com o misterybox. Se houve, soma pontos e ativa laser (ou soma)
            hits = pygame.sprite.spritecollide(player, box, True, False)
            for hit in hits:
                Ta_Da.play()
                score += 5
                contagemdetiros += 3

            # Verifica se houve colisão entre player e floco de neve
            hits = pygame.sprite.spritecollide(player, flocos, True, False)
            if hits:
                # Ativa o modo nevasca
                estanevando = True
                estanevando_tempo = 120
                speedx = 1
                for i in range(30):
                    n = Nevasca(assets["flocos2_img"])
                    all_sprites.add(n)
                chama_floco()

            # Velocidade do player. Vai aumentando e estabiliza em 18
            if velocidade < 18:
                velocidade += aceleracao

            # A cada loop, redesenha o fundo e os sprites
            background_y_cima += velocidade
            background_y += velocidade

            if background_y >= HEIGHT:
                background_y = 0
                background_y_cima = -HEIGHT

            background_rect_cima.y = background_y_cima
            background_rect.y = background_y

            screen.blit(background, background_rect_cima)
            screen.blit(background, background_rect)
            all_sprites.draw(screen)

            # Desenha o score, por tempo
            timee += 1
            pont = (timee // FPS) + score
            text_surface = score_font.render("{:01d}".format(pont), True,
                                             BLACK)
            text_rect = text_surface.get_rect()
            text_rect.midtop = (WIDTH - 300, 10)
            screen.blit(text_surface, text_rect)

            if contagemdetiros > 0:
                text_surface = score_font.render(
                    "SPACE:{:01d} ESPECIAIS".format(contagemdetiros), True,
                    BLACK)
                text_rect = text_surface.get_rect()
                text_rect.midtop = (WIDTH / 2, HEIGHT - 130)
                screen.blit(text_surface, text_rect)

            # Depois de desenhar tudo, inverte o display.
            pygame.display.flip()

            # Chamando a função para ver se a pessoa fez a maior pontuação
            maior_pontuacao(pont, nomecolocado)

        # Chamando para aparecer na tela se for o maior pontuador
        maior_pontuacao(pont, nomecolocado)

        # Chama a tela final para mostrar a pontuação da pessoa
        tela_mostra_pontuacao(screen, nomecolocado, pont)

        # Matando os mobs e o player para fazê-lo novamente quando voltar o loop
        for mobs in all_sprites:
            mobs.kill()
            player.kill()