瀏覽代碼

Correction du bug des projection pour les formes complexes

unknown 10 年之前
父節點
當前提交
a87a7bfab1
共有 9 個文件被更改,包括 83 次插入67 次删除
  1. 8 6
      lib/Case.py
  2. 10 10
      lib/EcranEditionCombattant.py
  3. 28 11
      lib/Forme.py
  4. 9 13
      lib/Pion.py
  5. 0 2
      lib/Plateau.py
  6. 3 0
      lib/ProjectionDep.py
  7. 24 24
      lib/VueEditionForme.py
  8. 二進制
      lib/biblio/combattant
  9. 1 1
      lib/ui/dm.py

+ 8 - 6
lib/Case.py

@@ -52,7 +52,6 @@ class Case(QGraphicsPolygonItem):
         else:
             self.terrain = charger("lib\\biblio\\terrain", self.idTerrain)
         
-
     ######## fonctions de base : geometrie, aspect graphique      ######
     def creer(self, x, y, couleur = QColor(0, 255, 0, 80)):
         """creation du polygone et enregistrement des donnees geometriques"""
@@ -92,11 +91,11 @@ class Case(QGraphicsPolygonItem):
         self.setFiltersChildEvents(True)
 
 ##        #pour afficher les coordonnees des cases:        
-##        text = QGraphicsSimpleTextItem("{}-{}".format(self.x,self.y), parent=self)
-##        if self.plateau.formeCases == "H":
-##            text.setPos(QPointF(((self.x*0.866)+0.2886)*self.plateau.hCase,  self.y*self.plateau.hCase))
-##        else:
-##            text.setPos(QPointF(self.x*self.plateau.hCase,  self.y*self.plateau.hCase))
+        text = QGraphicsSimpleTextItem("{}-{}".format(self.x,self.y), parent=self)
+        if self.plateau.formeCases == "H":
+            text.setPos(QPointF(((self.x*0.866)+0.2886)*self.plateau.hCase,  self.y*self.plateau.hCase))
+        else:
+            text.setPos(QPointF(self.x*self.plateau.hCase,  self.y*self.plateau.hCase))
 
         self.logoDep = LogoDep(self)
         self.logoDep.creer()
@@ -513,4 +512,7 @@ class LogoDep(QGraphicsEllipseItem):
         self.txt.setTextCursor(cursor)
 
 
+            
+            
+            
 

+ 10 - 10
lib/EcranEditionCombattant.py

@@ -186,15 +186,16 @@ class EcranEditionCombattant(QDialog):
                                               "Selectionnez une image", 
                                               "\\img", 
                                               "Images (*.png *.jpg)")
-        pix = QPixmap(fichier)
-        if not pix.isNull():
-            self.vueForme.nouvelleImageDef(fichier)
-        else:    
-            dial = QMessageBox(self)
-            dial.setText("Format non reconnu")
-            dial.setWindowTitle("Erreur")
-            dial.setStandardButtons(QMessageBox.Ok)
-            dial.exec_()
+        if len(fichier) > 0:
+            pix = QPixmap(fichier)
+            if not pix.isNull():
+                self.vueForme.nouvelleImageDef(fichier)
+            else:    
+                dial = QMessageBox(self)
+                dial.setText("Format non reconnu")
+                dial.setWindowTitle("Erreur")
+                dial.setStandardButtons(QMessageBox.Ok)
+                dial.exec_()
 
     def selectionCouleur(self):
         """selectionne la couleur dans la boite de dialogue dediee"""
@@ -204,7 +205,6 @@ class EcranEditionCombattant(QDialog):
             self.combattant.couleur = couleur
             self.vueForme.majCouleur(couleur)
 
-            
     def enregistrer(self):
         """enregistre le terrain cree/edite"""
         #identifiant

+ 28 - 11
lib/Forme.py

@@ -16,16 +16,18 @@ class Forme():
         """renvoie la liste des cases situees a [distance] cases du centre, dans l'ordre des aiguilles d'une montre"""
         anneau = {}
         if self.formeCases == "H":
