class GerenciadorEntidade(object): def __init__(self, gf, ff, fase): self.fase = fase self.gf = gf self.ff = ff self.camera = Camera(800, 600) self.camera_man = Entidade(400, 300) self.entidades = [] self.entidade = None self.entidade_copia = None self.arrastando_entidade = False self.arquivo_atual = "" self.mov_x = 0 self.mov_y = 0 self.camera_mov_x = self.camera_man.x self.camera_mov_y = self.camera_man.y self.pos = [] self.pos_aplicada = [] def iniciar(self, fase): self.fase = fase def get_entidades(self): return self.entidades def organizar_por_camadas(self): # TODO: Usar busca binária, pois é melhor que bubble sort lista = self.entidades for i in lista: for j in range(len(lista) - 1): if lista[j].camada > lista[j + 1].camada: tmp = lista[j + 1] lista[j + 1] = lista[j] lista[j] = tmp def copiar_entidade(self, entidade): return entidade.clonar() def pegar_entidade_cursor(self): pos = pygame.mouse.get_pos() #pos = self.camera.aplicar_mouse(pos) for e in self.entidades: if pos[0] > e.x + self.camera.x and pos[0] < e.x + e.w + self.camera.x and \ pos[1] > e.y + self.camera.y and pos[1] < e.y + e.h + self.camera.y: return e return None def arrastar_entidade(self, e, pos): e.x = pos[0] - self.mov_x e.y = pos[1] - self.mov_y def get_camera_ref(self): return self.camera def atualizar(self): #jogador = self.gf.get_jogador_ref() #if jogador: # self.camera.atualizar(jogador) self.camera.atualizar(self.camera_man) def eventos_continuos(self): self.pos = pygame.mouse.get_pos() self.pos_aplicada = self.camera.aplicar_mouse(self.pos) pressionado = pygame.mouse.get_pressed() if self.arrastando_entidade: self.arrastar_entidade(self.entidade, self.pos_aplicada) if pressionado[0]: if not self.arrastando_entidade: # Para poder pegar apenas uma entidade. self.entidade = self.pegar_entidade_cursor() if self.entidade: self.mov_x = self.pos_aplicada[0] - self.entidade.x self.mov_y = self.pos_aplicada[1] - self.entidade.y self.arrastando_entidade = True if pressionado[1]: #print("pressionado") self.camera_man.x = self.camera_mov_x - self.pos[0] self.camera_man.y = self.camera_mov_y - self.pos[1] def eventos(self, e): if e.type == pygame.MOUSEBUTTONUP and e.button == 1: self.arrastando_entidade = False if e.type == pygame.MOUSEBUTTONDOWN and e.button == 2: self.camera_mov_x += self.pos[0] self.camera_mov_y += self.pos[1] if e.type == pygame.MOUSEBUTTONUP and e.button == 2: self.camera_mov_x -= self.pos[0] self.camera_mov_y -= self.pos[1] if e.type == pygame.MOUSEBUTTONUP and e.button == 3: entidade = self.pegar_entidade_cursor() if entidade: nomes = entidade.get_nomes() param = multenterbox(msg=entidade.__class__.__name__, title='Editor de atributos', fields=(nomes)) if param: entidade.setar_atributos(param) else: nomes = ["ID", "Cor", "Imagem Fundo"] param = multenterbox(msg="Fase", title='Editor de atributos', fields=(nomes)) if param: self.fase.setar_atributos(param) if e.type == pygame.KEYDOWN: if e.key == pygame.K_DELETE: entidade = self.pegar_entidade_cursor() if entidade: self.entidades.remove(entidade) self.fase.remover(entidade) mods = pygame.key.get_mods() if mods & pygame.KMOD_CTRL: # get_mods para poder pegar o evento de duas teclas pressionadas (e.g CTRL + NUMPAD1/2/3/4) if mods & pygame.KMOD_SHIFT and e.key == pygame.K_s: if self.arquivo_atual: self.ff.salvar_arquivo("Fases/" + self.arquivo_atual, self.fase) print("Salvo!") else: msgbox("Nenhum arquivo foi aberto!", "Erro") elif e.key == pygame.K_s: if self.fase.get_id() == -1: _id = enterbox("Digite o id da fase!") if _id: self.fase.set_id(_id) else: return arquivo = enterbox("Digite o nome do arquivo a ser salvo!") if arquivo: self.arquivo_atual = arquivo self.ff.salvar_arquivo("Fases/" + self.arquivo_atual, self.fase) if e.key == pygame.K_1: jogador = Jogador(400, 420, 30, 30, 0.0, 0.0, 2.3, (0, 25, 125), "no_img") self.entidades.append(jogador) self.fase.set_jogador(jogador) elif e.key == pygame.K_2: plataforma = Plataforma(0, 570, 800, 30, 0.0, 0.0, 0.0, (10, 10, 15), "no_img") self.entidades.append(plataforma) self.fase.adicionar_plataforma(plataforma) elif e.key == pygame.K_3: plataforma = PlataformaAndante(400, 300, 100, 30, 0, 0, 0.5, (100, 200), (0, 0), 0.0, (200, 0, 150), "no_img") self.entidades.append(plataforma) self.fase.adicionar_plataforma(plataforma) elif e.key == pygame.K_4: energia = Energia(400, 240, 20, 30, 0, 0, 0.0, True, (255, 255, 125), "no_img") self.entidades.append(energia) self.fase.adicionar_energia(energia) elif e.key == pygame.K_5: moeda = Moeda(300, 510, 10, 10, 0, 0, 0.0, (255, 100, 10), "no_img") self.entidades.append(moeda) self.fase.adicionar_moeda(moeda) elif e.key == pygame.K_6: inimigo = Inimigo(170, 540, 30, 30, 0, 0, 2.0, True, 25.0, False, (0, 25, 125), "canon.png", "gold_bullet.png") self.entidades.append(inimigo) self.fase.adicionar_inimigo(inimigo) elif e.key == pygame.K_l: arquivo = enterbox( "Digite o nome do arquivo a ser carregado!") if arquivo: self.arquivo_atual = arquivo ret = self.gf.iniciar(self.arquivo_atual) if ret: ret = ret[:] self.entidades = ret[0] self.fase = ret[1] else: msgbox("Arquivo não existente ou corrompido!", "Erro") elif e.key == pygame.K_c: entidade = self.pegar_entidade_cursor() if entidade: self.entidade_copia = self.copiar_entidade(entidade) elif e.key == pygame.K_v: if self.entidade_copia: self.entidade_copia.x = self.pos[ 0] - self.camera.x - self.entidade_copia.w / 2 self.entidade_copia.y = self.pos[ 1] - self.camera.y - self.entidade_copia.h / 2 clone = self.copiar_entidade(self.entidade_copia) self.entidades.append(clone) self.fase.adicionar(clone) elif mods & pygame.KMOD_SHIFT and e.key == pygame.K_f: if self.arquivo_atual: copy2("Fases/" + self.arquivo_atual, "../Projeto/Fases") print("Arquivo enviado!") else: msgbox("Nenhum arquivo para ser enviado!", "Erro") elif e.key == pygame.K_f: nome = enterbox("Digite o nome do arquivo a enviado!") if nome: copy2("Fases/" + nome, "../Projeto/Fases") elif mods & pygame.KMOD_SHIFT and e.key == pygame.K_b: if self.arquivo_atual: self.ff.salvar_arquivo("Fases/" + self.arquivo_atual, self.fase) print("Salvo!") copy2("Fases/" + self.arquivo_atual, "../Projeto/Fases") print("Arquivo enviado!") Popen("python jogo.py", cwd="../Projeto/Codigo/", shell=True) else: msgbox("Nenhum arquivo aberto ou salvo!", "Erro") elif e.key == pygame.K_b: Popen("python jogo.py", cwd="../Projeto/Codigo/", shell=True) elif e.key == pygame.K_n: self.entidades = [] self.fase = Fase(-1, None, self.dummy_fundo, [], [], [], [], "no_img") self.arquivo_atual = ""
class Jogo(object): def __init__(self): pygame.init() self.FPS = 120 self.clock = pygame.time.Clock() self.tela = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF) self.gFase = GerenciadorFase() self.jogador = None self.__rodando = False self.__pausado = False self.tocando = False self.__qnt_moedas_fase_atual = 0 self.__qnt_moedas = 0 self.camera = Camera(800, 600) self.musica = GerenciadorMusica() self.menu = Menu(self) self.GUI = GUI(self.tela) def atualizar_entidades_fase(self): self.energias = self.gFase.get_energias() self.inimigos = self.gFase.get_inimigos() self.moedas = self.gFase.get_moedas() self.plats = self.gFase.get_plataformas() def __inicializar(self): self.__rodando = True self.gFase.iniciar() self.jogador = self.gFase.get_jogador() self.atualizar_entidades_fase() self.musica.tocar(self.gFase.get_id()) def get_energias_restantes(self): return self.gFase.get_total_energias() def get_total_moedas_fase_atual(self): return self.__qnt_moedas_fase_atual def get_total_moedas(self): return self.__qnt_moedas def adicionar_moeda(self): self.__qnt_moedas_fase_atual += 1 def atualizar_fase(self): self.atualizar_entidades_fase() self.jogador = self.gFase.reiniciar_fase_atual() def resetar(self): self.__qnt_moedas_fase_atual = 0 self.jogador = self.gFase.resetar() self.atualizar_entidades_fase() for ene in self.energias: ene.resetar() for moe in self.moedas: moe.resetar() def __logica(self, dt): if self.jogador.get_vida() < 1: self.resetar() return self.jogador.logica(dt, self.plats) for plat in self.plats: plat.logica() for ene in self.energias: ene.logica(self.jogador) for ini in self.inimigos: ini.logica(self.jogador) for moe in self.moedas: if moe.get_ativo(): colidiu = moe.logica(self.jogador) if colidiu: self.adicionar_moeda() moe.iniciar_animacao_alpha() if self.gFase.objetivo_completo(): if self.gFase.passar_fase(): self.atualizar_fase() self.menu.definir_menu(1) if self.menu.get_opcao() == 1: self.__rodando = False self.menu.restaurar() self.musica.tocar(self.gFase.get_id()) self.__qnt_moedas += self.__qnt_moedas_fase_atual self.__qnt_moedas_fase_atual = 0 else: # Fim de Jogo ( não há mais fases para se passar ) self.menu.definir_menu(3) opcao = self.menu.get_opcao() if opcao == 1: self.__rodando = False elif opcao == 2: self.gFase.recomecar() self.resetar() self.musica.tocar(self.gFase.get_id()) self.__qnt_moedas = 0 self.__qnt_moedas_fase_atual = 0 self.menu.restaurar() if self.jogador.y > self.gFase.get_objeto_mais_baixo()[1] + 200: self.jogador.set_vida(0) def rodar(self): self.menu.definir_menu(0) if self.menu.get_opcao() == 0: self.__inicializar() dt = 0 while self.__rodando: dt = self.clock.tick(self.FPS) / 1000.0 self.__evento() self.__atualizar(dt) self.__desenhar(dt) def __evento(self): mods = pygame.key.get_mods() for e in pygame.event.get(): if e.type == pygame.QUIT: self.__rodando = False elif e.type == pygame.MOUSEBUTTONDOWN: if e.button == 1: # HACK pos = pygame.mouse.get_pos() self.jogador.set_vel_y(pos[1] - 600) elif e.type == pygame.KEYDOWN: if e.key == pygame.K_KP_MINUS: self.musica.abaixar_volume() elif e.key == pygame.K_KP_PLUS: self.musica.aumentar_volume() if e.key == pygame.K_ESCAPE: self.menu.definir_menu(2) opcao = self.menu.get_opcao() if opcao == 1: self.__rodando = False elif opcao == 2: self.resetar() self.menu.restaurar() if mods & pygame.KMOD_CTRL | pygame.KMOD_SHIFT and e.key == pygame.K_RETURN: if self.gFase.passar_fase(): self.atualizar_fase() self.musica.tocar(self.gFase.get_id()) self.__qnt_moedas += self.__qnt_moedas_fase_atual self.__qnt_moedas_fase_atual = 0 elif mods & pygame.KMOD_SHIFT and e.key == pygame.K_RETURN: if self.gFase.passar_fase(): self.atualizar_fase() self.menu.definir_menu(1) if self.menu.get_opcao() == 1: self.__rodando = False self.menu.restaurar() self.musica.tocar(self.gFase.get_id()) self.__qnt_moedas += self.__qnt_moedas_fase_atual self.__qnt_moedas_fase_atual = 0 elif e.key == pygame.K_RETURN: # HACK self.jogador.set_y(-1200) def __desenhar(self, dt): self.tela.blit(self.gFase.get_fundo(), (0, 0)) self.jogador.desenhar(self.tela, self.camera.aplicar(self.jogador, dt)) for plat in self.plats: plat.desenhar(self.tela, self.camera.aplicar(plat, dt)) for ene in self.energias: ene.desenhar(self.tela, self.camera.aplicar(ene, dt)) for ini in self.inimigos: ini.desenhar(self.tela, self.camera.aplicar(ini, dt), self.camera, dt) for moe in self.moedas: moe.desenhar(self.tela, self.camera.aplicar(moe, dt)) #TODO: Fazer uma função só para desenhar o HUD. self.GUI.desenhar_volume(self.musica.get_volume()) self.GUI.desenhar_moedas(self.get_total_moedas() + self.get_total_moedas_fase_atual()) self.GUI.desenhar_energias(self.get_energias_restantes()) self.GUI.desenhar_fase_atual(self.gFase.get_id()) def __atualizar(self, dt): self.__logica(dt) self.camera.atualizar(self.jogador) pygame.display.flip()
class Jogo(object): def __init__(self): self.fps = 120 self.clock = pygame.time.Clock() self.__screen = pygame.display.set_mode((800, 600)) self.__gFase = GerenciadorFase() self.__jogador = None self.__rodando = False self.__pausado = False self.mudar_fps = False self.camera = Camera(800, 600) def __inicializar(self): self.__rodando = True self.__gFase.iniciar() self.__jogador = self.__gFase.get_jogador() for plat in self.__gFase.get_plataformas(): plat.iniciar() def __logica(self, dt): energias = self.__gFase.get_energias() inimigos = self.__gFase.get_inimigos() moedas = self.__gFase.get_moedas() plats = self.__gFase.get_plataformas() if self.__jogador.get_vida() < 1: self.__jogador = self.__gFase.resetar() for ene in energias: ene.resetar() for moe in moedas: moe.resetar() return self.__jogador.logica(dt, plats) for plat in plats: plat.logica() for ene in energias: ene.logica(self.__jogador) for ini in inimigos: ini.logica(self.__jogador) for moe in moedas: if moe.get_ativo(): moe.logica(self.__jogador) moe.iniciar_animacao_alpha() if self.__gFase.objetivo_completo(): if self.__gFase.passar_fase(): self.__jogador = self.__gFase.reiniciar_fase_atual() def rodar(self): self.__inicializar() dt = 0 while self.__rodando: self.__evento() self.__atualizar(dt) self.__desenhar(dt) dt = self.clock.tick(self.fps) / 1000.0 def __evento(self): for e in pygame.event.get(): if e.type == pygame.QUIT: self.__rodando = False elif e.type == pygame.MOUSEBUTTONDOWN: if e.button == 1: pos = pygame.mouse.get_pos() print(self.__jogador.y) print(self.__jogador.vel_y) print(pos[1]) qnt = pos[1] - self.__jogador.y self.__jogador.set_vel_y(pos[1] - 600) elif e.type == pygame.KEYDOWN: if e.key == pygame.K_ESCAPE: self.__rodando = False if e.key == pygame.K_f: if self.mudar_fps: self.fps = 30 else: self.fps = 120 self.mudar_fps = not self.mudar_fps if pygame.key.get_mods( ) & pygame.KMOD_SHIFT and e.key == pygame.K_RETURN: if self.__gFase.passar_fase(): self.__jogador = self.__gFase.reiniciar_fase_atual() elif e.key == pygame.K_RETURN: self.__jogador.set_y(-1200) def __desenhar(self, dt): self.__screen.blit(self.__gFase.get_fundo(), (0, 0)) self.__jogador.desenhar(self.__screen, self.camera.aplicar(self.__jogador, dt)) for plat in self.__gFase.get_plataformas(): plat.desenhar(self.__screen, self.camera.aplicar(plat, dt)) for ene in self.__gFase.get_energias(): ene.desenhar(self.__screen, self.camera.aplicar(ene, dt)) for ini in self.__gFase.get_inimigos(): ini.desenhar(self.__screen, self.camera.aplicar(ini, dt), self.camera, dt) for moe in self.__gFase.get_moedas(): moe.desenhar(self.__screen, self.camera.aplicar(moe, dt)) def __atualizar(self, dt): print(self.fps) self.__logica(dt) self.camera.atualizar(self.__jogador) pygame.display.flip()