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
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()
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()