class InterfaceMenuPrincipal(ShowBase):
    def __init__(self):

        #Image d'arrière plan
        self.background = OnscreenImage(
            parent=render2d, image="../asset/Menu/menuPrincipal.jpg")

        #On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(20)

        #Titre du jeu
        self.textTitre = OnscreenText(text="Tankem!",
                                      pos=(0, 0.6),
                                      scale=0.32,
                                      fg=(0.8, 0.9, 0.7, 1),
                                      align=TextNode.ACenter)

        #Boutons
        btnScale = (0.18, 0.18)
        text_scale = 0.12
        borderW = (0.04, 0.04)
        couleurBack = (0.243, 0.325, 0.121, 1)
        separation = 0.5
        hauteur = -0.6
        self.b1 = DirectButton(text=("Jouer", "!", "!", "disabled"),
                               text_scale=btnScale,
                               borderWidth=borderW,
                               text_bg=couleurBack,
                               frameColor=couleurBack,
                               relief=2,
                               command=self.chargeJeu,
                               pos=(-separation, 0, hauteur))

        self.b2 = DirectButton(text=("Quitter", "Bye!", ":-(", "disabled"),
                               text_scale=btnScale,
                               borderWidth=borderW,
                               text_bg=couleurBack,
                               frameColor=couleurBack,
                               relief=2,
                               command=lambda: sys.exit(),
                               pos=(separation, 0, hauteur))
        #Initialisation de l'effet de transition
        curtain = loader.loadTexture("../asset/Menu/loading.jpg")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)

        self.sound = loader.loadSfx("../asset/Menu/demarrage.mp3")

    def cacher(self):
        #Est esssentiellement un code de "loading"

        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
        #On cache les menus
        self.background.hide()
        self.b1.hide()
        self.b2.hide()
        self.textTitre.hide()

    def chargeJeu(self):
        #On démarre!
        Sequence(
            Func(lambda: self.transition.irisOut(0.2)),
            SoundInterval(self.sound),
            Func(self.cacher),
            Func(lambda: messenger.send("DemarrerMenuNiveau")),
            Wait(
                0.2
            ),  #Bug étrange quand on met pas ça. L'effet de transition doit lagger
            Func(lambda: self.transition.irisIn(0.2))).start()
class InterfaceMenuChoixNiveau(ShowBase):
    def __init__(self):
        self.accept("AllerChoixNiveau", self.ouvrirMenu)
        self.sound = loader.loadSfx("../asset/Menu/demarrage.mp3")
        curtain = loader.loadTexture("../asset/Menu/loading.jpg")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(20)

    def ouvrirMenu(self, unDTOUsers, unDTOMap, username1, username2,
                   listeArmes):
        self.listeArmes = listeArmes
        self.username1 = username1
        self.username2 = username2
        self.unDTOUsers = unDTOUsers
        self.unDTOMap = unDTOMap
        numItemsVisible = 5
        itemHeight = 0.11

        self.myScrolledList = DirectScrolledList(
            decButton_pos=(0.29, 0, 0.53),
            decButton_text="Dec",
            decButton_text_scale=0.04,
            decButton_borderWidth=(0.005, 0.005),
            incButton_pos=(0.29, 0, -0.15),
            incButton_text="Inc",
            incButton_text_scale=0.04,
            incButton_borderWidth=(0.005, 0.005),
            frameSize=(-1.4, 1.7, -0.5, 0.75),
            frameColor=(1, 0, 0, 0.5),
            pos=(-0.12, 0, 0),
            numItemsVisible=numItemsVisible,
            forceHeight=itemHeight,
            itemFrame_frameSize=(-1.2, 1.2, -0.5, 0.11),
            itemFrame_pos=(0.27, 0, 0.4),
        )

        btn = DirectButton(text=("Hasard", "click!", "roll", "disabled"),
                           text_scale=0.075,
                           borderWidth=(0.01, 0.01),
                           relief=2,
                           command=lambda: self.chargeJeu(000))
        self.myScrolledList.addItem(btn)

        if Connexion().getCurseur() != None:
            self.dictInfoNiveaux = self.unDTOMap.getDictoNiveau()
            listeIdUsersEnOrdre = []
            ######Met les niv en ordre de proprietaire
            tupleUser = self.unDTOUsers.getTousUser()
            for username in tupleUser:
                listeIdUsersEnOrdre.append(tupleUser.get(username)[0])
            listeIdUsersEnOrdre.sort()

            listeDesUsersEnOrdre = []
            for idJoueur in listeIdUsersEnOrdre:
                print idJoueur
                for username in tupleUser:
                    if tupleUser.get(username)[0] == idJoueur:
                        listeDesUsersEnOrdre.append(tupleUser.get(username))

            for user1 in listeDesUsersEnOrdre:
                for key in self.dictInfoNiveaux:
                    if self.dictInfoNiveaux.get(key)[8] == user1[0]:
                        infosNiveau = []
                        infosNiveau = self.dictInfoNiveaux.get(key)

                        nomProprio = user1[1]
                        nbFoisFavori = self.unDTOMap.nbFoisNiveauFavori(
                            infosNiveau[0])
                        nbFoisJouer = self.unDTOMap.obtenirNbFoisNiveauJoueTotal(
                            infosNiveau[0])

                        if infosNiveau[5] != 4:
                            textLabel = str(
                                infosNiveau[1]) + " --> Propriétaire: " + str(
                                    nomProprio) + " -- Favoris: " + str(
                                        nbFoisFavori) + " -- Joué: " + str(
                                            nbFoisJouer)
                            btn = DirectButton(
                                text=(textLabel, "Bon choix!",
                                      self.stringHover(infosNiveau[5]),
                                      "disabled"),
                                text_scale=0.075,
                                borderWidth=(0.01, 0.01),
                                relief=2,
                                command=lambda idNiveau=infosNiveau[
                                    0]: self.chargeJeu(idNiveau))
                            self.myScrolledList.addItem(btn)

    def chargeJeu(self, idNiveau):
        listeInfo = [
            idNiveau, self.unDTOMap, self.unDTOUsers, self.username1,
            self.username2, self.listeArmes
        ]
        #On démarre!
        Sequence(
            Func(lambda: self.transition.irisOut(0.2)),
            SoundInterval(self.sound),
            Func(self.cacher),
            Func(lambda: messenger.send("DemarrerPartie", listeInfo)),
            Wait(
                0.2
            ),  #Bug étrange quand on met pas ça. L'effet de transition doit lagger
            Func(lambda: self.transition.irisIn(0.2))).start()

    def cacher(self):
        #Est esssentiellement un code de "loading"
        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
        self.myScrolledList.hide()

    def setupMap(self):
        leDTOMap = DTOMap()
        leDAOMap = DAOOracleMap()
        leDTOMap = leDAOMap.read()
        return leDTOMap

    def stringHover(self, typeNiv):
        if typeNiv == 1:
            return "Public"
        if typeNiv == 2:
            return "Privé"
        if typeNiv == 3:
            return "Équipe"
        if typeNiv == 4:
            return "Inactif"
class InterfaceMenuNiveaux(ShowBase):
    def __init__(self):
        self.frames = []
        self.dao = DAO_Oracle()
        # remplir les maps seulement si la connexion Oracle est fonctionnelle
        if self.dao.getConnexionState():
            self.dao.fill_dto_with_db()
        else:
            self.afficherMessagesOracle()

        # Background image
        self.background = OnscreenImage(parent = render2d , image = '../asset/Menu/tank.jpg')
        
        #On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(20)

        mapInfo = []
        for i in range(len(DTO.maps)):
            mapInfo.append((DTO.maps[i].titre,DTO.maps[i].id))
            


        self.controlTextScale = 0.10
        self.controlBorderWidth = (0.005,0.005)
        self.scrollItemButtons = self.createAllItems(mapInfo)

        

        verticalOffsetControlButton = 0.225
        verticalOffsetCenterControlButton = -0.02
        self.myScrolledListLabel = DirectScrolledList(

                # bouton Haut et ses parametres
                decButton_pos = (0.0,0.0, verticalOffsetControlButton + verticalOffsetCenterControlButton),
                decButton_text = "Haut",
                decButton_text_scale = 0.08,
                decButton_borderWidth = (0.0025,0.0025),
                decButton_frameSize = (-0.35, 0.35, -0.0375, 0.075),
                decButton_text_fg = (0.15, 0.15, 0.75, 1.0),
                # decButton_clickSound = ("../asset/Menu/btn-Son.mp3"),
                    

                 # bouton bas et ses parametres
                incButton_pos = (0.0, 0.0, -0.625 - verticalOffsetControlButton + verticalOffsetCenterControlButton),
                
                incButton_text = "Bas",
                incButton_text_scale = 0.08,
                incButton_borderWidth = (0.0025, 0.0025),
                incButton_frameSize = (-0.35, 0.35, -0.0375, 0.075),
                incButton_text_fg = (0.15, 0.15, 0.75, 1.0),
                # incButton_clickSound = ("../asset/Menu/btn-Son.mp3"),
                pos = (0, 0, 0.5),

                items = self.scrollItemButtons,

                # nombre de map visible par 'Scroll' ici c'est 3
                numItemsVisible = 5,
                forceHeight = 0.175,
                
                frameSize = (-1.05, 1.05, -0.95, 0.325),
                frameColor = (0.5, 0.5, 0.5, 0.75),

                itemFrame_pos = (0.0, 0.0, 0.0),
                itemFrame_frameSize = (-1.025, 1.025, -0.775, 0.15),
                itemFrame_frameColor = (0.35, 0.35, 0.35, 0.75),
                itemFrame_relief = 1,
            )

        self.quitterButton = DirectButton(

                # les 4 parametres indiques les differents types d'état que le bouton px avoir
                 #( lorsque tu survole lorsque tu clique etc)
                 text = ("Quitter", "Etes-Vous Sur?","Au Revoir!!","disabled"),
                 text_scale = self.controlTextScale,
                 borderWidth = self.controlBorderWidth,
                 relief = 2,
                 pos = (0.0,0.0, -0.75),
                 frameSize = (-0.5,0.5,-0.625, 0.105),
                 command = lambda : sys.exit(),
             )

        #Initialisation de l'effet de transition
        curtain = loader.loadTexture("../asset/Menu/loading.jpg")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)

        self.sound = loader.loadSfx("../asset/Menu/demarrage.mp3")

    # creation du bouton avec le nom de la map
    def createItemButton (self,nomMap,idMap):
        return DirectButton(
            text = nomMap,
            text_scale = self.controlTextScale,
            borderWidth = self.controlBorderWidth,
            relief = 2,
            frameSize = (-1.0,1.0,-0.0625,0.105),
            command = lambda: self.chargerJeu(idMap,nomMap)
        )

    #Creation de la Map Aleatoire
    def createAllItems(self,mapsInfo):
        scrollItemButtons = [self.createItemButton(u'*-> Map au Hasard <-*',None)]
        for mapInfo in mapsInfo:
            pass
            scrollItemButtons.append(self.createItemButton(self.formatText(mapInfo[0]),mapInfo[1]))
        return scrollItemButtons

    # format du texte a mettre dans le bouton

    def formatText(self,text,maxLength = 30):
        return text if len(text) <= maxLength else text[0:maxLength] + '...'


    def chargerJeu(self,idMap, nomMap): 
            #loader les données dans le DTO avec la bonne map
            DTO.idMap = idMap
            # pour éviter de refaire une requête juste pour connaître le nom de la map
            DTO.nomMap = nomMap

            #On démarre!
            if self.dao.getConnexionState():
                transition = "DemarrerConnexion"
            else:
                transition = "DemarrerConnexion"

            Sequence(Func(lambda : self.transition.irisOut(0.2)),
                     SoundInterval(self.sound),
                     Func(self.cacher),
                     Func(lambda : messenger.send(transition)),
                     Wait(0.2), #Bug étrange quand on met pas ça. L'effet de transition doit lagger
                     Func(lambda : self.transition.irisIn(0.2))
            ).start()

    def afficherMessagesOracle(self):
        height = 0.15
        width = 0.30
        textSize = 0.05
        message = "Attention! La connexion au serveur Oracle n'est pas établie! Les choix de niveaux n'ont pas pu être chargés!"
        message = textwrap.fill(message, 25)
        positionDepart =  Point3(-1.37,0,1.5)
        positionArrivee =  Point3(-1.37,0,0.3)
        frameErreur = DirectFrame(text=message, pos = positionDepart, frameColor=(255,255,255,1), frameSize=(-width,width,-height,height))
        frameErreur["text_scale"] = (textSize,textSize)
        frameErreur["text_fg"] = (255,0,0,1)
        frameErreur["text_pos"] = (0,0.1)

        intervalEntrer = frameErreur.posInterval(1.5, positionArrivee, startPos=positionDepart)

        sequence = Sequence(
            intervalEntrer
        )
        sequence.start()

        self.frames.append(frameErreur)

    def cacher(self):
            #Est esssentiellement un code de "loading"
            #On remet la caméra comme avant
            base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
            #On cache les menus
            self.background.hide()
            
            for item in self.scrollItemButtons:
                item.hide()
            self.quitterButton.hide()
            self.myScrolledListLabel.hide()    

            for item in self.frames:
                item.hide()      
