IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Définir une class comme élement graphique


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut Définir une class comme élement graphique
    Bonjour a tous. J'aimerai définir une classe comme élément graphique que je pourrai ajouter a un panel(comme un rectangle2D ou line2D etc...) mais je ne sais pas du tout comment faire. J'ai regardé l'architecture de Rectangle2D et j'ai implementé Shape mais cela ne marche pas. Faut - il mettre une méthode comme paint pour definir la forme du composant? Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 872
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    Peux-tu nous montrer du code STP ?

  3. #3
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    J'ai creer une classe Unites qui implemente Shape et donc qui reprend toutes ses methodes.Jusque la pas de probleme. Ensuite je creer une classe Soldat qui extends Unites et qui contient une methode paintComponent. Seulement quand dans un Jpanel quelconque je fait un paintComponent et que je fais fill(new Soldat()); rien ne s'affche. J'ai pas de code içi désolé mais en tout cas il n'y a pas d'erreur de compilation. Seuleument je voudrai savoir :
    1 : comment faire en sorte qu'une classe puisse etre utiliser comme tout element graphique(je pense que c'est bon en implementant Shpe mais je ne suis pas sur)
    2: comment ensuite définir graphiquement la classe(comment sera t'elle representé a l'écran).Merci pour vos aides.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 872
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    Shape definie une forme vectorielle qui est dessinee via le PathIterator qui decrit le chemin entre des point. C'est ce chemin qui doit etre rendu. Si rien ne se dessine, soit ta forme est hors de la zone de vue, soit ton PathIterator ne contient/fait rien

    Perso j'utiliserai plutot la delegation que d'etendre/implementer directement Shape, ca rend les choses plus simple (Shape fait tout le boulot a ta place). Ceci dit mon interface Sprite contient pas mal de methode presentes dans Shape (mais pas toute nottament pas celle retournant le PathIterator) car elles peuvent entre autre aider a la detection des collisions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public interface class Sprite {
      public boolean contains(int x, int y);
      public Rectangle getBounds();
      ...
      public void draw(Graphics2D graphics);
    }
     
    public abstract class VectorSprite {
      protected Shape delegated;
      protected Paint foreground = Color.WHITE;
      protected Paint background = Color.BLACK;
      protected Stroke stroke = new BasicStroke(1.0f);
     
      /** Creates a new instance.
      */
      public VectorSprite() {
      }
     
     ...
     
      /** @inheritDoc
      */
      @Override public Rectangle getBounds() {
        return delegated.getBounds();
      }
     
      ...
     
      /** @inheritDoc
      */
      @Override public void draw(Graphics2D graphics) {
        if (isFilled()) {
           graphics.setPaint(getBackground());
           graphics.fill(delegated);
        }
        if (isStroked()) {
           graphics.setStroke(getStroke());
           graphics.setPaint(getForeground());
           graphics.draw(delegated);
        }   
      }
    }
     
    public interface Soldier extends Sprite {
    ...
    }
     
    public class VectorSoldier extends VectorSprite implements Soldier {
      /** Creates a new instance.
      */
      public VectorSoldier() {
        GeneralPath path = new GeneralPath();
        // Dessin de la forme ici dans le path.
        delegated = path;
        foreground = Color.GRAY;
        background = Color.GREEN;
      }
      ...
    }
    Tu peux aussi faire que ton soldat soit compose de plusieurs sous-Shape pour avoir plusieurs couleurs (ex le soldat est vert mais tu aimerai que son fusil soit gris fonce). Penser dans ce cas a fusioner les boites englobantes des sous-formes pour former celle du soldat.

    Pour dessiner le path ce n'est pas trop dur il suffit de regarder la doc de GeneralPath et les methode moveTo, lineTo, curvTo, ... sinon on peut utiliser une forme (ou une combinaison de formes) simples de Java2D (Rectangle2D, Arc2D, ...), voir Area si besoin de faire des soustraction entre forme (bref lire un tuto Java2D). Le mieux est de faire des esquisses sur un calepin avec un crayon (hooo low-tech...) avant d'essayer de faire quoique ce soit.

    Note que cette architecture te permet egalement d'utiliser des sprites bitmap en plus de ceux vectoriels, ce qui peut parfois etre interessant une fois que l'on est sur que son jeu marche et qu'on veut faire quelque chose de plus joli.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public abstract class BitmapSprite {
      protected Image image;
     
      /** Creates a new instance.
      * @param Image the image for this sprite.
      * @exception If given image is <code>null</code>
      */
      public BitmapSrite(image image) {
         this.image = image;
       }
     
      ...
     
      /** @inheritDoc
      */
      @Override public Rectangle getBounds() {
        return new Rectangle(0, 0, image.getWidth(null), image.getHeight(null));
      }
     
      ...
     
      /** @inheritDoc
      */
      @Override public void draw(Graphics2D graphics) {
        graphics.drawImage(image, 0, 0, null);
      }
    }
     
    public class BitmapSoldier extends BitmapSprite implements Soldier {
      /** Creates a new instance.
      * @param Image the image for this sprite.
      * @exception If given image is <code>null</code>
      */
      public VectorSoldier(Image image) throws NullPointerException {
        super(image);
      }
     
    ...
    }
    Bien sur c'est une maniere simpliste (nottement les sprites ne sont pas animes) mais c'est un bon debut pour commencer.

    Si c'est pour un jeu regarde du cote de Space Invaders en Java et de leur class Actor (une version anglaise du tuto est sur la droite).

    Note : ensuite un pattern interressant est de creer un ensemble de fabriques pour simplifier un max la maniere dont tu instancie tes objets. (dans mes exemple les differentes flavor sont des enums mais on peut aussi faire avec des identificateur entiers ou des chaines de texte. On peut aussi utiliser des fichiers texte et/ou XML de configuration externe).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SpriteFactory spriteFactory = SpriteFactory.getInstance(SpriteFactory.Flavor.VECTOR);
    Soldier cannonFodder = spriteFactory.createSoldier(Soldier.Flavor.ARMY);
    Soldier privateRyan = spriteFactory.createSoldier(Soldier.Flavor.ARMY);
    Soldier marine = spriteFactory.createSoldier(Soldier.Flavor.MARINE);
    Soldier pilote = spriteFactory.createSoldier(Soldier.Flavor.AIR_FORCE);
    Soldier snake = spriteFactory.createSoldier(Soldier.Flavor.SPEC_OPS);
    Soldier samFisher = spriteFactory.createSoldier(Soldier.Flavor.SPEC_OPS);
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Définir une Classe triangle
    Par Pingouin22 dans le forum C++
    Réponses: 13
    Dernier message: 16/10/2007, 11h07
  2. Réponses: 19
    Dernier message: 14/08/2007, 15h41
  3. Réponses: 3
    Dernier message: 04/04/2007, 14h17
  4. définir une variable comme entier
    Par goldo33 dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/03/2007, 16h06
  5. Définir une classe dans une autre classe
    Par acieroid dans le forum C++
    Réponses: 7
    Dernier message: 22/05/2006, 00h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo