ProjectionDep.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. """Projection du deplacement d'un pion"""
  2. from PyQt4.QtCore import *
  3. from PyQt4.QtGui import *
  4. from Forme import Forme
  5. class ProjectionDep():
  6. def __init__(self, plateau):
  7. self.plateau = plateau
  8. self._pion = None
  9. self._active = False
  10. self._coord = (-1,-1)
  11. self._forme = Forme(self.plateau.formeCases)
  12. self._nbRotations = 0
  13. def creer(self, pion):
  14. self_pion = pion
  15. self._forme.definirForme(pion.formeDef[self.plateau.formeCases])
  16. self._coord = pion.position
  17. self._nbRotations = pion.nbRotations
  18. self._active = True
  19. def majCoord(self, coord):
  20. self.desactiver()
  21. self._coord = coord
  22. self.maj()
  23. def majRotation(self, modRotation):
  24. self.desactiver()
  25. self._nbRotations += modRotation
  26. self.maj()
  27. def coord(self):
  28. return self._coord
  29. def nbRotations(self):
  30. return self._nbRotations
  31. def desactiver(self):
  32. for coord in self._forme.listeCases(self._coord, self._nbRotations):
  33. if coord in self.plateau.cases:
  34. self.plateau.cases[coord].majEstCibleCurseur(False)
  35. self.active = False
  36. def projectionValide(self):
  37. """la projection est valide si toutes les cases de la forme existent"""
  38. valide = True
  39. for coord in self._forme.listeCases(self._coord, self._nbRotations):
  40. if not coord in self.plateau.cases:
  41. valide = False
  42. break
  43. return valide
  44. def deplacementValide(self):
  45. """le deplacement est valide si toutes les cases de la forme sont franchissables"""
  46. valide = False
  47. compte = 0
  48. ok = 0
  49. if self.projectionValide():
  50. for coord in self._forme.listeCases(self._coord, self._nbRotations):
  51. compte += 1
  52. if self.plateau.cases[coord].estFranchissable(self.z()):
  53. ok += 1
  54. else:
  55. #si la case est occupee par le pion lui-meme
  56. if not self.plateau.cases[coord].estOccupee(self.z()):
  57. ok += 1
  58. else:
  59. if self.plateau.cases[coord].occupant(self.z()) == self._pion:
  60. ok += 1
  61. valide = (ok == compte and compte > 0)
  62. return valide
  63. def maj(self):
  64. self._active = True
  65. if self.projectionValide():
  66. depValide = self.deplacementValide()
  67. i = 0
  68. for coord in self._forme.listeCases(self._coord, self._nbRotations):
  69. i += 1
  70. self.plateau.cases[coord].majEstCibleCurseur(True, depValide)
  71. def z(self):
  72. """renvoie l'altitude du pion qu'on deplace"""
  73. z = 0
  74. try:
  75. z = self._pion.z
  76. except:
  77. pass
  78. return z