Exemple #4
0
class InterfaceConnexion():
    def __init__(self):
        #utilitaires
        self.analyse = AnalyseDTOJoueur()
        self.labels = []
        self.drs = []
        self.sequences = []
        self.tankModels = []

        # champs de textes
        #le frame du haut
        self.ajouterTopFrame()

        # Background image
        # on a commenté le background, pcq ca cachait les scènes pour les deux chars
        # self.background = OnscreenImage(parent = render2d , image = '../asset/Menu/menuLogin.png', )

        #On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(20)

        self.controlTextScale = 0.10
        self.controlBorderWidth = (0.005, 0.005)

        #Initialisation de l'effet de transition
        curtain = loader.loadTexture("../asset/Menu/loading.jpg")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)

        self.sound = loader.loadSfx("../asset/Menu/demarrage.mp3")

        self.testerConnexion()

    def connexion(self, joueur):
        ordre = joueur + 1

        # vérifier si le joueur n'est pas déjà connecté
        if (joueur == 0 and DTO.joueur1 != None) or (joueur == 1
                                                     and DTO.joueur2 != None):
            self.labelMessage.setText(
                "ATTENTION! Joueur %d est DÉJÀ connecté!" % (ordre))
            return

        if joueur == 0:
            user = self.entryUser1.get()
            pw = self.entryMDP1.get()
        else:
            user = self.entryUser2.get()
            pw = self.entryMDP2.get()

        # vérifier que le joueur ne se connecte pas deux fois
        if (DTO.joueur1 != None
                and DTO.joueur1.nom == user) or (DTO.joueur2 != None
                                                 and DTO.joueur2.nom == user):
            self.labelMessage.setText(
                "ATTENTION! L'usager %s est DÉJÀ connecté!" % (user))
            return

        # faire une connexion à la bd
        self.dao = DAO_Oracle()
        connecte = self.dao.validerUsager(user, pw, joueur)

        # ajuster le message de l'état de connexion des joueurs
        if connecte:
            self.labelMessage.setText("Joueur %d est connecté!" % (ordre))
            if joueur == 0:
                self.ajouterChar(joueur, DTO.joueur1.couleur)
            elif joueur == 1:
                self.ajouterChar(joueur, DTO.joueur2.couleur)
            self.afficherMessagesSanitizer(joueur)

            if DTO.joueur1 != None and DTO.joueur2 != None:
                self.labelMessage.setText("Les deux joueurs sont connectés!")
                self.ajouterMiddleFrame()
                self.ajouterBottomFrame()
                if len(DTO.joueurs) == 0:
                    DTO.joueurs.append(DTO.joueur1)
                    DTO.joueurs.append(DTO.joueur2)
            indexJoueur = joueur
        else:
            self.labelMessage.setText("Erreur de login pour Joueur %d " %
                                      (ordre))

    def ajouterTopFrame(self):
        #le frame du top
        self.frameTop = DirectFrame(text="")
        self.frameTop.reparentTo(base.a2dTopLeft)

        #les 4 labels de joueurs et mot de passe
        labelJoueur1 = OnscreenText(text='Joueur 1',
                                    pos=(0.25, -0.10),
                                    scale=0.07,
                                    bg=(255, 255, 255, 1),
                                    frame=(0, 0, 0, 1))
        labelMotDePasse1 = OnscreenText(text='Mot de passe 1',
                                        pos=(0.25, -0.30),
                                        scale=0.07,
                                        bg=(255, 255, 255, 1),
                                        frame=(0, 0, 0, 1))
        labelJoueur2 = OnscreenText(text='Joueur 2',
                                    pos=(2.00, -0.10),
                                    scale=0.07,
                                    bg=(255, 255, 255, 1),
                                    frame=(0, 0, 0, 1))
        labelMotDePasse2 = OnscreenText(text='Mot de passe 2',
                                        pos=(2.00, -0.30),
                                        scale=0.07,
                                        bg=(255, 255, 255, 1),
                                        frame=(0, 0, 0, 1))

        labelJoueur1.reparentTo(self.frameTop)
        labelMotDePasse1.reparentTo(self.frameTop)
        labelJoueur2.reparentTo(self.frameTop)
        labelMotDePasse2.reparentTo(self.frameTop)

        #les quatre boîtes de saisie de texte
        #pour le joueur 1
        self.entryUser1 = DirectEntry(text="",
                                      scale=.07,
                                      pos=(0.65, 0.0, -0.10),
                                      numLines=1,
                                      focus=1)
        self.entryUser1.reparentTo(self.frameTop)

        self.entryMDP1 = DirectEntry(text="",
                                     scale=.07,
                                     pos=(0.65, 0.0, -0.3),
                                     command=lambda x=1: self.connexion(0),
                                     numLines=1,
                                     focus=1,
                                     obscured=True)
        self.entryMDP1.reparentTo(self.frameTop)

        #pour le joueur 2
        self.entryUser2 = DirectEntry(text="",
                                      scale=.07,
                                      pos=(2.4, 0.0, -0.10),
                                      numLines=1,
                                      focus=1)
        self.entryUser2.reparentTo(self.frameTop)

        self.entryMDP2 = DirectEntry(text="",
                                     scale=.07,
                                     pos=(2.4, 0.0, -0.3),
                                     command=lambda x=1: self.connexion(1),
                                     numLines=1,
                                     focus=1,
                                     obscured=True)
        self.entryMDP2.reparentTo(self.frameTop)

        self.frameConnecte = DirectFrame(text="")
        self.frameConnecte.reparentTo(self.frameTop)

        #label pour le message
        height = 0.10
        self.frameMessage = DirectFrame(text="",
                                        frameColor=(255, 255, 255, 0.23),
                                        frameSize=(-1.2, 1.2, -height, height))
        self.frameMessage.setPos(0, 0, 0.55)
        self.labelMessage = OnscreenText(text='Aucun message',
                                         pos=(0, 0),
                                         scale=0.07,
                                         align=TextNode.ACenter,
                                         mayChange=True)
        self.labelMessage.reparentTo(self.frameMessage)

    def ajouterChar(self, ordre, couleur):
        # https://www.panda3d.org/manual/index.php/File:DisplayRegion_1.jpg
        if ordre == 0:
            dr2 = base.win.makeDisplayRegion(0, 0.30, 0, 0.5)
        elif ordre == 1:
            dr2 = base.win.makeDisplayRegion(0.70, 1, 0, 0.5)

        dr2.setClearColor(VBase4(0.41, 0.41, 0.41, 0))
        dr2.setClearColorActive(True)
        dr2.setClearDepthActive(True)

        render2 = NodePath('render')
        cam2 = render2.attachNewNode(Camera('cam2'))
        dr2.setCamera(cam2)

        cam2.setPos(-22.5, -387.3, 58.1999)

        env = loader.loadModel("box.egg")
        env.setTransparency(TransparencyAttrib.MAlpha)
        env.setDepthTest(False)
        env.setDepthWrite(False)
        env.reparentTo(render2)

        # ajouter le tank
        size = 50
        tank = Actor("../asset/Tank/tank")
        tank.setScale(size, size, size)
        tank.setColorScale(couleur[0], couleur[1], couleur[2], 1)
        if ordre == 0:
            tank.setHpr(270.0, 0.0, 0.0)
        elif ordre == 1:
            tank.setHpr(90.0, 0.0, 0.0)
        tank.reparentTo(env)

        #faire avancer le tank
        if ordre == 0:
            intervalAvancer = tank.posInterval(2,
                                               Point3(-10, 4, 8),
                                               startPos=Point3(-200, 4, 8))
        elif ordre == 1:
            intervalAvancer = tank.posInterval(2,
                                               Point3(-10, 4, 8),
                                               startPos=Point3(180, 4, 8))

        # faire tourner le tank (interval)
        duree = 3.0
        if ordre == 0:
            intervalTourner = tank.hprInterval(duree, Vec3(-90, 0, 0))
        else:
            intervalTourner = tank.hprInterval(duree, Vec3(450, 0, 0))

        sequenceAvancer = Sequence(intervalAvancer)
        sequenceTourner = Sequence(intervalTourner)

        sequence = Sequence(sequenceAvancer, Func(sequenceTourner.loop))
        sequence.start()

        self.drs.append(dr2)
        self.sequences.append(sequenceTourner)
        self.tankModels.append([ordre, tank])

    def ajouterMiddleFrame(self):
        height = 0.15
        self.frameMiddle = DirectFrame(frameColor=(255, 255, 255, 0.23),
                                       frameSize=(-1.2, 1.2, -height, height))
        self.frameMiddle.setPos(0, 0, 0.25)

        #calculer les noms des deux joueurs

        joueur1 = self.analyse.calculerNom(DTO.joueur1)
        joueur2 = self.analyse.calculerNom(DTO.joueur2)

        dist = 0.075
        labelVS1 = OnscreenText(text=joueur1,
                                pos=(0, 0.05),
                                scale=0.07,
                                align=TextNode.ACenter,
                                mayChange=True)
        labelVS1.reparentTo(self.frameMiddle)
        labelVS = OnscreenText(text='VS',
                               pos=(0, 0.05 - dist),
                               scale=0.07,
                               align=TextNode.ACenter,
                               mayChange=True)
        labelVS.reparentTo(self.frameMiddle)
        labelVS2 = OnscreenText(text=joueur2,
                                pos=(0, 0.05 - dist * 2),
                                scale=0.07,
                                align=TextNode.ACenter,
                                mayChange=True)
        labelVS2.reparentTo(self.frameMiddle)

    def combattre(self):

        # freezer le bouton Combattre
        scaleBouton = self.b.getScale().getX()
        coordonnees = []
        tankH1 = self.tankModels[0][1].getH()
        tankH2 = self.tankModels[1][1].getH()
        coordonnees.append(tankH1)
        coordonnees.append(tankH2)

        for sequence in self.sequences:
            sequence.finish()

        cpt = 0
        sequenceTourner = None

        dureeTourner = 3.0
        for listTank in self.tankModels:

            ordre = listTank[0]
            tank = listTank[1]

            tank.setH(coordonnees[cpt])

            if ordre == 0:
                intervalTourner = tank.hprInterval(dureeTourner,
                                                   Vec3(-90, 0, 0))
            elif ordre == 1:
                intervalTourner = tank.hprInterval(dureeTourner,
                                                   Vec3(450, 0, 0))

            sequenceTourner = Sequence(intervalTourner)
            sequenceTourner.start()
            cpt = cpt + 1

        self.b.setScale(scaleBouton)

        sequence = Sequence(Func(lambda: sequenceTourner.start()),
                            Wait(dureeTourner),
                            Func(lambda: self.ajouterTextVS()), Wait(5.5),
                            Func(lambda: self.chargerJeu()))
        sequence.start()

    def analyserPositionChars(self):
        arrete = False
        arrete = self.tankModels[0][1].getH(
        ) == -90 and self.tankModels[1][1].getH() == 450
        return arrete

    def ajouterTextVS(self):
        message = DTO.joueur1.nom + " VS " + DTO.joueur2.nom
        self.labelVS = OnscreenText(text=message,
                                    shadow=(0, 0, 0, 1),
                                    pos=(0, 0),
                                    frame=(0, 0, 0, 1),
                                    scale=0.14,
                                    align=TextNode.ACenter,
                                    mayChange=False,
                                    bg=(0, 255, 0, 0.5),
                                    fg=(255, 255, 255, 1))

        #faire l'animation du texte
        scaleDebut = 1.0
        scaleFin = 2.0
        duree = 2.0

        # #les deux intervals opposés (grandir vs rapetir)
        intervalRapetir = self.labelVS.scaleInterval(
            duree, Vec3(scaleDebut, scaleDebut, scaleDebut))
        intervalGrossir = self.labelVS.scaleInterval(
            duree, Vec3(scaleFin, scaleFin, scaleFin))

        # # # la loop qui dure toujours
        sequence = Sequence(intervalGrossir, intervalRapetir)
        sequence.loop()

    def afficherMessagesSanitizer(self, joueur):
        if joueur == 0:
            messagesErreurs = DTO.messagesErreurs1
        elif joueur == 1:
            messagesErreurs = DTO.messagesErreurs2
        for i in range(len(messagesErreurs)):
            height = 0.15
            width = 0.4
            textSize = 0.05

            if joueur == 0:
                positionArrivee = Point3(-1.1, 0, -0.1)
                positionDepart = Point3(-2.5, 0, -0.1)
            elif joueur == 1:
                positionArrivee = Point3(1.1, 0, -0.1)
                positionDepart = Point3(2.5, 0, -0.1)

            message = messagesErreurs[i].retournerMessage()
            message = textwrap.fill(message, 33)
            self.frameErreur = DirectFrame(text=message,
                                           pos=positionDepart,
                                           frameColor=(255, 255, 255, 0.5),
                                           frameSize=(-width, width, -height,
                                                      height))
            self.frameErreur["text_scale"] = (textSize, textSize)
            self.frameErreur["text_fg"] = (255, 0, 0, 1)
            self.frameErreur["text_pos"] = (0, 0.1)

            scaleFin = 0
            intervalEntrer = self.frameErreur.posInterval(
                2, positionArrivee, startPos=positionDepart)
            intervalRapetisser = self.frameErreur.scaleInterval(
                1, Vec3(1, 1, scaleFin))

            tempsAttente = i * 8
            sequence = Sequence(Wait(tempsAttente), intervalEntrer, Wait(5),
                                intervalRapetisser)
            sequence.start()

    def ajouterBottomFrame(self):
        #variables de positionnement
        height = 0.15
        width = 0.6
        dist = 0.1
        debut = 0.025

        #frame combattre
        self.frameBottom = DirectFrame(text="",
                                       frameColor=(255, 255, 255, 0.23),
                                       frameSize=(-width, width, -height,
                                                  height))
        self.frameBottom.setPos(0, 0, -0.10)
        labelCombattre = OnscreenText(text='Combattrons dans',
                                      pos=(0, debut),
                                      scale=0.07,
                                      align=TextNode.ACenter,
                                      mayChange=True)
        labelCombattre.reparentTo(self.frameBottom)
        nomNiveau = DTO.nomMap
        if nomNiveau == None:
            nomNiveau = ""
        labelNiveau = OnscreenText(text=nomNiveau,
                                   pos=(0, debut - dist),
                                   scale=0.07,
                                   align=TextNode.ACenter,
                                   mayChange=True)
        # labelNiveau = OnscreenText(text = DTO.mapSelectionne.titre, pos = (0, debut-dist), scale = 0.07 , align=TextNode.ACenter, mayChange = True)
        labelNiveau.reparentTo(self.frameBottom)

        height = 0.10
        width = 0.6
        dist = 0.1
        debut = -0.025
        #frame joueur favorisé
        #déterminer le joueur favorisé
        if DTO.joueurs[0].level > DTO.joueurs[1].level:
            joueurFavorise = DTO.joueurs[0].nom
            DTO.joueurs[0].favori
        elif DTO.joueurs[1].level > DTO.joueurs[0].level:
            joueurFavorise = DTO.joueurs[1].nom
            DTO.joueurs[1].favori = True
        else:
            joueurFavorise = None

        if joueurFavorise == None:
            joueurFavorise = "Aucun joueur favorisé!"
        else:
            # joueurFavorise = self.analyse.calculerNom(DTO.joueurs[0])
            joueurFavorise += " est favorisé!"

        self.frameFavori = DirectFrame(text="",
                                       frameColor=(24, 24, 0, 1),
                                       frameSize=(-width, width, -height,
                                                  height))
        self.frameFavori.setPos(0, 0, -0.40)
        labelFavori = OnscreenText(text=joueurFavorise,
                                   pos=(0, debut),
                                   scale=0.06,
                                   align=TextNode.ACenter,
                                   mayChange=True)
        labelFavori.reparentTo(self.frameFavori)

        # bouton combattre
        self.b = DirectButton(text=("COMBATTRE!"),
                              scale=.07,
                              frameSize=(-6, 6, -3, 3),
                              pos=(0, 0, -0.65),
                              command=self.combattre)
        self.b.reparentTo(self.frameBottom)

        # interval de "battements de coeur" pour le bouton Combattre
        # les paramètres de la séquence
        scaleDebut = 0.03
        scaleFin = 0.05
        self.b.setScale(scaleDebut, scaleDebut, scaleDebut)
        duree = 0.75

        #les deux intervals opposés (grandir vs rapetir)
        intervalGrossir = self.b.scaleInterval(
            duree, Vec3(scaleDebut, scaleDebut, scaleDebut))
        intervalRapetir = self.b.scaleInterval(
            duree, Vec3(scaleFin, scaleFin, scaleFin))

        # la loop qui dure toujours
        sequence = Sequence(intervalRapetir, intervalGrossir)
        sequence.loop()
        self.sequences.append(sequence)

    def chargerJeu(self):
        #loader les données dans le DTO avec la bonne map
        self.dao = DAO_Oracle()
        self.dao.fillGame(DTO.idMap)

        #On démarre!
        Sequence(
            Func(lambda: self.transition.irisOut(0.2)),
            SoundInterval(self.sound),
            Func(self.cacher),
            Func(lambda: messenger.send("DemarrerPartie")),
            Wait(
                0.2
            ),  #Bug étrange quand on met pas ça. L'effet de transition doit lagger
            Func(lambda: self.transition.irisIn(0.2))).start()

    def cacher(self):
        #Est esssentiellement un code de "loading"
        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
        # #On cache les menus
        # self.background.hide()
        self.frameTop.hide()
        self.frameBottom.hide()
        self.frameMiddle.hide()
        self.frameMessage.hide()
        self.frameFavori.hide()
        self.labelVS.hide()
        for dr in self.drs:
            base.win.removeDisplayRegion(dr)

    def testerConnexion(self):
        dao = DAO_Oracle()
        connecte = dao.connectDB()
        if not connecte:
            self.labelMessage.setText(
                "Aucune connexion avec la base de données...")
