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 = ""
Example #2
0
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()
Example #3
0
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()