-             anneau[1] = [(0,-1),(1,-0.5),(1,0.5), \
-                          (0,1),(-1,0.5),(-1,-0.5)]
-             anneau[2] = [(0,-2),(1,-1.5),(2,-1),(2,0),(2,1),(1,1.5), \
-                          (0,2),(-1,1.5),(-2,1),(-2,0),(-2,-1),(-1,-1.5)]
-             anneau[3] = [(0,-3),(1,-2.5),(2,-2),(3,-1.5),(3,-0.5),(3,0.5),(3,1.5),(2,2),(1,2.5), \
-                          (0,3),(-1,2.5),(-2,2),(-3,1.5),(-3,0.5),(-3,-0.5),(-3,-1.5),(-2,-2),(-1,-2.5)]
-             anneau[4] = [(0,-4),(1,-3.5),(2,-3),(3,-2.5),(4,-2),(4,-1),(4,0),(4,1),(4,2),(3,2.5),(2,3),(1,3.5), \
-                          (0,4),(-1,3.5),(-2,3),(-3,2.5),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-3,-2.5),(-2,-3),(-1,-3.5)]
-             anneau[5] = [(0,-5),(1,-4.5),(2,-4),(3,-3.5),(4,-3),(5,-2.5),(5,-1.5),(5,-0.5),(5,0.5),(5,1.5),(5,2.5),(4,3),(3,3.5),(2,4),(1,4.5), \
-                          (0,5),(-1,4.5),(-2,4),(-3,3.5),(-4,3),(-5,2.5),(-5,1.5),(-5,0.5),(-5,-0.5),(-5,-1.5),(-5,-2.5),(-4,-3),(-3,-3.5),(-2,-4),(-1,-4.5)]
+             anneau[1] = [(0,-1),(1,0),(1,1),(0,1),(-1,1),(-1,0)]
+             
+             anneau[2] = [(0,-2),(1,-1),(2,-1),(2,0),(2,1),(1,2),(0,2),(-1,2),(-2,1),(-2,0),(-2,-1),(-1,-1)]
+             
+             anneau[3] = [(0,-3),(1,-2),(2,-2),(3,-1),(3,0),(3,1),(3,2),(2,2),(1,3), \
+                          (0,3),(-1,3),(-2,2),(-3,2),(-3,1),(-3,0),(-3,-1),(-2,-2),(-1,-2)]
+             
+             anneau[4] = [(0,-4),(1,-3),(2,-3),(3,-2),(4,-2),(4,-1),(4,0),(4,1),(4,2),(3,3),(2,3),(1,4), \
+                          (0,4),(-1,4),(-2,3),(-3,3),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-3,-2),(-2,-3),(-1,-3)]
+             
+             anneau[5] = [(0,-5),(1,-4),(2,-4),(3,-3),(4,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(4,3),(3,4),(2,4),(1,5), \
+                          (0,5),(-1,5),(-2,4),(-3,4),(-4,3),(-5,3),(-5,2),(-5,1),(-5,0),(-5,-1),(-5,-2),(-4,-3),(-3,-3),(-2,-4),(-1,-4)]
              
         elif self.formeCases == "C":
              anneau[1] = [(0,-1),(1,-1),(1,0),(1,1),\
@@ -91,6 +93,13 @@ class Forme():
         if len(self.formeDef) > 0:
             for i in range(0,abs(nbRotations)):
                 for coord in tmp:
+
+##                    #correctif a appliquer pour les abscisses impaires avec cases hexa
+##                    cy = 0
+##                    if self.formeCases == "H" and 1==(coord[0]%2):
+##                        cy = 1
+##                    coord = (coord[0], coord[1]+cy)
+                    
                     #on trouve dans quel anneau se situe cette case
                     distance = 0
                     i = 0
@@ -98,6 +107,7 @@ class Forme():
                         i += 1
                         if coord in self.anneau(i):
                             distance = i
+                            
                     #si on a trouve la case, on la deplace selon les conditions de la rotation        
                     if distance > 0:
                         #position actuelle dans la liste des cases de l'anneau
@@ -114,6 +124,7 @@ class Forme():
                         
                         #on retrouve les nouvelles coordonnees relatives a partir de la position dans l'anneau  
                         nouvellesCoord = self.anneau(distance)[nouvellePosition]
+
                         #on ajoute cette position a la nouvelle definition de forme
                         formeDefPivote.append((nouvellesCoord[0], nouvellesCoord[1]))
                     else:
@@ -133,5 +144,11 @@ class Forme():
             formeEnCours = self.formeDef
         if len(formeEnCours) > 0:
             for coordRelatives in formeEnCours:
-                retour.append((coordCibles[0]+coordRelatives[0], coordCibles[1]+coordRelatives[1]))       
+                #correctif a appliquer pour les abscisses impaires avec cases hexa
+                cy = 0
+                if self.formeCases == "H" and 0==(coordCibles[0]%2):
+                    if 1==(coordRelatives[0]%2):
+                        cy = -1
+                retour.append((coordCibles[0]+coordRelatives[0], coordCibles[1]+coordRelatives[1]+cy))
+##                retour.append((coordCibles[0]+coordRelatives[0], coordCibles[1]+coordRelatives[1]))
         return retour

+ 9 - 13
lib/Pion.py

@@ -34,8 +34,8 @@ class Pion(QGraphicsItem):
         #objets et parametres graphiques
         self.pixGraphique = None
         self.etiquetteGraphique = None
-        self.largeurOriginale = 0
-        self.hauteurOriginale = 0
+        self._l0 = 0
+        self._h0 = 0
         self.polygoneGraphique = None
         self.nbRotations = 0
 
@@ -180,9 +180,7 @@ class Pion(QGraphicsItem):
     def majImage(self):
         """met a jour la taille, la position et l'orientation de l'image"""
         if len(self.img.nomFichier) > 0:
-            pix = QPixmap(QString.fromUtf8("img\\"+self.img.nomFichier))
-            if self.img.masqueAuto:
-                pix.setMask(pix.createHeuristicMask())
+            pix = QPixmap(QString.fromUtf8(self.img.nomFichier))
             if not pix.isNull():
                 if not self.pixGraphique:
                     self.pixGraphique = QGraphicsPixmapItem()
@@ -191,19 +189,17 @@ class Pion(QGraphicsItem):
                         pix = pix.scaledToHeight(self.plateau.hCase*0.9, Qt.SmoothTransformation)
                     else:
                         pix = pix.scaledToWidth(self.plateau.hCase*0.9, Qt.SmoothTransformation)
-                    self.largeurOriginale = pix.width()
-                    self.hauteurOriginale = pix.height()
+                    self._l0 = pix.width()
+                    self._h0 = pix.height()
                     pix = pix.scaled((self.img.kx/10)*pix.width(), \
                                      (self.img.ky/10)*pix.height(), \
                                       Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
                     self.pixGraphique.setPixmap(pix)
 
-                deltaX = self.img.dx + 0.5*(self.plateau.hCase*1.1544 - self.largeurOriginale)
-                deltaY = self.img.dy + 0.5*(self.plateau.hCase - self.hauteurOriginale)
-                if self.img.nomFichier != self.logo and self.pivote == True:
-                    self.pixGraphique.setParentItem(self.polygoneGraphique)
-                else:
-                    self.pixGraphique.setParentItem(self)
+                deltaX = self.img.dx + 0.5*(self.plateau.hCase*1.1544 - self._l0)
+                deltaY = self.img.dy + 0.5*(self.plateau.hCase - self._h0)
+
+                self.pixGraphique.setParentItem(self.polygoneGraphique)
                 self.pixGraphique.setRotation(self.img.rotation)
                 self.pixGraphique.setPos(QPointF(deltaX, deltaY))
 

+ 0 - 2
lib/Plateau.py

@@ -590,14 +590,12 @@ class Plateau(QGraphicsScene):
         index = self.fenetre.ui.cp_listeDecors.item(ligne, 0)
         decor = charger("lib\\biblio\\decor", str(index.text().toUtf8()))
         self.activerMode(Modes.CreationPion, decor)
-        self.vue().setFocus()
         
     def modeCreationCombattant(self, ligne, col):
         """enclenche le mode de creation de pions depuis la liste des creatures"""
         index = self.fenetre.ui.cp_listeCreatures.item(ligne, 0)
         creature = charger("lib\\biblio\\combattant", str(index.text().toUtf8()))
         self.activerMode(Modes.CreationPion, creature)
-        self.vue().setFocus()
 
     def modeMajTerrainCase(self, ligne, col):
         """enclenche le mode permettant la mise a jour du terrain des cases"""

+ 3 - 0
lib/ProjectionDep.py

@@ -78,8 +78,11 @@ class ProjectionDep():
         self._active = True
         if self.projectionValide():
             depValide = self.deplacementValide()
+            i = 0
             for coord in self._forme.listeCases(self._coord, self._nbRotations):
+                i += 1
                 self.plateau.cases[coord].majEstCibleCurseur(True, depValide)
+                
             
             
     def z(self):

+ 24 - 24
lib/VueEditionForme.py

@@ -43,7 +43,7 @@ class VueEditionForme(QGraphicsScene):
         retour = []
         for coord in self._cases:
             if self._cases[coord].estSelectionnee() and coord != (0,0):
-                retour.append(coord)      
+                retour.append(coord)
         return retour      
 
     def chargerEtiquetteDef(self, etiquetteDef):
@@ -79,10 +79,7 @@ class VueEditionForme(QGraphicsScene):
         self._formeCases = formeCases
         
         for x in range(-5,6):
-            for y in range(-5,5):
-                if self._formeCases == "H":
-                     if 1 == (x % 2):
-                          y += 0.5
+            for y in range(-5,6):
                 c = VefCase(self)
                 c.creer(x, y, self._couleur, self._formeCases)
                 self._cases[(x,y)] = c
@@ -113,8 +110,6 @@ class VueEditionForme(QGraphicsScene):
     def majSelection(self, coord):
          """met a jour l'affichage des cases selectionnees pour l'affichage de la forme"""
          if self._cases[coord].estSelectionnee():
-             #on deselectionne la case
-##             self._cases[coord].selectionner(False)
              valide = True
              for coordVerif in self._cases:
                  #on parcourt les autres cases selectionnees
@@ -216,14 +211,18 @@ class VefCase(QGraphicsPolygonItem):
     def creer(self, x, y, couleur, formeCases="H"):
         """creation du polygone et enregistrement des donnees geometriques"""
         self._position = (x, y)
+        
         polygone = QPolygonF()
+        
         if formeCases == "H":
-            polygone  << QPointF(((x*0.866)+0.2886)*120,  y*120) \
-                      << QPointF(((x*0.866)+0.866)*120,   y*120) \
-                      << QPointF(((x*0.866)+1.1547)*120, (y+0.5)*120) \
-                      << QPointF(((x*0.866)+0.866)*120,  (y+1)*120) \
-                      << QPointF(((x*0.866)+0.2886)*120, (y+1)*120)  \
-                      << QPointF( (x*0.866)*120,         (y+0.5)*120)
+            my = 0
+            if 1 == (x % 2): my = -0.5
+            polygone  << QPointF(((x*0.866)+0.2886)*120, (y+my)*120) \
+                      << QPointF(((x*0.866)+0.866)*120,  (y+my)*120) \
+                      << QPointF(((x*0.866)+1.1547)*120, (y+my+0.5)*120) \
+                      << QPointF(((x*0.866)+0.866)*120,  (y+my+1)*120) \
+                      << QPointF(((x*0.866)+0.2886)*120, (y+my+1)*120)  \
+                      << QPointF( (x*0.866)*120,         (y+my+0.5)*120)
         else:
             polygone  << QPointF(x*120,      y*120) \
                       << QPointF((x+1)*120,  y*120) \
@@ -233,12 +232,10 @@ class VefCase(QGraphicsPolygonItem):
 
         #enregistrement des cases voisines:       
         if formeCases == "H":
-            self._voisins.append((x, y+1))
-            self._voisins.append((x, y-1))
-            self._voisins.append((x-1, y+0.5))
-            self._voisins.append((x-1, y-0.5))
-            self._voisins.append((x+1, y+0.5))
-            self._voisins.append((x+1, y-0.5))
+            if 1 == (x % 2):
+                self._voisins = [(x, y-1), (x+1, y), (x+1, y+1), (x,  y+1), (x-1, y+1), (x-1, y)]
+            else:
+                self._voisins = [(x, y-1), (x+1, y-1), (x+1, y), (x,  y+1), (x-1, y), (x-1, y-1)]
         else:
             self._voisins.append((x,   y-1))
             self._voisins.append((x,   y+1))
@@ -246,11 +243,13 @@ class VefCase(QGraphicsPolygonItem):
             self._voisins.append((x+1, y))
 
         #pour afficher les coordonnees des cases:        
-        #text = QGraphicsSimpleTextItem("{}-{}".format(x,y), parent=self)
-        #police = QFont()
-        #police.setPointSize(20)
-        #text.setFont(police)
-        #text.setPos(QPointF(((x*0.866)+0.2886)*120,  y*120))
+##        text = QGraphicsSimpleTextItem("{}-{}".format(x, y), parent=self)
+##        police = QFont()
+##        police.setPointSize(20)
+##        text.setFont(police)
+##        k = 0
+##        if 1 == (x % 2): k = 0.5
+##        text.setPos(QPointF(((x*0.866)+0.5773)*120, (y+0.5+k)*120))
 
         #couleur de fond par defaut
         if couleur.__class__.__name__ == "QColor":
@@ -267,6 +266,7 @@ class VefCase(QGraphicsPolygonItem):
             self._estSelectionnee = True
         else:    
             self.selectionner(False)
+            
         #creation de l'objet graphique sur le plateau
         pinceau = QPen()
         pinceau.setWidth(2)

二進制
lib/biblio/combattant


+ 1 - 1
lib/ui/dm.py

@@ -163,7 +163,7 @@ class DmTableBiblio(DmTableWidget):
             #code de l'objet
             self.setItem(int(index),0,QTableWidgetItem(QString.fromUtf8(elt)))
             #icone et nom
-            icon = QIcon("img\\"+objet.icone())
+            icon = QIcon(objet.icone())
             item = QTableWidgetItem(icon,QString.fromUtf8(objet.nom))
             self.setItem(int(index),1,item)