Se connecter / S'enregistrer
Votre question

[Java] Problème shape et méthode contains après rotation

Tags :
  • Swing
  • Programmation
Dernière réponse : dans Programmation
2 Décembre 2009 17:39:03

Bonjour à tous.

Je travaille actuellement sur un projet qui a pour sujet de faire un jeu de puzzle. Je crée donc des formes de pièces Shape. Je dois pouvoir faire une rotation, ce qui en soi ne pose pas de problème. Cependant, après cette rotation, la méthode contains de Shape me renvoie toujours faux, ce qui est gênant pour gérer le drag and drop.

Voici ma classe de pièce(voir la méthode tourner90)

  1. package modele;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Graphics2D;
  6. import java.awt.Polygon;
  7. import java.awt.Shape;
  8. import java.awt.Toolkit;
  9. import java.awt.geom.AffineTransform;
  10. import java.awt.geom.Area;
  11. import java.awt.image.BufferedImage;
  12. import javax.swing.ImageIcon;
  13. import javax.swing.JLabel;
  14. import autres.FonctionsUtiles;
  15.  
  16. public class PiecePuzzle extends JLabel{
  17.  
  18. Shape forme;
  19. Shape formeFinale;
  20. BufferedImage image;
  21. int posX;
  22. int posY;
  23. int etat;
  24. int taillePiece;
  25.  
  26.  
  27.  
  28. public PiecePuzzle(BufferedImage imageTemp, Shape forme, int x, int y, int taillePieces){
  29. super();
  30. this.forme = forme;
  31. this.formeFinale = forme;
  32. this.posX=0;
  33. this.posY=0;
  34. this.taillePiece=taillePieces;
  35. this.setSize(new Dimension((int)(taillePieces*1.5),(int)(taillePieces*1.5)));
  36. this.setPreferredSize(new Dimension((int)(taillePieces*1.5),(int)(taillePieces*1.5)));
  37. image = new BufferedImage(taillePieces+taillePieces/2, taillePieces+taillePieces/2, BufferedImage.TYPE_INT_ARGB);
  38.  
  39. Graphics2D g = image.createGraphics();
  40. g.setClip(forme);
  41. g.drawImage(imageTemp,x,y,null);
  42.  
  43. Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
  44.  
  45. this.setIcon(new ImageIcon(image));
  46.  
  47. while(posY==0 || posY>=toolkit.getScreenSize().getHeight()*0.9-taillePieces*1.5)
  48. this.posY = (int)(Math.random()*toolkit.getScreenSize().getHeight()*0.9);
  49. while(posX==0 || posX>=Math.random()*toolkit.getScreenSize().getWidth()*0.59-taillePieces*1.5)
  50. this.posX = (int)(Math.random()*toolkit.getScreenSize().getWidth()*0.59);
  51.  
  52. this.etat = (int)Math.round(Math.random()*4);
  53. if(etat==4) etat=0;
  54. int etatTemp = etat;
  55. for(int i=0;i<etatTemp;i++){
  56. this.tourner90();
  57. }
  58. etat=etatTemp;
  59. }
  60.  
  61. public PiecePuzzle(BufferedImage image, Shape forme, Shape formeFinale, int etat, int posX, int posY, int taillePiece){
  62. super();
  63. this.image=image;
  64. this.forme=forme;
  65. this.formeFinale=formeFinale;
  66. this.etat=etat;
  67. this.posX=posX;
  68. this.posY=posY;
  69. this.taillePiece=taillePiece;
  70. this.setIcon(new ImageIcon(image));
  71. }
  72.  
  73. public PiecePuzzle clone(){
  74. return new PiecePuzzle(this.image,this.forme,this.formeFinale,this.etat,this.posX,this.posY,this.taillePiece);
  75. }
  76. public int getTaillePiece(){
  77.  
  78. return taillePiece;
  79. }
  80.  
  81. public void tourner90(){
  82. this.image=FonctionsUtiles.rotationImage(image);
  83. this.etat++;
  84. if(etat ==4) etat=0;
  85. AffineTransform tx = new AffineTransform();
  86. tx.rotate(Math.toRadians(90));
  87. forme = tx.createTransformedShape(forme);
  88.  
  89. this.setIcon(new ImageIcon(image));
  90. this.repaint();
  91.  
  92. }
  93.  
  94. public int getPosX(){
  95.  
  96. return posX;
  97. }
  98.  
  99.  
  100. public boolean contains(int x, int y){
  101. return formeFinale.contains(x, y);
  102. }
  103.  
  104. public void setPosX(int posX){
  105.  
  106. this.posX = posX;
  107. }
  108.  
  109.  
  110.  
  111. public int getPosY(){
  112.  
  113. return posY;
  114. }
  115.  
  116.  
  117.  
  118. public void setPosY(int posY){
  119.  
  120. this.posY = posY;
  121. }
  122.  
  123. public Shape getForme(){
  124. return forme;
  125. }
  126.  
  127. public int getEtat(){
  128. return etat;
  129. }
  130. }


Vous pouvez donc voir que je suis obligé de copier le shape de base dans FormeFinale, pour pouvoir gérer le drag and drop. Cependant, comme vous pouvez l'imaginer, les bords de la pièce tournent ce qui fait que le clic sur certaines excroissances d'une pièce ne fonctionnent plus, et vice-versa. En sachant que je ne vois pas vraiment comment je pourrais reconstruire un shape, la conception étant assez compliquée.
Si quelqu'un a une solution (autre méthode de rotation ou quelque chose ... ), je serais débarrassé d'un problème assez conséquent dans mon programme.
Merci d'avance,

Autres pages sur : java probleme shape methode contains rotation

3 Décembre 2009 18:27:16

up ? Personne n'a rencontré le pb ?
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS