Ejemplo n.º 1
0
class Jogo(Tk):

    def __init__(self):
        super().__init__()
        #variaveis 
        self.mapas = ['fase1', 'fase2', 'fase3']
        self.label_itens = []
        self.labels = []
        self.porta = []
        self.mapa_atual = 0
        self.status = "jogando"
        #fonte
        self.fonte = ('Fixedsys', 14)
        #propriedades da janela
        self.geometry("496x527+248+0")
        self.minsize(496, 527)
        self.maxsize(496, 527)

        #widgets
        #/frames
        self.menu = Frame(self, width=496, height=527, bg="#212222")
        self.statusBar = Frame(self, width=496, height=31, bg="#000612")
        self.mapa = Frame(self, width=496, height= 496)

        #/labes
        self.player_name = Label(self.statusBar, fg="white", bg="#000612", font=self.fonte)
        self.player_vidas = Label(self.statusBar, fg="white", bg="#000612", font=self.fonte)
        self.player_itens = Label(self.statusBar, fg="white", bg="#000612", font=self.fonte)
        
        #labes/sprites
        self.sprites = sprites.Sprites()
        self.sprites.criar_menu(self.menu)
        
        #places
        self.menu.place(x=0, y=0)
        
        self.player_name.place(x=10, y=5)
        self.player_vidas.place(x=400, y=5)
        self.player_itens.place(x=210, y=5)

        #binds
        self.menu.bind('<Return>', self.iniciar_menu)
        self.menu.focus_force()
        self.mapa.bind('<Key>', self.ler_teclado)
        self.mapa.bind('<Escape>', self.menu_partida)
        
        self.mainloop()
    def menu_partida(self, event):
        menu = MenuPartida(self)
        menu.exibir(100, 80)

    def ativar_popUp(self, ev):
        pop_up = popUp.popUp(self, self.status)
        pop_up.exibir()

    def proxima_fase(self):
        self.sair_partida()
        self.mapa_atual+=1
        

    def carregar_jogo(self):
        with open('save/save.json', 'r') as save:
            try:
                data = json.load(save)
                if len(data) == 0:
                    raise execoes.SaveVazio
                else:
                    print(data)
                    self.mapa_atual = data['fase_atual']
                    self.novo_jogo(data=data)
                
                
            except execoes.SaveVazio as error:
                print(f"Erro: {error}")

            finally:
                save.close()

    def sair_partida(self):
        if self.status == "jogando" or self.status == "perdeu":
            print("fase inicial zero")
            self.mapa_atual = 0
        self.fase.parar()
        self.fase.clear()
        print(f" threads: {self.fase.threads}")
        print("Partida  finalizada")

    def iniciar_menu(self, event):
        self.menu.place_forget()
        self.menu_ops = Menu(self)
        self.menu_ops.place(x=0, y=0)
        
    def novo_jogo(self, data=None):
        if self.mapa_atual+1 > len(self.mapas):
            print("Nao a proxima fase")
            self.statusBar.place_forget()
            self.mapa.place_forget()
            self['bg'] = CORES['bg']
            self.status = "zerou"
            self.ativar_popUp(1)
        else:
            self.status = "jogando"
            self.menu_ops.place_forget()
            self.fase = Fase(self.mapas[self.mapa_atual], self, data)
            self.configurar_partida()

            self.render(self.fase.mapa)
            self.fase.getItens()
            self.label_player = self.sprites.criar_player(self.mapa)
            self.posi_obj_dinamicos()

    def ler_teclado(self, event):
        key = str(event.char)
        eventos.colide_mapa(self.fase.player, key, self.fase.mapa)
        eventos.coletarItem(self, self.fase.player, self.fase)
        eventos.verificar(self, self.fase.player, self.fase)
        self.atualizar_player()
   
    def posi_obj_dinamicos(self):
        self.atualizar_player()
        self.criar_enemigos(self.fase.enemigos)

    def atualizar_player(self):
        posGhfX = self.fase.player.posx*31
        posGhfY = self.fase.player.posy*31
        self.label_player.place(x=posGhfX, y=posGhfY)

    def configurar_partida(self):
        self.menu.place_forget()
        self.statusBar.place(x=0, y=0)
        self.atualizar_status_bar(self.fase.player)
        
        self.mapa.place(x=0, y=31)
        self.mapa.focus_force()

    def atualizar_status_bar(self, player):
        self.player_name['text'] = "Player: "+player.nome
        self.player_itens['text'] = "itens: "+str(len(player.itens))+"/"+str(len(self.fase.itens))
        self.player_vidas['text'] = "Vidas: "+str(player.vidas)

    def retirar_item(self, pos):
        self.label_itens[pos]['image'] = self.sprites.img_chao
       
    def abrir_porta(self):
        self.porta[0]['image'] = self.sprites.img_chao

    def ganhou(self):
        self.status = "ganhou"
        self.label_player['image'] = self.sprites.img_player_portal
        self.fase.parar_loop = True
        self.ativar_popUp("event")

    def criar_enemigos(self, *enemigos):
        print("criando objetos")
      
        self.enemigos4 = []
        objts = {}
        for enemigo in enemigos[0]:
            
            enemigoGUI = self.sprites.criar_enemigo(self.mapa)
            posx = enemigo.posx*31
            posy = enemigo.posy*31
            enemigoGUI.place(x=posx, y=posy)
            objts['logico'] =  enemigo
            objts['grafico'] =  enemigoGUI
            self.enemigos4.append(objts.copy())
            objts.clear()
        self.fase.mover_enemigos(self.enemigos4)

    def limpar_mapa(self):
        #self.mapa.destroy()
        self.porta.clear()
        self.limpar_player()
        for label in self.labels:
            label.destroy()
        self.label_itens.clear()
      
        if self.status == "jogando" or self.status == "perdeu":
            self.menu_ops.place(x=0, y=0)
            self.menu_ops.focus_force()

        elif self.status == "ganhou":
            self.novo_jogo()

    def limpar_player(self):
        self.label_player.destroy()
        
    def limpar_enemigos(self):
        for enem in self.enemigos4:
            enem['grafico'].destroy()
            enem.clear()


    def render(self, mapa):
        posx = 0
        posy = 0
       
        for linha in mapa:
            for coluna in linha:

                if coluna == 0:
                    bloco = self.sprites.criar_chao(self.mapa, posx, posy)   
                
                elif coluna == 1:
                    bloco = self.sprites.criar_parede(self.mapa, posx, posy)

                elif coluna == 2:
                    bloco = self.sprites.criar_item(self.mapa, posx, posy)
                    self.label_itens.append(bloco)
                  
                elif coluna == 3:
                    bloco = self.sprites.criar_porta(self.mapa, posx, posy)
                    self.porta.append(bloco)
                    self.porta.append(posx)
                    self.porta.append(posy)

                elif coluna == 4:
                    bloco = self.sprites.criar_portal(self.mapa, posx, posy)      
                    
                posx+=31
                self.labels.append(bloco)
            posy+=31
            posx = 0


    def sair(self):
        self.quit()