class AplJogo: def __init__(self): self.personagem = Personagem(350, 250) self.pontos = 0 self.pontosatual = 0 self.fimdejogo = False self.desceu = True self.obstaculos = list() self.novo = 44 def configuracao(self): self.clock = pygame.time.Clock() self.entradas = EntradaUsuario() def player_input(self): for event in pygame.event.get(): self.entradas.reset() if event.type == pygame.QUIT: self.entradas.quit_pressed = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.entradas.quit_pressed = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: self.diminui_velocidade() if event.type == pygame.KEYUP: if event.key == pygame.K_UP: self.aumenta_velocidade() pygame.key.set_repeat(1) def aumenta_velocidade(self): self.personagem.velocidadey = 10 def diminui_velocidade(self): self.personagem.velocidadey = -15 def movimenta_personagem(self): self.personagem.modifica_posicao(self.personagem.posicao.eixox, self.personagem.posicao.eixoy + self.personagem.velocidadey) def cria_obstaculos(self): if self.novo == 45: self.novo = 0 if len(self.obstaculos) < 3: self.obstaculos.append(FabricaObstaculo.criarObstaculo(randint(1,2))) def movimenta_obstaculo_horizontalmente(self): for obs in self.obstaculos: obs.modifica_posicao(obs.posicao.eixox - obs.velocidadex, obs.posicao.eixoy) def movimenta_obstaculo_verticalmente(self): for obs in self.obstaculos: if obs.posicao.eixoy <= 0: self.desceu = True elif obs.posicao.eixoy >= 450: self.desceu = False if self.desceu == True: obs.desce() elif self.desceu == False: obs.sobe() def verifica_limite_da_tela(self): self.personagem.atingiu_limite_da_tela() def incrementa_pontuacao(self): for obs in self.obstaculos: if self.personagem.posicao.eixox > obs.posicao.eixox and self.personagem.posicao.eixox < obs.posicao.eixox+10: self.pontos += 1 def remove_obstaculo(self): if self.obstaculos[0].posicao.eixox < -80: del self.obstaculos[0] def verifica_colisao(self, rect1, rect2): if rect1.colliderect(rect2) and self.pontos != self.pontosatual: self.personagem.vida -= 1 self.pontosatual = self.pontos def verifica_qtd_de_vidas(self): if self.personagem.acabou_vida(): self.fimdejogo = True self.personagem.velocidadey = 0 for obs in self.obstaculos: obs.velocidadex = 0 def jogar(self): self.player_input() self.movimenta_personagem() self.cria_obstaculos() self.movimenta_obstaculo_horizontalmente() self.movimenta_obstaculo_verticalmente() self.remove_obstaculo() self.verifica_limite_da_tela() self.verifica_qtd_de_vidas() self.incrementa_pontuacao() if self.entradas.quit_pressed: exit(0) pygame.display.flip() self.clock.tick(60)
class ControladorJogo: TAM_FONTE_PONTUACAO = 40 DESLOCAMENTO_TELA = 5 POSICAO_TROCA_TELA = -500 def __init__(self): pygame.init() self.apljogo = AplJogo() self.telajogo = TelaJogo() self.imagempersonagem = self.get_imagem("personagem.png") self.posicaotela = EstiloElementos.posicao_imagem_fundo() self.entradas = EntradaUsuario() self.fabricaimagens = FlyweightFabrica() @staticmethod def get_obstaculo(nomeobstaculo): return pygame.image.load(os.path.join(CaminhoRecursos.caminho_imagens_obstaculos(), nomeobstaculo)) @staticmethod def get_imagem(nomeimagem): return pygame.image.load(os.path.join(CaminhoRecursos.caminho_imagens(), nomeimagem)) @staticmethod def get_musica(nomemusica): return os.path.join(CaminhoRecursos.caminho_musicas(), nomemusica) @staticmethod def get_som(nomesom): return os.path.join(CaminhoRecursos.caminho_sons(), nomesom) def exibir_tela_jogo(self): imagem = self.get_imagem("fundojogo.png") self.telajogo.exibe_imagem(imagem, self.posicaotela) self.anda_tela() def anda_tela(self): self.posicaotela.eixox -= self.DESLOCAMENTO_TELA if self.posicaotela.eixox == self.POSICAO_TROCA_TELA: self.posicaotela.eixox = 0 def exibir_vidas(self): for numvida in range(self.apljogo.personagem.vida): imagem = self.get_imagem("vida.png") self.telajogo.exibe_imagem(imagem, EstiloElementos.get_posicao_vida(numvida)) def exibir_pontuacao(self, mensagem): self.telajogo.exibe_texto(mensagem + str(self.apljogo.pontos), self.TAM_FONTE_PONTUACAO, EstiloElementos.posicao_pontuacao()) def exibir_fim_de_jogo(self): imagem = self.get_imagem("gameover.png") self.telajogo.exibe_imagem(imagem, EstiloElementos.posicao_imagem_fundo()) self.posicaotela.eixox = 0 def exibir_mensagem(self, mensagem): self.telajogo.exibe_texto(mensagem, self.TAM_FONTE_PONTUACAO, EstiloElementos.posicao_mensagem()) def atualiza_tela(self): self.exibir_tela_jogo() self.fabricaimagens.get_flyweight("personagem").desenhar_imagem(self.apljogo.personagem.posicao) for obstaculo in self.apljogo.lobstaculos: self.fabricaimagens.get_flyweight(obstaculo.nome).desenhar_imagem(obstaculo.posicao) self.exibir_pontuacao("Score: ") self.exibir_vidas() def entrada_jogador(self): for event in pygame.event.get(): self.entradas.reset() if event.type == pygame.QUIT: self.entradas.quit_pressed = True if (event.type == pygame.KEYDOWN): if (event.key == pygame.K_SPACE): self.entradas.quit_pressed = True if (event.type == pygame.KEYDOWN): if (event.key == pygame.K_UP): self.apljogo.personagem.diminui_deslocamento() if (event.type == pygame.KEYUP): if (event.key == pygame.K_UP): self.apljogo.personagem.aumenta_deslocamento() pygame.key.set_repeat(1) def jogo(self): self.apljogo.configuracao() continua = True while continua: self.entrada_jogador() self.apljogo.jogar() self.atualiza_tela() for obstaculo in self.apljogo.lobstaculos: imagemobstaculo = self.get_obstaculo(obstaculo.nome + ".png") if self.apljogo.verifica_colisao_personagem(self.imagempersonagem, imagemobstaculo, obstaculo): self.apljogo.penaliza_jogador() som = self.get_som("colisao.wav") self.telajogo.exibe_som(som) if self.apljogo.fimdejogo: self.exibir_fim_de_jogo() if self.entradas.quit_pressed: exit(0) pygame.quit()
class AplJogo: def __init__(self): self.personagem = Personagem(350, 250) self.obstaculo = Obstaculo(700, randint(0, 445)) #TODO trocar esses objetos estaticos e gerar aleatoriamente self.obstaculo2 = Obstaculo(700, randint(0, 445)) self.pontos = 0 self.pontosatual = 0 self.fimdejogo = False self.desceu = True def config(self): self.clock = pygame.time.Clock() self.entradas = EntradaUsuario() def player_input(self): for event in pygame.event.get(): self.entradas.reset() if event.type == pygame.QUIT: self.entradas.quit_pressed = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.entradas.quit_pressed = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: self.diminui_velocidade() if event.type == pygame.KEYUP: if event.key == pygame.K_UP: self.aumenta_velocidade() pygame.key.set_repeat(1) def aumenta_velocidade(self): self.personagem.velocidadey = 10 def diminui_velocidade(self): self.personagem.velocidadey = -15 def movimenta_personagem(self): self.personagem.modifica_posicao(self.personagem.posicao.eixox, self.personagem.posicao.eixoy + self.personagem.velocidadey) def movimenta_obstaculo_horizontalmente(self): self.obstaculo.modifica_posicao(self.obstaculo.posicao.eixox - self.obstaculo.velocidadex , self.obstaculo.posicao.eixoy) self.obstaculo2.modifica_posicao(self.obstaculo2.posicao.eixox - self.obstaculo2.velocidadex , self.obstaculo2.posicao.eixoy) def movimenta_obstaculo_verticalmente(self): if self.obstaculo.posicao.eixoy <= 0: self.desceu = True elif self.obstaculo.posicao.eixoy >= 450: self.desceu = False if self.desceu == True: self.obstaculo.desce() elif self.desceu == False: self.obstaculo.sobe() #por enquanto gera "obstaculos estaticos", futuramente serao gerados automaticamente e aleatoriamente if self.obstaculo2.posicao.eixoy <= 0: self.desceu = True elif self.obstaculo2.posicao.eixoy >= 450: self.desceu = False if self.desceu == True: self.obstaculo2.desce() elif self.desceu == False: self.obstaculo2.sobe() def verifica_limite_da_tela(self): self.personagem.atingiu_limite_da_tela() def incrementa_pontuacao(self): if self.personagem.posicao.eixox > self.obstaculo.posicao.eixox and self.personagem.posicao.eixox < self.obstaculo.posicao.eixox+10: self.pontos += 1 def proximo_obstaculo(self): #para aparecer varios obstaculos if self.obstaculo.posicao.eixox < -80: self.obstaculo.posicao.eixox = 700 self.obstaculo.posicao.eixoy = randint(0,500) self.obstaculo2.posicao.eixox = 600 self.obstaculo2.posicao.eixoy = randint(0,500) def verifica_colisao(self, rect1, rect2): if rect1.colliderect(rect2) and self.pontos != self.pontosatual: self.personagem.vida -= 1 self.pontosatual = self.pontos def verifica_qtd_de_vidas(self): if self.personagem.acabou_vida(): self.fimdejogo = True self.personagem.velocidadey = 0 self.obstaculo.velocidadex = 0 self.obstaculo2.velocidadex = 0 def jogar(self): self.player_input() self.incrementa_pontuacao() self.movimenta_personagem() self.movimenta_obstaculo_horizontalmente() self.movimenta_obstaculo_verticalmente() self.proximo_obstaculo() self.verifica_limite_da_tela() self.verifica_qtd_de_vidas() if self.entradas.quit_pressed: exit(0) pygame.display.flip() self.clock.tick(60)