Exemple #5
0
class MenuPrincipal(ShowBase):
    def __init__(self, gameLogic):
        self.gameLogic = gameLogic
        #Image d'arrière plan
        self.background = OnscreenImage(parent=render2d,
                                        image="../asset/Menu/background.jpg")

        #On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(20)

        #Titre du jeu
        self.textTitre = OnscreenText(text="Tank'em!",
                                      pos=(0, 0.6),
                                      scale=0.32,
                                      fg=(0.8, 0.9, 0.7, 1),
                                      align=TextNode.ACenter)

        #Boutons
        btnScale = (0.18, 0.18)
        text_scale = 0.12
        borderW = (0.04, 0.04)
        couleurBack = (0.243, 0.325, 0.121, 1)
        separation = 1
        hauteur = -0.6
        numItemsVisible = 50

        self.b1 = DirectButton(text=("Jouer", "Carnage!", "DESTRUCTION",
                                     "disabled"),
                               text_scale=btnScale,
                               borderWidth=borderW,
                               text_bg=couleurBack,
                               frameColor=couleurBack,
                               relief=4,
                               textMayChange=1,
                               pad=(0.35, 0),
                               command=self.chargeJeu,
                               pos=(separation, 0, hauteur + 0.8))

        self.b2 = DirectButton(text=("Quitter", "Cyka Bliat", "Bye!",
                                     "disabled"),
                               text_scale=btnScale,
                               borderWidth=borderW,
                               text_bg=couleurBack,
                               frameColor=couleurBack,
                               relief=4,
                               textMayChange=1,
                               pad=(0.30, 0),
                               command=lambda: sys.exit(),
                               pos=(separation, 0, hauteur))
        #Scroll list

        self.scrollList = DirectScrolledList(
            frameSize=(-0.4, 0.7, -0.8, 0.8),
            frameColor=(0, 0, 0, 0),
            pos=(-1, 1, 0),
            forceHeight=0.1,
            numItemsVisible=numItemsVisible,
            itemFrame_frameSize=(-0.4, 0.7, -0.5, 0.59),
            itemFrame_pos=(0, 0, 0),
        )

        for map in DTOlistmap.getArrayMaps():
            self.name = map.getName()
            self.i = map.getId()
            self.l = DirectButton(
                text=str(self.i) + " " + self.name,
                text_scale=0.08,
                scale=0.9,
                borderWidth=(0.005, 0.005),
                command=self.menuLogin,
                extraArgs=[self.gameLogic, self.i, self.name])
            self.scrollList.addItem(self.l)

        #Initialisation de l'effet de transition
        curtain = loader.loadTexture("../asset/Menu/load.png")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)

        self.sound = loader.loadSfx("../asset/Menu/shotgun.mp3")

    def cacher(self):
        #Est esssentiellement un code de "loading"

        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
        #On cache les menus
        self.background.hide()
        self.b1.hide()
        self.b2.hide()
        self.scrollList.hide()
        self.textTitre.hide()

    def menuLogin(self, gameLogic, mapID, mapName):
        self.cacher()
        self.menuPrincipal = MenuLogin(gameLogic, mapID, mapName)

    def chargeJeu(self):
        #On démarre!
        Sequence(
            Func(lambda: self.transition.irisOut(0.2)),
            SoundInterval(self.sound),
            Func(self.cacher),
            Func(lambda: messenger.send("DemarrerPartie")),
            Wait(
                0.2
            ),  #Bug étrange quand on met pas ça. L'effet de transition doit lagger
            Func(lambda: self.transition.irisIn(0.2))).start()
