async def get_hit(self, bullet_type=None): if not self.root: return self.hp -= 1 if self.hp < 0: # Score gain flies off. scale = math.sqrt(self.score_gain) / 25.0 base.add_score(self.score_gain) text = OnscreenText(str(self.score_gain), font=base.gui.font, parent=base.render, scale=scale, fg=(1, 1, 1, 1)) text.set_light_off(True) text.set_z(10) text.set_pos(self.root.get_pos()) text.set_depth_test(False) dir = base.player.root.get_x() - self.root.get_x() if dir == 0: dir = choice((-1, 1)) if dir < 5: dir *= 5 / abs(dir) text.posInterval( 1.0, self.root.get_pos() + (-dir, base.player.speed.y * 0.6, 0)).start() text.scaleInterval(1.0, scale * 2).start() text.set_transparency(1) Sequence(Wait(0.25), text.colorScaleInterval(0.75, (1, 0, 0, 0))).start() self.die() else: self.root.set_color_scale((1, 0, 0, 1)) await WaitInterval(0.1) if self.root: self.root.clear_color_scale()
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...")
def enterSingleplayer(self): helper.hide_cursor() self.musicGame.play() self.world = World() self.player = Player() self.player.setPos(self.world.getStartPos(1)) self.player.setTeam("Yellow") self.player.setColor(LPoint3f(1, 1, 0)) #self.player.setSpectator(self.world.getSpectatorNode()) # create non player characters self.npcs = [] for i in range(self.numNPCs): self.npcs.append(NPC()) self.npcs[i].setPos(self.world.getStartPos(i+2)) self.npcs[i].setBunker(self.world.getBunker()) if i < self.numNPCs/2: self.npcs[i].setTeam("Yellow") self.npcs[i].setColor(LPoint3f(1, 1, 0)) else: self.npcs[i].setTeam("Blue") self.npcs[i].setColor(LPoint3f(0, 0, 1)) for i in range(self.numNPCs): el = [] if self.npcs[i].playerTeam != self.player.playerTeam: el.append(self.player) for j in range(self.numNPCs): if self.npcs[i].playerTeam != self.npcs[j].playerTeam: el.append(self.npcs[j]) self.npcs[i].setEnemies(el) number = OnscreenText( text = "", scale = 0.75, pos = (0, -0.1875), fg = (1,1,1,1), align = TextNode.ACenter) def startSingleplayer(): number.destroy() self.world.run() self.player.run() for npc in self.npcs: npc.run() taskMgr.add(self.checkGameOver, "checkGameOver") def setNumber(num): number["text"] = str(num) number["scale"] = 0.75 inter = number.scaleInterval(1.0, 0) # setup a sequence that will count down for us self.countdownSeq = Sequence( Func(setNumber, 3), inter, Func(setNumber, 2), inter, Func(setNumber, 1), inter, Func(setNumber, "GO"), inter, Func(startSingleplayer)) self.countdownSeq.start()
class InterfaceMenuAuthentification(ShowBase): def __init__(self, unDTOUsers): self.accept("AllerAuthentification", self.ouvrirMenu) self.unDTOUsers = unDTOUsers self.baseSort = base.cam.node().getDisplayRegion(0).getSort() base.cam.node().getDisplayRegion(0).setSort(20) #Strings contenant des textes self.message1 = "Attente de la connexion du joueur 1." self.message2 = "Attente de la connexion du joueur 2." self.username1 = "" self.username2 = "" self.modele1 = None self.modele2 = None self.arreterDecoration = False #Liste contenant les direct widgets pour facilité le hide self.listeCheckBox1 = [] self.listeCheckBoxSec1 = [] self.listeNomArmes = [] self.listeNbArmes = [] self.listeTotalNbArmes1 = [0, 0, 0, 0, 0, 0] self.choixPrim1 = [1] self.choixSec1 = [0] self.isReader1 = False self.listeCheckBox2 = [] self.listeCheckBoxSec2 = [] self.listeNomArmes2 = [] self.listeNbArmes2 = [] self.listeTotalNbArmes2 = [0, 0, 0, 0, 0, 0] self.choixPrim2 = [1] self.choixSec2 = [0] self.isReader2 = False self.labelJoueur1 = [] self.labelJoueur2 = [] self.unDTOMap = self.setupMap() def ouvrirMenu(self): btnScale = (0.18, 0.18) text_scale = 0.12 borderW = (0.04, 0.04) couleurBack = (1, 1, 1, 1) separation = 0.5 hauteur = -0.6 #Label pour les login self.textJoueur1 = OnscreenText(text="Joueur1", pos=(-1.3, .7), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.textJoueur2 = OnscreenText(text="Joueur2", pos=(0.8, 0.7), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.textMdp1 = OnscreenText(text="Password1", pos=(-1.3, .5), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.textMdp2 = OnscreenText(text="Password2", pos=(0.8, 0.5), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) #Ajouter les champs self.champNom1 = DirectEntry(text="", scale=.05, numLines=2, focus=1, pos=(-1, 0, 0.75), initialText="Joueur1") self.champMdp1 = DirectEntry(text="", scale=.05, numLines=2, focus=1, pos=(-1, 0, 0.55), initialText="AAAaaa111", obscured=1) self.champNom2 = DirectEntry(text="", scale=.05, numLines=2, focus=1, pos=(1, 0, 0.75), initialText="Joueur2") self.champMdp2 = DirectEntry(text="", scale=.05, numLines=2, focus=1, pos=(1, 0, 0.55), initialText="AAAaaa111", obscured=1) self.messageConnexion = DirectEntry(text="", scale=.05, numLines=2, width=50, focus=1, pos=(-1.3, 0, 0.89), initialText=self.message1 + "\n " + self.message2) #Ajouter les boutons self.boutonLogin1 = DirectButton(text=("Login J1!", "!", "!", "disabled"), text_scale=(0.1, 0.1), borderWidth=borderW, text_bg=couleurBack, frameColor=couleurBack, relief=2, command=lambda: self.connexion(1), pos=(-0.75, 0, 0.3)) self.boutonLogin2 = DirectButton(text=("Login J2!", "!", "!", "disabled"), text_scale=(0.1, 0.1), borderWidth=borderW, text_bg=couleurBack, frameColor=couleurBack, relief=2, command=lambda: self.connexion(2), pos=(1.25, 0, 0.3)) #Afficher les tanks self.afficherTank1(1) self.afficherTank2(2) #Un cadre pour rendre la page plus presentable self.deco = OnscreenText(text=" ", pos=(0, -0.3, -5), scale=5, mayChange=1, bg=(0.9, 0.9, 1, 1), frame=(0, 0, 0, 1)) #Bouton combattre. Sera cacher au debut self.boutonStart = DirectButton(text=("Combattre", "!", "!", "disabled"), text_scale=btnScale, borderWidth=borderW, text_bg=couleurBack, frameColor=couleurBack, command=self.appuyerCombattre, pos=(0, 0, -0.8)) self.boutonStart.hide() #Methode pour aller a la prochaine page def chargeMenuNiveaux(self): self.arreterDecoration = True self.hideWidgets2() #On démarre! listeInfoUsers = [ self.unDTOUsers, self.unDTOMap, self.username1, self.username2, self.chercherLesArmes() ] Sequence( Func(self.cacher), Func(lambda: messenger.send("AllerChoixNiveau", listeInfoUsers)) ).start() def connexion(self, noJoueur): #Vérification quel bouton a été appuyé if noJoueur == 1: #Vérifier que le user n'est pas déja connecté if self.username2 != self.champNom1.get(): if (self.unDTOUsers.siUsernameExiste(self.champNom1.get())): print self.champNom1.get() #Hashe le mot de passe salt = self.unDTOUsers.getMdpUser(self.champNom1.get()) reponseHashe = bcrypt.hashpw( self.champMdp1.get(), salt) #Passer le salt du premier mdp #Si le bon mot de passe... continuer if (reponseHashe == salt): self.message1 = "Le joueur 1 (" + self.champNom1.get( ) + ") est connecté!" self.username1 = self.champNom1.get() self.changerCouleurTank1() self.bougerTank1() self.listeArmes1 = self.unDTOUsers.getToutsArmesJoueur( self.unDTOUsers.getIdUser(self.username1)) for i in range(len(self.listeArmes1) - 1): self.listeTotalNbArmes1[i] = self.listeArmes1[i][1] self.afficherChoixArmes(1, 0) #Mauvais mot de passe else: self.message1 = "Erreur! Mauvais mot de passe pour le joueur 1..." #Username existe pas else: self.message1 = "Le username du joueur 1 n'existe pas!" #Déjà connecté else: self.message1 = "Erreur! Le joueur 2 est déjà connecté avec ce nom!" #Vérification quel bouton a été appuyé else: if self.username1 != self.champNom2.get(): if (self.unDTOUsers.siUsernameExiste(self.champNom2.get())): print self.champNom2.get() salt = self.unDTOUsers.getMdpUser(self.champNom2.get()) reponseHashe = bcrypt.hashpw( self.champMdp2.get(), salt) #Passer le salt du premier mdp if (reponseHashe == salt): self.message2 = "Le joueur 2 (" + self.champNom2.get( ) + ") est connecté!" self.username2 = self.champNom2.get() self.changerCouleurTank2() self.bougerTank2() self.listeArmes2 = self.unDTOUsers.getToutsArmesJoueur( self.unDTOUsers.getIdUser(self.username2)) for i in range(len(self.listeArmes2) - 1): self.listeTotalNbArmes2[i] = self.listeArmes2[i][1] self.afficherChoixArmes2(1, 0) else: self.message2 = "Erreur! Mauvais mot de passe pour le joueur 2..." else: self.message2 = "Le username du joueur 2 n'existe pas!" else: self.message2 = "Erreur! Le joueur 1 est déjà connecté avec ce nom!" self.messageConnexion.set(self.message1 + "\n " + self.message2) if self.username1 != "" and self.username2 != "": self.pretACombattre() 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.boutonStart.hide() def setupMap(self): leDTOMap = DTOMap() leDAOMap = DAOOracleMap() leDTOMap = leDAOMap.read() return leDTOMap def afficherTank1(self, couleur): # On charge le modèles self.modele1 = loader.loadModel("../asset/Tank/tank") #On réduit sa taille un peu... self.modele1.setScale(0.450, 0.450, 0.450) self.modele1.setPos(-7, 10, 0) #Pour l'animation self.modele1.reparentTo(render) dureeRot = 5 intervalRotation = self.modele1.hprInterval(dureeRot, (360, 0, 0)) self.sequ1 = Sequence(intervalRotation) self.sequ1.loop() def afficherTank2(self, couleur): # On charge le modèles self.modele2 = loader.loadModel("../asset/Tank/tank") #On réduit sa taille un peu... self.modele2.setScale(0.450, 0.450, 0.450) self.modele2.setPos(6, 10, 0) #On multiple la couleur de la texture du tank par ce facteur. Ça permet de modifier la couleur de la texture du tank self.modele2.setHpr(0, 0, 0) self.modele2.reparentTo(render) dureeRot = 5 intervalRotation = self.modele2.hprInterval(dureeRot, (-360, 0, 0)) self.sequ2 = Sequence(intervalRotation) self.sequ2.loop() #Faire bouger le tank quand le joueur se connecte def bougerTank1(self): posInit = (-7, 10, 0) self.modele1.setPos(posInit) duree = 1 intervalAvancer = self.modele1.posInterval(duree, (-1, 10, 0)) avancerTank = Sequence(intervalAvancer) avancerTank.start() def bougerTank2(self): posInit = (7, 10, 0) self.modele2.setPos(posInit) duree = 1 intervalAvancer = self.modele2.posInterval(duree, (1, 10, 0)) avancerTank = Sequence(intervalAvancer) avancerTank.start() def pretACombattre(self): self.boutonStart.show() testInterval = self.boutonStart.scaleInterval(2, (1.5, 1.5, 1.5), startScale=(0.5, 0.5, 0.5)) testInterval2 = self.boutonStart.scaleInterval(2, (0.5, 0.5, 0.5), startScale=(1.5, 1.5, 1.5)) self.seqBut = Sequence(testInterval, testInterval2) self.seqBut.loop() def appuyerCombattre(self): #Cacher les widgets et terminer l'animation qui tourne self.hideWidgets() self.sequ1.finish() self.sequ2.finish() self.seqBut.finish() dureeRot = 2 self.modele1.setHpr(0, 0, 0) self.modele2.setHpr(-270, 0, 0) intervalRotation = self.modele1.hprInterval(dureeRot, (270, 0, 0)) derniereRotation = Sequence(intervalRotation) derniereRotation.start() intervalRotation2 = self.modele2.hprInterval(dureeRot, (90, 0, 0)) derniereRotation2 = Sequence(intervalRotation2) derniereRotation2.start() #Faire afficher les noms self.labelTank1 = OnscreenText(text=self.username1, pos=(-0.7, -0.6), scale=0.2, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1, bg=(0.7, 0.8, 0, 1), frame=(0, 0, 0, 1)) self.labelTank2 = OnscreenText(text=self.username2, pos=(0.7, -0.6), scale=0.2, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1, bg=(0.7, 0.8, 0, 1), frame=(0, 0, 0, 1)) #Faire des animations testInterval = self.labelTank1.scaleInterval(2, (1.5, 1.5, 1.5), startScale=(0.5, 0.5, 0.5)) testInterval2 = self.labelTank1.scaleInterval(2, (0.5, 0.5, 0.5), startScale=(1.5, 1.5, 1.5)) self.seqTank1 = Sequence(testInterval, testInterval2) self.seqTank1.loop() testInterval = self.labelTank2.scaleInterval(2, (1.5, 1.5, 1.5), startScale=(0.5, 0.5, 0.5)) testInterval2 = self.labelTank2.scaleInterval(2, (0.5, 0.5, 0.5), startScale=(1.5, 1.5, 1.5)) self.seqTank2 = Sequence(testInterval, testInterval2) self.seqTank2.loop() self.labelVS1 = OnscreenText(text="V.S", pos=(0, -0.5), scale=0.2, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1, bg=(1, 0.2, 0.2, 1), frame=(0, 0, 0, 1)) self.labelVS2 = OnscreenText(text="V.S", pos=(0, -0.5), scale=0.2, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1, bg=(0.2, 0.2, 1, 1), frame=(0, 0, 0, 1)) labelVSInterval1 = self.labelVS1.hprInterval(2, (0, 0, 0), startHpr=(0, 0, 360)) labelVSInterval1.loop() labelVSInterval2 = self.labelVS2.hprInterval(2, (0, 0, 0), startHpr=(0, 0, -360)) labelVSInterval2.loop() messenger.send("updateArmurie", self.chercherInfoAUpdate()) print "apres messenger" print self.chercherLesArmes() #JAI CHANGER LE TEMPS DE LANIMATION t = Timer(1.0, lambda: self.chargeMenuNiveaux()) t.start() # after 30 seconds, "hello, world" will be printed self.decoration() #Faire une animation de "neige" def decoration(self): if not self.arreterDecoration: threading.Timer(0.1, lambda: self.decoration()).start() labelTest = OnscreenText(text="TANK'EM!!", pos=(random.randrange(5), random.randrange(5), random.randrange(5)), scale=0.2, fg=(random.randrange(10), random.randrange(10), random.randrange(10), 1), align=TextNode.ACenter, mayChange=1, bg=(0.1, 1, 0.6, 1), frame=(0, 0, 0, 1)) labelTest.setHpr(random.randrange(70), random.randrange(70), random.randrange(70)) testInterval = labelTest.posInterval(3, Point3(-8, -2, -2), startPos=Point3( random.randrange(5), random.randrange(5), random.randrange(5))) mySequence = Sequence(testInterval) mySequence.start() def hideWidgets(self): self.boutonStart.hide() self.textJoueur1.hide() self.textJoueur2.hide() self.textMdp1.hide() self.textMdp2.hide() self.boutonLogin1.hide() self.boutonLogin2.hide() self.messageConnexion.set( "Préparez vous pour le combat de votre vie....!!!!!!\n ÊTES-VOUS PRÊTS???" ) self.champNom1.hide() self.champMdp1.hide() self.champNom2.hide() self.champMdp2.hide() self.labelNom1.hide() self.labelNom2.hide() for item in self.listeNomArmes: item.hide() for item in self.listeNbArmes: item.hide() for item in self.listeNomArmes2: item.hide() for item in self.listeNbArmes2: item.hide() for item in self.listeCheckBox1: item.hide() for item in self.listeCheckBoxSec1: item.hide() for item in self.listeCheckBox2: item.hide() for item in self.listeCheckBoxSec2: item.hide() for item in self.labelJoueur1: item.hide() for item in self.labelJoueur2: item.hide() self.labelNom1.hide() self.labelNom2.hide() self.labelPrim1.hide() self.labelPrim2.hide() self.labelSec1.hide() self.labelSec2.hide() def hideWidgets2(self): self.modele1.hide() self.modele2.hide() self.labelVS1.hide() self.labelVS2.hide() self.labelTank2.hide() self.labelTank1.hide() self.messageConnexion.hide() self.deco.hide() def changerCouleurTank1(self): #On multiple la couleur de la texture du tank par ce facteur. Ça permet de modifier la couleur de la texture du tank RGBJ1 = [ self.unDTOUsers.getRougeUser(self.username1), self.unDTOUsers.getVertUser(self.username1), self.unDTOUsers.getBleuUser(self.username1), 1 ] self.modele1.setColorScale(RGBJ1[0], RGBJ1[1], RGBJ1[2], RGBJ1[3]) def changerCouleurTank2(self): RGBJ2 = [ self.unDTOUsers.getRougeUser(self.username2), self.unDTOUsers.getVertUser(self.username2), self.unDTOUsers.getBleuUser(self.username2), 1 ] self.modele2.setColorScale(RGBJ2[0], RGBJ2[1], RGBJ2[2], RGBJ2[3]) def afficherChoixArmes(self, choix1, choix2): self.choixPrim1 = [choix1] self.choixSec1 = [choix2] for item in self.listeNomArmes: item.hide() for item in self.listeCheckBox1: item.hide() for item in self.listeCheckBoxSec1: item.hide() for item in self.listeNbArmes: item.hide() for item in self.labelJoueur1: item.hide() self.listeCheckBox1 = [] self.listeCheckBoxSec1 = [] self.listeNomArmes = [] self.labelJoueur1 = [] #Afficher les labels et les radiobuttons self.labelNom1 = OnscreenText(text="Nom:", pos=(-1.6, 0.1, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.labelJoueur1.append(self.labelNom1) self.texteNom = OnscreenText(text="AucuneArme", pos=(-1.5, 0, 0), scale=0.06, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNomArmes.append(self.texteNom) self.sec1 = DirectRadioButton(text="Ok", scale=.05, pos=(-0.8, 0, 0), variable=self.choixSec1, value=[0], command=self.radioChoixJoueur1) self.listeCheckBoxSec1.append(self.sec1) self.texteNom = OnscreenText(text="Canon", pos=(-1.5, -0.1, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.prim1 = DirectRadioButton(text="Ok", scale=.05, pos=(-1.2, 0, -0.1), variable=self.choixPrim1, value=[1], command=self.radioChoixJoueur1) self.listeCheckBox1.append(self.prim1) self.listeNomArmes.append(self.texteNom) self.sec1 = DirectRadioButton(text="Ok", scale=.05, pos=(-0.8, 0, -0.1), variable=self.choixSec1, value=[1], command=self.radioChoixJoueur1) self.listeCheckBoxSec1.append(self.sec1) self.labelPrim1 = OnscreenText(text="Primaire:", pos=(-1.2, 0.1, 0), scale=0.05, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.labelSec1 = OnscreenText(text="Secondaire:", pos=(-0.8, 0.1, 0), scale=0.05, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.labelJoueur1.append(self.labelPrim1) self.labelJoueur1.append(self.labelSec1) #Pour chaque arme de la DTO, faire ajouter l'arme dans la liste nbDeChoix = len(self.listeArmes1) - 1 for i in range(nbDeChoix): texteNomArme = OnscreenText(text=self.listeArmes1[i][0], pos=(-1.5, -0.2 - 0.1 * i, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNomArmes.append(texteNomArme) texteNb = OnscreenText(text=str(self.listeTotalNbArmes1[i]), pos=(-0.6, -0.2 - 0.1 * i, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNbArmes.append(texteNb) if self.listeArmes1[i][1] != 0: b = DirectRadioButton(text="Ok", scale=.05, pos=(-1.2, 0, -0.2 - 0.1 * i), variable=self.choixPrim1, value=[i + 2], command=self.radioChoixJoueur1) self.listeCheckBox1.append(b) c = DirectRadioButton(text="Ok", scale=.05, pos=(-0.8, 0, -0.2 - 0.1 * i), variable=self.choixSec1, value=[i + 2], command=self.radioChoixJoueur1) self.listeCheckBoxSec1.append(c) #Code pour seulement pouvoir selection un radiobutton de la liste for button in self.listeCheckBox1: button.setOthers(self.listeCheckBox1) for button in self.listeCheckBoxSec1: button.setOthers(self.listeCheckBoxSec1) self.isReader1 = True # Callback function to set text def radioChoixJoueur1(self, status=None): if self.isReader1 == True: print "La valeur selectionnée PRIM:" + str(self.choixPrim1) print "La valeur selectionnée Secondaire:" + str(self.choixSec1) #Si on choisi une arme bonus, soustraire l'inventaire de 1. #Refresh les valeurs du nombre d'armes for i in range(len(self.listeArmes1) - 1): self.listeTotalNbArmes1[i] = self.listeArmes1[i][1] #Si on choisi une arme bonus, soustraire l'inventaire de 1. if self.choixPrim1 > 1: if self.listeTotalNbArmes1[self.choixPrim1[0] - 2] - 1 >= 0: self.listeTotalNbArmes1[self.choixPrim1[0] - 2] -= 1 #Si on choisi une arme bonus, soustraire l'inventaire de 1. if self.choixSec1[0] > 1: if self.listeTotalNbArmes1[self.choixSec1[0] - 2] - 1 >= 0: self.listeTotalNbArmes1[self.choixSec1[0] - 2] -= 1 else: self.choixSec1[0] = 0 self.isReader1 = False self.afficherChoixArmes(self.choixPrim1[0], self.choixSec1[0]) def afficherChoixArmes2(self, choix1, choix2): self.choixPrim2 = [choix1] self.choixSec2 = [choix2] #Cacher les anciens for item in self.listeNomArmes2: item.setText("") for item in self.listeCheckBox2: item.hide() for item in self.listeCheckBoxSec2: item.hide() for item in self.listeNbArmes2: item.hide() for item in self.labelJoueur2: item.hide() self.listeCheckBox2 = [] self.listeCheckBoxSec2 = [] self.listeNomArmes2 = [] self.labelJoueur2 = [] #Afficher les labels et les radiobuttons self.labelNom2 = OnscreenText(text="Nom:", pos=(0.7, 0.1, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.texteNom2 = OnscreenText(text="AucuneArme", pos=(0.7, 0, 0), scale=0.06, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNomArmes2.append(self.texteNom2) self.sec2 = DirectRadioButton(text="Ok", scale=.05, pos=(1.4, 0, 0), variable=self.choixSec2, value=[0], command=self.radioChoixJoueur2) self.listeCheckBoxSec2.append(self.sec2) self.texteNom2 = OnscreenText(text="Canon", pos=(0.7, -0.1, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.prim2 = DirectRadioButton(text="Ok", scale=.05, pos=(1, 0, -0.1), variable=self.choixPrim2, value=[1], command=self.radioChoixJoueur2) self.listeCheckBox2.append(self.prim2) self.listeNomArmes2.append(self.texteNom2) self.sec2 = DirectRadioButton(text="Ok", scale=.05, pos=(1.4, 0, -0.1), variable=self.choixSec2, value=[1], command=self.radioChoixJoueur2) self.listeCheckBoxSec2.append(self.sec2) self.labelPrim2 = OnscreenText(text="Primaire:", pos=(1, 0.1, 0), scale=0.05, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.labelSec2 = OnscreenText(text="Secondaire:", pos=(1.4, 0.1, 0), scale=0.05, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.labelJoueur2.append(self.labelNom2) self.labelJoueur2.append(self.labelPrim2) self.labelJoueur2.append(self.labelSec2) #Pour chaque arme de la DTO, faire ajouter l'arme dans la liste nbDeChoix2 = len(self.listeArmes2) - 1 for i in range(nbDeChoix2): texteNomArme2 = OnscreenText(text=self.listeArmes2[i][0], pos=(0.7, -0.2 - 0.1 * i, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNomArmes2.append(texteNomArme2) texteNb2 = OnscreenText(text=str(self.listeTotalNbArmes2[i]), pos=(1.6, -0.2 - 0.1 * i, 0), scale=0.07, fg=(0, 0, 0, 1), align=TextNode.ACenter, mayChange=1) self.listeNbArmes2.append(texteNb2) if self.listeArmes2[i][1] != 0: b = DirectRadioButton(text="Ok", scale=.05, pos=(1, 0, -0.2 - 0.1 * i), variable=self.choixPrim2, value=[i + 2], command=self.radioChoixJoueur2) self.listeCheckBox2.append(b) c = DirectRadioButton(text="Ok", scale=.05, pos=(1.4, 0, -0.2 - 0.1 * i), variable=self.choixSec2, value=[i + 2], command=self.radioChoixJoueur2) self.listeCheckBoxSec2.append(c) #Code pour seulement pouvoir selection un radiobutton de la liste for button in self.listeCheckBox2: button.setOthers(self.listeCheckBox2) for button in self.listeCheckBoxSec2: button.setOthers(self.listeCheckBoxSec2) self.isReader2 = True # Callback function to set text def radioChoixJoueur2(self, status=None): if self.isReader2 == True: print "La valeur selectionnée PRIM:" + str(self.choixPrim2) print "La valeur selectionnée Secondaire:" + str(self.choixSec2) #Si on choisi une arme bonus, soustraire l'inventaire de 1. #Refresh les valeurs du nombre d'armes for i in range(len(self.listeArmes2) - 1): self.listeTotalNbArmes2[i] = self.listeArmes2[i][1] #Si on choisi une arme bonus, soustraire l'inventaire de 1. if self.choixPrim2 > 1: if self.listeTotalNbArmes2[self.choixPrim2[0] - 2] - 1 >= 0: self.listeTotalNbArmes2[self.choixPrim2[0] - 2] -= 1 #Si on choisi une arme bonus, soustraire l'inventaire de 1. if self.choixSec2[0] > 1: if self.listeTotalNbArmes2[self.choixSec2[0] - 2] - 1 >= 0: self.listeTotalNbArmes2[self.choixSec2[0] - 2] -= 1 else: self.choixSec2[0] = 0 self.isReader2 = False self.afficherChoixArmes2(self.choixPrim2[0], self.choixSec2[0]) def chercherInfoAUpdate(self): idUser1 = self.unDTOUsers.getIdUser(self.username1) idUser2 = self.unDTOUsers.getIdUser(self.username2) listeModifUser = [] if self.choixPrim1[0] > 1: choix = [] choix.append(idUser1) choix.append( self.unDTOUsers.getIdArme( self.listeNomArmes[self.choixPrim1[0]].getText())) listeModifUser.append(choix) if self.choixSec1[0] > 1: choix = [] choix.append(idUser1) choix.append( self.unDTOUsers.getIdArme( self.listeNomArmes[self.choixSec1[0]].getText())) listeModifUser.append(choix) if self.choixPrim2[0] > 1: choix = [] choix.append(idUser2) choix.append( self.unDTOUsers.getIdArme( self.listeNomArmes2[self.choixPrim2[0]].getText())) listeModifUser.append(choix) if self.choixSec2[0] > 1: choix = [] choix.append(idUser2) choix.append( self.unDTOUsers.getIdArme( self.listeNomArmes2[self.choixSec2[0]].getText())) listeModifUser.append(choix) listeInfo = [] listeInfo.append(listeModifUser) return listeInfo def chercherLesArmes(self): listeArme1 = [] listeArme2 = [] listeArme1.append(self.listeNomArmes[self.choixPrim1[0]].getText()) listeArme1.append(self.listeNomArmes[self.choixSec1[0]].getText()) listeArme2.append(self.listeNomArmes2[self.choixPrim2[0]].getText()) listeArme2.append(self.listeNomArmes2[self.choixSec2[0]].getText()) listeInfo = [] listeInfo.append(listeArme1) listeInfo.append(listeArme2) return listeInfo