Exemple #6
0
class InterfaceMenuPrincipal(ShowBase):
    def __init__(self):
       
        self.arriver1 = False
        self.arriver2 = False
        self.Parallel = Parallel(name="parallel")
        
        #Image d'arrière plan
        self.background=OnscreenImage(parent=render2d, image="../asset/Menu/menuPrincipal.jpg")

        #On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
        self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
        base.cam.node().getDisplayRegion(0).setSort(10)

        #Titre du jeu
        self.textTitre = OnscreenText(text = "Tankem!",
                                      pos = (0,0.6), 
                                      scale = 0.32,
                                      fg=(0.8,0.9,0.7,1),
                                      align=TextNode.ACenter)


        #-------------------->



        #--------------------<


        #Boutons
        btnScale = (0.18,0.18)
        text_scale = 0.12
        borderW = (0.04, 0.01)
        couleurBack = (0.243,0.325,0.121,1)
        separation = 0.5
        hauteur = -0.6
        self.b1 = DirectButton(text = ("Quick play", "!", "!", "disabled"),
                          text_scale=btnScale,
                          borderWidth = borderW,
                          text_bg=couleurBack,
                          frameColor=couleurBack,
                          relief=2,
                          command=self.chargeJeu,
                          pos = (-1,0,hauteur))


        self.b3 = DirectButton(text = ("Niveaux", "!", "!", "disabled"),
                          text_scale=btnScale,
                          borderWidth = borderW,
                          text_bg=couleurBack,
                          frameColor=couleurBack,
                          relief=2,
                          command=self.choisirNiveau,
                          pos = (1,0,hauteur))


        self.b2 = DirectButton(text = ("Quitter", "Bye!", ":-(", "disabled"),
                        text_scale=btnScale,
                        borderWidth = borderW,
                        text_bg=couleurBack,
                        frameColor=couleurBack,
                        relief=2,
                        command = lambda : sys.exit(),
                        pos = (0,0,hauteur))

        #Initialisation de l'effet de transition
        curtain = loader.loadTexture("../asset/Menu/loading.jpg")

        self.transition = Transitions(loader)
        self.transition.setFadeColor(0, 0, 0)
        self.transition.setFadeModel(curtain)

        self.sound = loader.loadSfx("../asset/Menu/demarrage.mp3")
        self.etat = False

        #ici pour button les interfaces
        self.verticalOffsetControlButton = 0.225
        self.verticalOffsetCenterControlButton = -0.02

    def cacher(self):
            #Est esssentiellement un code de "loading"

            #On remet la caméra comme avant
            base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
            #On cache les menus
            self.background.hide()
            self.b1.hide()
            self.b2.hide()
            self.b3.hide()
            self.textTitre.hide()


    def cacherNiveau(self):
       
        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
       
        #On cache les menus
        self.background.hide()
        self.myScrolledListLabel.hide()

    def cacherAuthentification(self):
       
        #On remet la caméra comme avant
        base.cam.node().getDisplayRegion(0).setSort(self.baseSort)
       
        self.labelJ1.hide() 
        self.labelmdp1.hide()
        self.entryJ1.hide()
        self.entrymdp1.hide() 
        self.labelJ2.hide() 
        self.labelmdp2.hide() 
        self.entryJ2.hide() 
        self.entrymdp2.hide()
        self.connectJ1.hide()
        self.connectJ2.hide()
        self.champMessage.hide()
        self.champCalcule1.hide()
        self.champVs.hide()
        self.champCalcule2.hide()
        self.champCombattre.hide()
        self.champNomNiv.hide()
        self.champFavori.hide()
        self.boutonCombattre.hide()
        self.labelVs.hide()
        self.background.hide()



    def chargeJeu(self):
            #On démarre!
            #if self.etat==True:
            #    self.cacherNiveau()
            
            Sequence(Func(lambda : self.transition.irisOut(0.2)),
                     SoundInterval(self.sound),               
                     Func(self.cacher),
                     Func(lambda : messenger.send("DemarrerPartie", ["quick"])),
                     #Wait(0.2), #Bug étrange quand on met pas ça. L'effet de transition doit lagger
                     Func(lambda : self.transition.irisIn(0.2))
            ).start()


    def chargeJeuNiveau(self,niveau):
        self.tank1.removeNode()
        self.tank2.removeNode()
        Sequence(Func(lambda : self.transition.irisOut(0.2)),
                    SoundInterval(self.sound),               
                    Func(self.cacherAuthentification),
                    Func(lambda : messenger.send("DemarrerPartie", [niveau])),
                    #Wait(0.2), #Bug étrange quand on met pas ça. L'effet de transition doit lagger
                    Func(lambda : self.transition.irisIn(0.2))
        ).start()


    
    def choisirNiveau(self):
     
        '''
        self.textObject = OnscreenText(text = "CHOISISSEZ VOTRE CHAMP DE BATAILLLE", pos =(0,0.9),
        scale = 0.1,fg=(1,1.5,0.5,0.3),bg=(1,1,1,0.4),align=TextNode.ACenter,mayChange=1)
        '''

        self.cacher()
        self.etat=True
        self.background = OnscreenImage(parent = render2d, image="../asset/Menu/niveau.jpg")

      
        try:
            self.leDaoPhase2 = DAO_Oracle("e1529743","AAAaaa111","delta/decinfo.edu")
            self.niveaux = self.leDaoPhase2.accessNomsNiveaux()
            self.leDaoPhase2.deconnection()

            if(len(self.niveaux) > 0):
                mapsInfo = self.niveaux

                # ici pour cartes
                self.controlTextScale = 0.10
                self.controlBorderWidth = (0.005, 0.005)
                self.scrollItemButtons = self.createAllItemsNiveau(mapsInfo)

               

                self.myScrolledListLabel = DirectScrolledList(
                        decButton_pos = (0.5, 0.0,-0.625-  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton),
                        decButton_text = "Monter",
                        decButton_text_scale = 0.08,
                        decButton_borderWidth = (0.0025, 0.0025),
                        decButton_frameSize = (-0.35, 0.35, -0.0375, 0.075),
                        decButton_text_fg = (0.15, 0.15, 0.75, 1.0),

                        incButton_pos = (-0.5, 0.0, -0.625 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton),
                        incButton_text = "Descendre",
                        incButton_text_scale = 0.08,
                        incButton_borderWidth = (0.0025, 0.0025),
                        incButton_frameSize = (-0.35, 0.35, -0.0375, 0.075),
                        incButton_text_fg = (0.15, 0.15, 0.75, 1.0),



                        #position du frame x , z y
                        pos = (0.1, 0, 0.5),
                        items = self.scrollItemButtons,
                        numItemsVisible = 5,
                        forceHeight = 0.175,
                        
                        frameSize = (-1.05, 1.05, -0.95, 0.325),
                        frameColor = (0.3254,0.3254, 0.12549, 0.75),

                        # sur un item
                        itemFrame_pos = (0.0, 0.0, 0.0),
                        itemFrame_frameSize = (-1.025, 1.025, -0.775, 0.15),
                        itemFrame_frameColor = (0.1098039215686275,0.1098039215686275, 0.0431372549019608, 0.75),
                        itemFrame_relief = 1
                    )
            else:
                ctypes.windll.user32.MessageBoxA(0, "Il n'y a aucun niveau actif dans la BD, on demarre le tankem avec un niveau au hasard", "Error de connection", 0)
                self.chargeJeu()
        except:
            ctypes.windll.user32.MessageBoxA(0, "erreur connexion pour les niveaux, on demarre le tankem avec un niveau au hasard", "Error de connection", 0)
            

       

    def AuthentificationJoueur(self, mapId):
        try:
            self.dao_joueur = DAO_Joueur("e1529743","AAAaaa111","delta/decinfo.edu")
            self.cacherNiveau()
            self.background = OnscreenImage(parent = render2d, image="../asset/Menu/background.jpg")
            base.cam.node().getDisplayRegion(0).setSort(20)

            self.isConnectedJ1 = False
            self.isConnectedJ2 = False

            self.labelJ1 = DirectLabel(text = "Joueur 1", text_scale=0.06, pos=(-1.5, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.labelmdp1 = DirectLabel(text = "Mot de passe", text_scale=0.06, pos=(-1.5, 0.0, 1.0 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.entryJ1 = DirectEntry(text_scale=0.06, pos=(-0.9, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.entrymdp1 = DirectEntry(text_scale=0.06, pos=(-0.9, 0.0, 1.0 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.labelJ2 = DirectLabel(text = "Joueur 2", text_scale=0.06, pos=(0.3, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.labelmdp2 = DirectLabel(text = "Mot de passe", text_scale=0.06, pos=(0.3, 0.0, 1.0 - self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.entryJ2 = DirectEntry(text_scale=0.06, pos=(0.9, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.entrymdp2 = DirectEntry(text_scale=0.06, pos=(0.9, 0.0, 1.0 - self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), color=(0,0,0,1), text_fg=(1,1,1,1))
            self.connectJ1 = DirectButton(frameColor=(1,0.5,0.5,1), relief=1, text = "Connection",text_scale=0.06, pos=(-0.3, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), command = lambda: self.connect("J1", mapId))
            self.connectJ2 = DirectButton(frameColor=(1,0.5,0.5,1), relief=1, text = "Connection", text_scale=0.06, pos=(1.5, 0.0, 1.1 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.25, 0.25, -0.035, 0.060), command = lambda: self.connect("J2", mapId))
            self.champMessage = DirectLabel(text = "Veuillez vous-connectez !",text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), color=(0,0,0,1),text_fg=(1,0.1,0.1,1))
        except:
            ctypes.windll.user32.MessageBoxA(0, "erreur connexion pour les login des joueurs, demmarage automatique", "Error de login", 0)
            self.cacherNiveau()
            self.chargeJeu()
            
        

    def connect(self, joueur, mapId):
        if(joueur == "J1"):
            self.dto_joueur1 = self.dao_joueur.lireJoueur(0, self.entryJ1.get(), self.entrymdp1.get())
            if(self.dto_joueur1.id == 0):
                self.champMessage.hide()
                self.champMessage =  DirectLabel(text = "Le joueur n'est pas reconnu !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
            elif(self.isConnectedJ2):
                if(self.dto_joueur1.id == self.dto_joueur2.id):
                    self.champMessage.hide()
                    self.champMessage =  DirectLabel(text = "Le joueur est déja connecté !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
                else:
                    self.champMessage.hide()
                    self.champMessage =  DirectLabel(text = "Joueur1 est connecté !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
                    self.isConnectedJ1 = True
                    self.char1 = self.creerChar(6,6,0,Vec3(self.dto_joueur1.R,self.dto_joueur1.G,self.dto_joueur1.B))            
            else:
                self.champMessage.hide()
                self.champMessage =  DirectLabel(text = "Joueur1 est connecté !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
                self.isConnectedJ1 = True
                self.char1 = self.creerChar(6,6,0,Vec3(self.dto_joueur1.R,self.dto_joueur1.G,self.dto_joueur1.B)) 
        else:
            self.dto_joueur2 = self.dao_joueur.lireJoueur(1, self.entryJ2.get(), self.entrymdp2.get())
            if(self.dto_joueur2.id == 0):
                self.champMessage.hide()
                self.champMessage =  DirectLabel(text = "Le joueur n'est pas reconnu !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
            elif(self.isConnectedJ1):
                if(self.dto_joueur1.id == self.dto_joueur2.id):
                    self.champMessage.hide()
                    self.champMessage =  DirectLabel(text = "Le joueur est déja connecté !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
                else:
                    self.champMessage.hide()
                    self.champMessage =  DirectLabel(text = "Joueur2 est connecté !", text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1))
                    self.isConnectedJ2 = True
                    self.char2 = self.creerChar(3,3,1,Vec3(self.dto_joueur2.R,self.dto_joueur2.G,self.dto_joueur2.B)) #Char gris-jaune
            else:
                self.champMessage.hide()
                self.champMessage =  DirectLabel(text = "Joueur2 est connecté !", text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
                self.isConnectedJ2 = True
                self.char2 = self.creerChar(3,3,1,Vec3(self.dto_joueur2.R,self.dto_joueur2.G,self.dto_joueur2.B)) #Char gris-jaune
        if(self.isConnectedJ1 and self.isConnectedJ2):
            self.champMessage.hide()
            self.champMessage = DirectLabel(text = "Les deux joueurs sont connecté !",  text_scale=0.06, pos=(0, 0.0, 0.8 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
            self.createLastItem(mapId)

    def tournerJ1(self):
        self.arriver1 = True
        if(self.arriver2):
            self.Parallel.append(self.tankHprInterval1)
            self.Parallel.append(self.tankHprInterval2)
            self.Parallel.loop()
        else:
            self.Parallel.append(self.tankHprInterval1)
            self.Parallel.loop()

    def tournerJ2(self):
        self.arriver2 = True
        if(self.arriver1):
            self.Parallel.append(self.tankHprInterval2)
            self.Parallel.append(self.tankHprInterval1)
            self.Parallel.loop()
        else:
            self.Parallel.append(self.tankHprInterval2)
            self.Parallel.loop()
    def creerChar(self,positionX, positionY, identifiant, couleur):

        # On charge le modèles
        
     
        if(identifiant == 0):
            self.tank1 = loader.loadModel("../asset/Tank/tank")
            self.tank1.reparentTo(render)
            self.tank1.setColorScale(couleur.getX(),couleur.getY(),couleur.getZ(),1)
            self.tank1.setZ(-0.25)
            self.tank1.setHpr(-90,0,0)
            self.tankHprInterval1 = self.tank1.hprInterval(3.0,Point3(-450, 0, 0))
            tankAvancerDroite = self.tank1.posInterval(3.0,Point3(-4,15,-3),startPos=Point3(-7,15,-3))
            self.Sequence = Sequence(tankAvancerDroite, Func(self.tournerJ1))
            self.Sequence.start()

        else:
            self.tank2 = loader.loadModel("../asset/Tank/tank")
            self.tank2.reparentTo(render)
            self.tank2.setColorScale(couleur.getX(),couleur.getY(),couleur.getZ(),1)
            self.tank2.setZ(-0.25)
            self.tank2.setHpr(90,0,0)
            self.tankHprInterval2 = self.tank2.hprInterval(3.0,Point3(450, 0, 0))
            tankAvancerGauche = self.tank2.posInterval(3.0,Point3(4,15,-3),startPos=Point3(7,15,-3))
            self.Sequence = Sequence(tankAvancerGauche, Func(self.tournerJ2))
            self.Sequence.start()


    def createLastItem(self, mapId):
        #analyse pour le nom calcule 
        analyse1 = AnalyseDTOJoueur(self.dto_joueur1)
        analyse2 = AnalyseDTOJoueur(self.dto_joueur2)
        self.nomCalcule1 = analyse1.nomCalcule()
        self.nomCalcule2 = analyse2.nomCalcule()

        
        self.champCalcule1 = DirectLabel(text = self.nomCalcule1,  text_scale=0.06, pos=(0, 0.0, 0.65 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.035, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
        self.champVs = DirectLabel(text = "VS",  text_scale=0.06, pos=(0, 0.0, 0.55 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.035, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
        self.champCalcule2 = DirectLabel(text =  self.nomCalcule2 ,  text_scale=0.06, pos=(0, 0.0, 0.45 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
        self.champCombattre = DirectLabel(text = "Combattrons dans",  text_scale=0.06, pos=(0, 0.0, 0.30 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2,-0.035, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
        pos = 0
        for i in self.niveaux:
            if(i[1] == mapId):
                niveau = self.niveaux[pos][0]
            pos += 1
        self.champNomNiv = DirectLabel(text = str(niveau), text_scale=0.06, pos=(0, 0.0, 0.20 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))

        #favori
        if(self.dto_joueur1.experience > self.dto_joueur2.experience):
            favori = self.nomCalcule1  + " est favori"
            self.dto_joueur1.favori = 0
        elif(self.dto_joueur1.experience < self.dto_joueur2.experience):
            favori =  self.nomCalcule2  + " est favori"
            self.dto_joueur2.favori = 0
        else:
            favori = "Aucun favori"
            self.dto_joueur1.favori = 0
            self.dto_joueur2.favori = 0

        self.champFavori = DirectLabel(text = favori,  text_scale=0.06, pos=(0, 0.0, 0.05 -  self.verticalOffsetControlButton + self.verticalOffsetCenterControlButton), frameSize = (-1.2,1.2, -0.020, 0.065), scale=(0,0,0),text_fg=(1,0.1,0.1,1), color=(0,0,0,1))
        #animation des labels
        delai = Wait(0.3)

        scale1 = self.champCalcule1.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        scale2 = self.champVs.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        scale3 = self.champCalcule2.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        scale4 = self.champCombattre.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        scale5 = self.champNomNiv.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        scale6 = self.champFavori.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
       
        sequence = Sequence(scale1, delai, scale2, delai,scale3, delai,scale4,scale5, delai,scale6, delai)
        sequence.start()

        #animation bouton combattre
        self.boutonCombattre = DirectButton(frameColor=(1,0,0,1), relief=2, text = "Combattre", text_scale=0.07, pos=(0, 0.0, - 0.5 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-0.40, 0.40, -0.080, 0.060), command = lambda: self.affichageCombat(mapId))
        interval1 = self.boutonCombattre.scaleInterval(0.7, Point3(1.2, 1.2, 1.2), blendType="easeInOut")
        interval2 = self.boutonCombattre.scaleInterval(0.7, Point3(1, 1, 1), blendType="easeInOut")
        
        self.sequenceBouton = Sequence(interval1,interval2,name="sequenceBouton")
        self.sequenceBouton.loop()

    def affichageCombat(self, mapId):
        self.sequenceBouton.finish()
        self.boutonCombattre.hide()
        self.Parallel.start()
        self.labelVs = DirectLabel(text = self.nomCalcule1 + " VS " + self.nomCalcule2,frameColor=(1,0,0,1), text_scale=0.07, pos=(0, 0.0, - 0.7 -  self.verticalOffsetControlButton +  self.verticalOffsetCenterControlButton), frameSize = (-1.0,1.0, -0.020, 0.065), scale=(6,6,6))
        rapetisseLabel =  self.labelVs.scaleInterval(1, Point3(1, 1, 1), blendType="easeInOut")
        delai = Wait(3.5)
        self.sequenceNomVS = Sequence(rapetisseLabel, delai,  Func(self.loadGame,mapId), name="sequenceNom")
        self.sequenceNomVS.start()


    def createItemButtonNiveau(self, mapName, mapId):
            return DirectButton(
                    text = mapName,
                    text_scale = self.controlTextScale, 
                    borderWidth = self.controlBorderWidth, 
                    relief = 1,
                    frameSize = (-1.0, 1.0, -0.0425, 0.085),
                    command = lambda: self.AuthentificationJoueur(mapId))

    def createAllItemsNiveau(self, mapsInfo):
        scrollItemButtons = []#self.createItemButtonNiveau(u'-> Carte aléatoire <-', None)]
        for mapInfo in mapsInfo:
            scrollItemButtons.append(self.createItemButtonNiveau(self.formatText(mapInfo[0]), mapInfo[1]))
        return scrollItemButtons

    def formatText(self, text, maxLength = 20):
        return text if len(text) <= maxLength else text[0:maxLength] + '...'

    def loadGame(self, mapId):
        # À ajuster... évidemment...
        self.dao_joueur.deconnection()
        self.chargeJeuNiveau(mapId)
Exemple #7
0
class MenuLogin(ShowBase):
	def __init__(self, gameLogic,mapID,mapName):
		self.gameLogic = gameLogic
		self.mapID = mapID
		self.mapName = mapName
		self.user = common.internal.UtilisateursDAODTO.DAOutilisateur.DAOutilisateur()
		self.wait = True
		#Image d'arrière plan
		self.background=OnscreenImage(parent=render2d, image="../asset/Menu/BackgroundLogin.jpg")

		#On dit à la caméra que le dernier modèle doit s'afficher toujours en arrière
		self.baseSort = base.cam.node().getDisplayRegion(0).getSort()
		base.cam.node().getDisplayRegion(0).setSort(20)

		#Variables utiles
		btnScale = (0.06,0.06)
		text_scale = 0.12
		borderW = (0.02, 0.02)
		separation = 1
		hauteur = -0.6
		numItemsVisible = 50
		self.couleurBack = (0.243,0.325,0.321,1)
		self.player1ready = False
		self.player2ready = False
		self.player1Infos = ""
		self.player2Infos = ""
		self.couleurDisabled = (0.343,0.325,0.321,1)
		self.couleurBGLabel = (255,255,255,0.3)
		self.couleurShadow = (200,200,200,0.8)
		self.couleurFG = (0,0,0,1)
		self.joueur1 = ""
		self.joueur2 = ""
		self.username1 = ""
		self.username2 = ""
		self.p1Logged = False
		self.p2Logged = False
		#Titre du jeu
		base.disableMouse()
		
		

		# fields dans lesquels on peut écrire
		self.fieldUsername1 = DirectEntry(text = "" ,scale=.05,
									initialText="", 
									numLines = 1,
									focus=1,
									pos=(-4,0,0.82) )
		self.fieldUsername2 = DirectEntry(text = "" ,scale=.05,
									initialText="", 
									numLines = 1,
									focus=0,
									pos=(3.4,0,0.82) )
		self.fieldPassword1 = DirectEntry(text = "" ,scale=.05,
									initialText="", 
									numLines = 1,
									focus=0,
									pos=(-4,0,0.59),
									obscured=1 )
		self.fieldPassword2 = DirectEntry(text = "" ,scale=.05,
									initialText="", 
									numLines = 1,
									focus=0,
									pos=(3.4,0,0.59),
									obscured=1 )
		self.messageBox = DirectEntry(text = "" ,scale=.05,
									width =55,
									initialText="Veuillez vous connecter à Tank'em", 
									numLines = 1,
									focus=0,
									pos=(-10.35,0,0.3),
									focusInCommand=self.clearText )
		
		# Labels et fields qui doivent subir des lerps
		# textnotes / notes aspect2d sont beaucoup plus sympatoches à travailler.
		self.textLabel1 = TextNode('testLabel1')
		self.textLabel1.setText("Player1")
		self.textLabel1.setTextColor(0,0,0,1)
		self.textLabel1.setShadow(0.05,0.05)
		self.textLabel1.setShadowColor(self.couleurShadow)
		self.textLabel1.setCardColor(self.couleurBGLabel)
		self.textLabel1.setCardAsMargin(0, 0, 0, 0)
		self.textLabel1.setCardDecal(True)
		self.textLabel1.setAlign(TextNode.ACenter)
		self.nodeLabel1 = aspect2d.attachNewNode(self.textLabel1)
		self.nodeLabel1.setScale(0.10)
		self.nodeLabel1.setPos(-3.75,0,0.9)

		self.textLabel2 = TextNode('textLabel2')
		self.textLabel2.setText("Player2")
		self.textLabel2.setTextColor(0,0,0,1)
		self.textLabel2.setShadow(0.05,0.05)
		self.textLabel2.setShadowColor(self.couleurShadow)
		self.textLabel2.setCardColor(self.couleurBGLabel)
		self.textLabel2.setCardAsMargin(0, 0, 0, 0)
		self.textLabel2.setCardDecal(True)
		self.textLabel2.setAlign(TextNode.ACenter)
		self.nodeLabel2 = aspect2d.attachNewNode(self.textLabel2)
		self.nodeLabel2.setScale(0.10)
		self.nodeLabel2.setPos(3.65,0,0.9)

		self.textPassword1 = TextNode('textPassword1')
		self.textPassword1.setText("Password")
		self.textPassword1.setTextColor(0,0,0,1)
		self.textPassword1.setShadow(0.05,0.05)
		self.textPassword1.setShadowColor(self.couleurShadow)
		self.textPassword1.setCardColor(self.couleurBGLabel)
		self.textPassword1.setCardAsMargin(0, 0, 0, 0)
		self.textPassword1.setCardDecal(True)
		self.textPassword1.setAlign(TextNode.ACenter)
		self.nodePassword1 = aspect2d.attachNewNode(self.textPassword1)
		self.nodePassword1.setScale(0.10)
		self.nodePassword1.setPos(-3.75,0,0.67)

		self.textPassword2 = TextNode('textPassword2')
		self.textPassword2.setText("Password")
		self.textPassword2.setTextColor(0,0,0,1)
		self.textPassword2.setShadow(0.05,0.05)
		self.textPassword2.setShadowColor(self.couleurShadow)
		self.textPassword2.setCardColor(self.couleurBGLabel)
		self.textPassword2.setCardAsMargin(0, 0, 0, 0)
		self.textPassword2.setCardDecal(True)
		self.textPassword2.setAlign(TextNode.ACenter)
		self.nodePassword2 = aspect2d.attachNewNode(self.textPassword2)
		self.nodePassword2.setScale(0.10)
		self.nodePassword2.setPos(3.65,0,0.67)

		self.textMessagebox = TextNode('textMessagebox')
		self.textMessagebox.setText("Message box")
		self.textMessagebox.setTextColor(0,0,0,1)
		self.textMessagebox.setShadow(0.05,0.05)
		self.textMessagebox.setShadowColor(self.couleurShadow)
		self.textMessagebox.setCardColor(self.couleurBGLabel)
		self.textMessagebox.setCardAsMargin(0, 0, 0, 0)
		self.textMessagebox.setCardDecal(True)
		self.textMessagebox.setAlign(TextNode.ACenter)
		self.nodeMessagebox = aspect2d.attachNewNode(self.textMessagebox)
		self.nodeMessagebox.setScale(0.10)
		self.nodeMessagebox.setPos(-3.05,0,0.4)

		self.textJoueur1 = TextNode('textJoueur1')
		self.textJoueur1.setText("")
		self.textJoueur1.setTextColor(0,0,0,1)
		self.textJoueur1.setShadow(0.05,0.05)
		self.textJoueur1.setShadowColor(self.couleurShadow)
		self.textJoueur1.setCardColor(self.couleurBGLabel)
		self.textJoueur1.setCardAsMargin(0, 0, 0, 0)
		self.textJoueur1.setCardDecal(True)
		self.textJoueur1.setAlign(TextNode.ACenter)
		self.nodeJoueur1 = aspect2d.attachNewNode(self.textJoueur1)
		self.nodeJoueur1.setScale(0)
		self.nodeJoueur1.setPos(0.014,0,0.1)

		self.textJoueur2 = TextNode('textJoueur2')
		self.textJoueur2.setText("")
		self.textJoueur2.setTextColor(0,0,0,1)
		self.textJoueur2.setShadow(0.05,0.05)
		self.textJoueur2.setShadowColor(self.couleurShadow)
		self.textJoueur2.setCardColor(self.couleurBGLabel)
		self.textJoueur2.setCardAsMargin(0, 0, 0, 0)
		self.textJoueur2.setCardDecal(True)
		self.textJoueur2.setAlign(TextNode.ACenter)
		self.nodeJoueur2 = aspect2d.attachNewNode(self.textJoueur2)
		self.nodeJoueur2.setScale(0)
		self.nodeJoueur2.setPos(0.014,0,-0.3)

		self.textVersus = TextNode('textVersus')
		self.textVersus.setText("VERSUS")
		self.textVersus.setTextColor(0,0,0,1)
		self.textVersus.setShadow(0.05,0.05)
		self.textVersus.setShadowColor(self.couleurShadow)
		self.textVersus.setCardColor(self.couleurBGLabel)
		self.textVersus.setCardAsMargin(0, 0, 0, 0)
		self.textVersus.setCardDecal(True)
		self.textVersus.setAlign(TextNode.ACenter)
		self.nodeVersus = aspect2d.attachNewNode(self.textVersus)
		self.nodeVersus.setScale(0)
		self.nodeVersus.setPos(0.014,0,-0.1)

		self.textCombattre = TextNode('textCombattre')
		self.textCombattre.setText("Combattrons dans l'arène :")
		self.textCombattre.setTextColor(0,0,0,1)
		self.textCombattre.setShadow(0.05,0.05)
		self.textCombattre.setShadowColor(self.couleurShadow)
		self.textCombattre.setCardColor(self.couleurBGLabel)
		self.textCombattre.setCardAsMargin(0, 0, 0, 0)
		self.textCombattre.setCardDecal(True)
		self.textCombattre.setAlign(TextNode.ACenter)
		self.nodeCombattre = aspect2d.attachNewNode(self.textCombattre)
		self.nodeCombattre.setScale(0)
		self.nodeCombattre.setPos(0.014,0,-0.5)

		self.textFavoris = TextNode('textFavoris')
		self.textFavoris.setText("")
		self.textFavoris.setTextColor(0,0,0,1)
		self.textFavoris.setShadow(0.05,0.05)
		self.textFavoris.setShadowColor(self.couleurShadow)
		self.textFavoris.setCardColor(self.couleurBGLabel)
		self.textFavoris.setCardAsMargin(0, 0, 0, 0)
		self.textFavoris.setCardDecal(True)
		self.textFavoris.setAlign(TextNode.ACenter)
		self.nodeFavoris = aspect2d.attachNewNode(self.textFavoris)
		self.nodeFavoris.setScale(0)
		self.nodeFavoris.setPos(0.014,0,-0.9)

		self.textNiveau = TextNode('textNiveau')
		self.textNiveau.setText("")
		self.textNiveau.setTextColor(0,0,0,1)
		self.textNiveau.setShadow(0.05,0.05)
		self.textNiveau.setShadowColor(self.couleurShadow)
		self.textNiveau.setCardColor(self.couleurBGLabel)
		self.textNiveau.setCardAsMargin(0, 0, 0, 0)
		self.textNiveau.setCardDecal(True)
		self.textNiveau.setAlign(TextNode.ACenter)
		self.nodeNiveau = aspect2d.attachNewNode(self.textNiveau)
		self.nodeNiveau.setScale(0)
		self.nodeNiveau.setPos(0.014,0,-0.7)
		
		# Bouttons nécéssaires.
		self.loginP1 = DirectButton(text = ("Login", "Login", "Login", "Login"),
						  text_scale=btnScale,
						  borderWidth = borderW,
						  text_bg=self.couleurBack,
						  frameColor=self.couleurBack,
						  relief=2,
						  textMayChange = 1,
						  pad = (0,0),
						  command = self.setPlayerReady,
						  extraArgs = [True,1],
						  pos = (-3.75,0,0.45))
		self.loginP2 = DirectButton(text = ("Login", "Login", "Login", "Login"),
						  text_scale=btnScale,
						  borderWidth = borderW,
						  text_bg=self.couleurBack,
						  frameColor=self.couleurBack,
						  relief=2,
						  textMayChange = 1,
						  pad = (0,0),
						  command = self.setPlayerReady,
						  extraArgs = [True,2],
						  pos = (3.65,0,0.45))
		self.buttonPlay = DirectButton(text = ("Play", "Play", "Play", "Play"),
						  text_scale=btnScale,
						  borderWidth = borderW,
						  text_bg=self.couleurDisabled,
						  frameColor=self.couleurDisabled,
						  relief=2,
						  textMayChange = 1,
						  pad = (0,0),
						  state = DGG.DISABLED,
						  command = self.setNiveauChoisi,
						  extraArgs = [self.mapID],
						  pos = (-3.05,0.4,0.67))

		self.buttonSite = DirectButton(text = ("Site internet de Tank'em", "Site internet de Tank'em", "Site internet de Tank'em", "Site internet de Tank'em"),
						  text_scale=btnScale,
						  borderWidth = borderW,
						  text_bg=self.couleurBack,
						  frameColor=self.couleurBack,
						  relief=2,
						  textMayChange = 1,
						  pad = (0,0),
						  command = self.openSite,
						  pos = (1.25,-1.4,-0.9))
	
		self.loginIntro()

		#Ici on call le modèle des tanks et commence l'interval pour les faire tourner en rond
		#Tank1
		self.tankGauche = loader.loadModel("../asset/Tank/tank")		
		self.tankGauche.reparentTo(render)
		self.tankGauche.setPos(-46.5,65,-10)
		self.tankGauche.setScale(6.005,6.005,6.005)
		self.tankGauche.setHpr(180, 0.0, 0.0)
		interval = self.tankGauche.hprInterval(4.0, Vec3(-180, 0, 0))
		self.sequenceTourne = Sequence(interval)
		self.sequenceTourne.loop()
		
		#Tank2
		self.tankDroite = loader.loadModel("../asset/Tank/tank")		
		self.tankDroite.reparentTo(render)
		self.tankDroite.setPos(46.5,65,-10)
		self.tankDroite.setScale(6.005,6.005,6.005)
		self.tankDroite.setHpr(180, 0.0, 0.0)
		interval2 = self.tankDroite.hprInterval(4.0, Vec3(540, 0, 0))
		self.sequenceTourne2 = Sequence(interval2)
		self.sequenceTourne2.loop()

		

		#Initialisation de l'effet de transition
		curtain = loader.loadTexture("../asset/Menu/load.png")

		self.transition = Transitions(loader)
		self.transition.setFadeColor(0, 0, 0)
		self.transition.setFadeModel(curtain)

		self.sound = loader.loadSfx("../asset/Menu/shotgun.mp3")
		#Pour ouvrir le site internet de Tank'Em
	def openSite(self):
		webbrowser.open_new("http://localhost/Tank'em%20Web/index.php")

		#Intro initial des labels quand on accède a la page de login
	def loginIntro(self):
		self.sequence = Sequence (LerpPosInterval(self.nodeLabel1,1,(-0.75,0,0.9),blendType="easeIn"))
		self.sequence2 = Sequence (LerpPosInterval(self.fieldUsername1,1,(-1,0,0.82),blendType="easeIn"))
		self.sequence3 = Sequence (LerpPosInterval(self.fieldUsername2,1,(0.4,0,0.82),blendType="easeIn"))
		self.sequence4 = Sequence (LerpPosInterval(self.nodeLabel2,1,(0.65,0,0.9),blendType="easeIn"))
		self.sequence5 = Sequence (LerpPosInterval(self.nodePassword1,1,(-0.75,0,0.67),blendType="easeIn"))
		self.sequence13 = Sequence (LerpPosInterval(self.nodeMessagebox,1,(-0.05,0,0.4),blendType="easeIn"))
		self.sequence6 = Sequence (LerpPosInterval(self.nodePassword2,1,(0.65,0,0.67),blendType="easeIn"))
		self.sequence7 = Sequence (LerpPosInterval(self.fieldPassword1,1,(-1,0,0.59),blendType="easeIn"))
		self.sequence8 = Sequence (LerpPosInterval(self.fieldPassword2,1,(0.4,0,0.59),blendType="easeIn"))
		self.sequence9 = Sequence (LerpPosInterval(self.messageBox,1,(-1.35,0,0.3),blendType="easeIn"))
		self.sequence10 = Sequence (LerpPosInterval(self.loginP1,1,(-0.75,0,0.45),blendType="easeIn"))	
		self.sequence11 = Sequence (LerpPosInterval(self.loginP2,1,(0.65,0,0.45),blendType="easeIn"))	
		self.sequence12 = Sequence (LerpPosInterval(self.buttonPlay,1,(-0.05,0.4,0.67),blendType="easeIn"))	
		self.sequence.start()
		self.sequence4.start()
		self.sequence2.start()	  
		self.sequence3.start()	 
		self.sequence5.start()	 
		self.sequence6.start()	 
		self.sequence7.start()	 
		self.sequence8.start()	 
		self.sequence13.start()	 
		self.sequence9.start()
		self.sequence10.start()	 
		self.sequence11.start()	 
		self.sequence12.start()	 

		#Outro des logins
	def loginOutro(self):
		self.sequence = Sequence (LerpPosInterval(self.nodeLabel1,1,(-3.75,0,0.9),blendType="easeOut"))
		self.sequence2 = Sequence (LerpPosInterval(self.fieldUsername1,1,(-4,0,0.82),blendType="easeOut"))
		self.sequence3 = Sequence (LerpPosInterval(self.fieldUsername2,1,(3.4,0,0.82),blendType="easeOut"))
		self.sequence4 = Sequence (LerpPosInterval(self.nodeLabel2,1,(3.65,0,0.9),blendType="easeOut"))
		self.sequence5 = Sequence (LerpPosInterval(self.nodePassword1,1,(-3.75,0,0.67),blendType="easeOut"))
		self.sequence13 = Sequence (LerpPosInterval(self.nodeMessagebox,1,(-3.05,0,0.4),blendType="easeOut"))
		self.sequence6 = Sequence (LerpPosInterval(self.nodePassword2,1,(3.65,0,0.67),blendType="easeOut"))
		self.sequence7 = Sequence (LerpPosInterval(self.fieldPassword1,1,(-4,0,0.59),blendType="easeOut"))
		self.sequence8 = Sequence (LerpPosInterval(self.fieldPassword2,1,(3.4,0,0.59),blendType="easeOut"))
		self.sequence9 = Sequence (LerpPosInterval(self.messageBox,1,(-5.35,0,0.3),blendType="easeOut"))
		self.sequence10 = Sequence (LerpPosInterval(self.loginP1,1,(-3.75,0,0.45),blendType="easeOut"))	
		self.sequence11 = Sequence (LerpPosInterval(self.loginP2,1,(3.65,0,0.45),blendType="easeOut"))	
		self.sequence.start()
		self.sequence4.start()
		self.sequence2.start()	  
		self.sequence3.start()	 
		self.sequence5.start()	 
		self.sequence6.start()	 
		self.sequence7.start()	 
		self.sequence8.start()	 
		self.sequence13.start()	 
		self.sequence9.start()
		self.sequence10.start()	 
		self.sequence11.start()

		#Quand on se login, dépendant de la direction, le tank gauche ou droite apparait. (Gauche = P1, Droite = P2)
	def tankIntro(self,direction):
		if direction == "gauche" :
			self.sequence = Sequence (LerpPosInterval(self.tankGauche,2,(-17.5,65,-10)))
			self.color1 = self.hex_to_rgb(self.joueur1.couleurTank)
			self.tankGauche.setColorScale(self.color1[0]/255.0,self.color1[1]/255.0,self.color1[2]/255.0,1)
		if direction == "droite" :
			self.sequence = Sequence (LerpPosInterval(self.tankDroite,2,(17.5,65,-10)))
			self.color2 = self.hex_to_rgb(self.joueur2.couleurTank)
			self.tankDroite.setColorScale(self.color2[0]/255.0,self.color2[1]/255.0,self.color2[2]/255.0,1)

		self.sequence.start()
		#Faire apparaitre le text quand les eux players sont loggent in 
	def lerpText(self) :
		self.sequence = Sequence (LerpScaleInterval(self.nodeJoueur1, 0.7, 0.08, 0),
								  LerpScaleInterval(self.nodeVersus, 0.7, 0.08, 0),
								  LerpScaleInterval(self.nodeJoueur2, 0.7, 0.08, 0),
								  LerpScaleInterval(self.nodeCombattre, 0.7, 0.08, 0),
								  LerpScaleInterval(self.nodeNiveau, 0.7, 0.08, 0),
								  LerpScaleInterval(self.nodeFavoris,0.7, 0.08,0))
		self.sequence.start()

		#Changer la valeur d'une couleur en quelque chose que Panda3d aime.
	def hex_to_rgb(self,value):
		value = value.lstrip('#')
		lv = len(value)
		if lv == 1:
			v = int(value, 16)*17
			return v, v, v
		if lv == 3:
			return tuple(int(value[i:i+1], 16)*17 for i in range(0, 3))
		return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))

		#Opérations à faire quand les joueurs sont loggés.
	def setPlayerReady(self,state,num):
		if num == 1 : 
			self.username1 = self.fieldUsername1.get()
			self.password1 = self.fieldPassword1.get()
			if self.username1.lower() != self.username2.lower() : 
				self.joueur1 = self.user.read(self.username1,self.password1)
				self.p1Logged = True
				
		if num == 2 :
			self.username2 = self.fieldUsername2.get()
			self.password2 = self.fieldPassword2.get()
			if self.username2.lower() != self.username1.lower() :
				self.joueur2 = self.user.read(self.username2,self.password2)
				self.p2Logged = True

		if self.joueur1 == 1 or self.joueur2 == 1 :
			self.setText("Mauvais nom d'utilisateur")
		elif self.joueur1 == 0 or self.joueur2 == 0 : 
			self.setText("Mauvais mot de passe")
		else :
			if num == 1 :
				if self.p1Logged :
					self.player1ready = state
					self.player1Infos = self.joueur1
					self.loginP1['state'] = DGG.DISABLED
					self.loginP1['frameColor'] = self.couleurDisabled
					self.loginP1['text_bg'] = self.couleurDisabled
					self.gameLogic.idJoueur1 = self.joueur1.idJoueur
					self.tankIntro("gauche")
			if num == 2 :
				if self.p2Logged :
					self.player2ready = state
					self.player2Infos = self.joueur2
					self.loginP2['state'] = DGG.DISABLED
					self.loginP2['frameColor'] = self.couleurDisabled
					self.loginP2['text_bg'] = self.couleurDisabled
					self.gameLogic.idJoueur2 = self.joueur2.idJoueur
					self.tankIntro("droite")
			if self.player1ready == True and self.player2ready == True :
				self.setText("Welcome to Tank'em !")
				self.buttonPlay['state'] = DGG.NORMAL
				self.buttonPlay['frameColor'] = self.couleurBack
				self.buttonPlay['text_bg'] = self.couleurBack

				self.calcJoueur1 = self.calculateName(self.joueur1)
				self.calcJoueur2 = self.calculateName(self.joueur2)
				self.textJoueur1.setText(self.username1 + " " + self.calcJoueur1)
				self.textJoueur2.setText(self.username2 + " " + self.calcJoueur2)
				if self.joueur1.niveau > self.joueur2.niveau :
					self.favoris = self.username1
					self.textFavoris.setText(self.favoris + " est le favoris !")
				elif self.joueur2.niveau > self.joueur1.niveau:
					self.favoris = self.username2
					self.textFavoris.setText(self.favoris + " est le favoris !")
				else :
					self.favoris = "personne n'est le favoris !"
					self.textFavoris.setText(self.favoris)
				self.textNiveau.setText(self.mapName)
			
				self.lerpText()
				self.loginOutro()

			elif self.player1ready :
				if self.p1Logged and (self.username1.lower() == self.username2.lower()):
					self.setText("Cet utilisateur est déjà logged in")
				else :
					self.setText('Player 2 must also login')
			elif self.player2ready :
				if self.p2Logged and (self.username1.lower() == self.username2.lower()):
					self.setText("Cet utilisateur est déjà logged in")
				else :
					self.setText('Player 1 must also login')
			else :
				self.setText('Both players must login')
	
		#retourne le joueur 1 et le joueur 2.
	def getPlayer1(self):
		return self.joueur1
	def getPlayer2(self):
		return self.joueur2

		#pour set le text des labels
	def setText(self,textEntered):
		self.messageBox.enterText(textEntered)
	
		#clear le text des labels
	def clearText(self):
		self.messageBox.enterText('')

		#Sert à cacher le reste des bouttons et tanks lorsqu'on commence le jeu
	def cacher(self):
			self.tankGauche.removeNode()
			self.tankDroite.removeNode()
			loader.unloadModel( "../asset/Tank/tank" )
			
			base.cam.node().getDisplayRegion(0).setSort(self.baseSort)

			self.background.hide()
			self.loginP1.hide()
			self.loginP2.hide()
			self.buttonPlay.hide()
			self.buttonSite.hide()
			self.fieldUsername1.hide()
			self.fieldUsername2.hide()
			self.fieldPassword1.hide()
			self.fieldPassword2.hide()
			self.messageBox.hide()
			self.nodeLabel1.hide()
			self.nodePassword1.hide()
			self.nodeLabel2.hide()
			self.nodePassword2.hide()
			self.nodeMessagebox.hide()
			self.nodeJoueur1.hide()
			self.nodeJoueur2.hide()
			self.nodeCombattre.hide()
			self.nodeNiveau.hide()
			self.nodeVersus.hide()
			# self.nodeFavoris.hide()
		#Ici, on set l'ID du niveau dans gameLogic ainsi que les joueurs qui participent.
	def setNiveauChoisi(self,idNiveau):
			self.gameLogic.setIdNiveau(idNiveau)
			self.gameLogic.setPlayers([self.player1Infos, self.player2Infos])
			self.startGame()
		
		#Animation pré-partie des tanks ainsi que le début de la partie dans self.chargeJeu appelé dans intervalPos2.
	def startGame(self):
		#Tank1
		self.sequenceTourne.finish()

		self.intervalPos = Sequence (self.tankGauche.hprInterval(0.75, Vec3(-90, 0, 0)),
									 LerpPosInterval(self.tankGauche,0.35,(-5,65,-10)),
									 LerpPosHprInterval(self.tankGauche, 0.75, (-50,65,20), Vec3(430,50,370)))
		self.intervalPos.start()
		#Tank2
		self.sequenceTourne2.finish()

		self.intervalPos2 = Sequence (self.tankDroite.hprInterval(0.75,Vec3(450,0,0)),
									  LerpPosInterval(self.tankDroite,0.35,(5,65,-10)),
									  LerpPosHprInterval(self.tankDroite, 0.75,(50,65,20), Vec3(430,50,370)),
									  Func(self.chargeJeu))
		self.intervalPos2.start()
		
		
		#Séquence qui cache les éléments et fait la transition du login -> loading -> jeu.
	def chargeJeu(self):
			#On démarre!
			Sequence(Func(self.cacher),
					 Func(lambda : self.transition.irisOut(0.2)),
					 SoundInterval(self.sound),
					 Func(lambda : messenger.send("DemarrerPartie")),
					 Wait(0.2), #Bug étrange quand on met pas ça. L'effet de transition doit lagger
					 Func(lambda : self.transition.irisIn(0.2))
			).start()

		#Sert à calculer le nom composé du joueur selon ses states
	def calculateName(self, joueur):
		self.statsJoueur = joueur.getStats()

		self.bestStat1 = [[0, -1]] #Un array d'arrays contenant deux infos: le nb de points et l'index number
		self.bestStat2 = [[0, -1]]
		self.qualificatifA = ""
		self.qualificatifB = ""
		self.maxStat = 30 #Le stat maximum

		#Si tous les stats sont au maximum
		if(self.statsJoueur[0] == self.maxStat and self.statsJoueur[1] == self.maxStat and self.statsJoueur[2] == self.maxStat and self.statsJoueur[3] == self.maxStat):
			return "dominateur"

		#Regarde chacun des stats du joueur et détermine ce qui est le plus grand
		for idx,stat in enumerate(self.statsJoueur):
			if(stat > self.bestStat1[0][0]): #S'il y a un stat plus grand que le bestStat, on restart le bestStats avec le nouveau stat
				self.bestStat1 = []
				self.bestStat1.append([stat,idx])
			elif(stat == self.bestStat1[0][0] and stat > 0): #S'il y a un stat égal au bestStat, on rajoute les infos dan's 
				self.bestStat1.append([stat,idx])
		self.bestStat1 = random.choice(self.bestStat1)


		for idx,stat in enumerate(self.statsJoueur):
			if(idx != self.bestStat1[1]):
				if(stat > self.bestStat2[0][0]):
					self.bestStat2 = []
					self.bestStat2.append([stat,idx])
				elif(stat == self.bestStat2[0][0] and stat > 0):
					self.bestStat2.append([stat,idx])
		self.bestStat2 = random.choice(self.bestStat2)

		#Série de ifs pour déterminer le nom composé du joueur
		if(self.bestStat1[1] == 0):
			if(self.bestStat1[0] >= 1):
				self.qualificatifA = "le fougeux"
			if(self.bestStat1[0] >= 5):
				self.qualificatifA = "le pétulant"
			if(self.bestStat1[0] >= 10):
				self.qualificatifA = "l'immortel"
		elif(self.bestStat1[1] == 1):
			if(self.bestStat1[0] >= 1):
				self.qualificatifA = "le crossfiter"
			if(self.bestStat1[0] >= 5):
				self.qualificatifA = "le hulk"
			if(self.bestStat1[0] >= 10):
				self.qualificatifA = "le tout puissant"
		elif(self.bestStat1[1] == 2):
			if(self.bestStat1[0] >= 1):
				self.qualificatifA = "le prompt"
			if(self.bestStat1[0] >= 5):
				self.qualificatifA = "le lynx"
			if(self.bestStat1[0] >= 10):
				self.qualificatifA = "le foudroyant"
		elif(self.bestStat1[1] == 3):
			if(self.bestStat1[0] >= 1):
				self.qualificatifA = "le précis"
			if(self.bestStat1[0] >= 5):
				self.qualificatifA = "l'habile"
			if(self.bestStat1[0] >= 10):
				self.qualificatifA = "le chirurgien"
		
		if(self.bestStat2[1] == 0):
			if(self.bestStat2[0] >= 1):
				self.qualificatifB = "fougeux"
			if(self.bestStat2[0] >= 5):
				self.qualificatifB = "pétulant"
			if(self.bestStat2[0] >= 10):
				self.qualificatifB = "immortel"
		elif(self.bestStat2[1] == 1):
			if(self.bestStat2[0] >= 1):
				self.qualificatifB = "qui fait du crossfit"
			if(self.bestStat2[0] >= 5):
				self.qualificatifB = "brutal"
			if(self.bestStat2[0] >= 10):
				self.qualificatifB = "tout puissant"
		elif(self.bestStat2[1] == 2):
			if(self.bestStat2[0] >= 1):
				self.qualificatifB = "prompt"
			if(self.bestStat2[0] >= 5):
				self.qualificatifB = "lynx"
			if(self.bestStat2[0] >= 10):
				self.qualificatifB = "foudroyant"
		elif(self.bestStat2[1] == 3):
			if(self.bestStat2[0] >= 1):
				self.qualificatifB = "précis"
			if(self.bestStat2[0] >= 5):
				self.qualificatifB = "habile"
			if(self.bestStat2[0] >= 10):
				self.qualificatifB = "chirurgien"
		#on retourne le nom composé.
		return self.qualificatifA + " " + self.qualificatifB