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

Java Discussion :

Création d'une petite classe "Affichage" pour un jeu ? (afficher un carré)


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Création d'une petite classe "Affichage" pour un jeu ? (afficher un carré)
    Bonjour,

    j'ai un projet de fac et on est censé faire un genre de "plague inversé", on a un virus qui se répend et le joueur va devoir essayer de le stopper en gérant le personnel médical, le vaccin etc (un seriousgame un peu)

    On nous a donné cette interface graphique :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    package display;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import java.lang.IllegalArgumentException;
    import java.util.ArrayList;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.File;
     
    /** Fenêtre pour l'affichage d'objets de type Affichable et l'interaction souris avec ces objets. L'affichage peut se faire sur un fond coloré ou sur une image. */
    public class GUIEpidemie extends JFrame implements MouseListener{
     
    	private int offset = 12;
    	private Graphic p;
    	private Color fond = null;
    	private BufferedImage img = null;
    	private ArrayList<Affichable> elements;
    	private ArrayList<MouseEvent> clics;
    	private JTextField jtf;
     
    	/** Crée une JFrame permettant d'afficher sur la couleur de fond spécifiée des Affichable ayant des coordonnées dans [0..largeur,0..hauteur]. */
    	public GUIEpidemie(String titre, int largeur, int hauteur, Color fond){
    		super(titre);
    		this.elements = new ArrayList<Affichable>();
    		this.clics = new ArrayList<MouseEvent>();
    		this.fond = fond;
    		this.setLayout(new BorderLayout());
    		this.p = new Graphic();
    		this.p.addMouseListener(this);
    		this.getContentPane().add(this.p,BorderLayout.CENTER);
    		jtf = new JTextField(20);
    		this.getContentPane().add(jtf,BorderLayout.SOUTH);
    		this.setSize(largeur,hauteur);
    		this.setResizable(false);
    		this.setLocation((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width-this.getWidth())/2,(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height-this.getHeight())/2);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
     
    	/** Crée une JFrame permettant d'afficher des Affichable sur l'image de fond spécifiée. 
              * @throws IOException si le fichier image spécifié n'existe pas ou n'est pas une image lisible. */
    	public GUIEpidemie(String titre, String fichierImage) throws IOException{
    		super(titre);
    		this.elements = new ArrayList<Affichable>();
    		this.clics = new ArrayList<MouseEvent>();
    		this.fond = fond;
    		this.img = ImageIO.read(new File(fichierImage));
    		this.setLayout(new BorderLayout());
    		this.p = new Graphic();
    		this.p.addMouseListener(this);
    		this.getContentPane().add(this.p,BorderLayout.CENTER);
    		jtf = new JTextField(20);
    		this.getContentPane().add(jtf,BorderLayout.SOUTH);
    		this.setSize(img.getWidth(),img.getHeight());
    		this.setResizable(false);
    		this.setLocation((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width-this.getWidth())/2,(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height-this.getHeight())/2);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
     
    	/** Ajoute un Affichable à l'interface et rafraichit l'affichage. */
    	public void addAffichable(Affichable a){
    		this.elements.add(a);
    		this.p.repaint();
    	}
     
    	/** Retire un Affichable de l'interface et rafraichit l'affichage. */
    	public boolean removeAffichable(Affichable a){
    		if(this.elements.remove(a)){
    			this.p.repaint();
    			return true;
    		}
    		else return false;
    	}
     
    	public void mouseClicked(MouseEvent e){
    		this.clics.add(e);
    	}
     
    	public void mouseEntered(MouseEvent e){}
     
    	public void mouseExited(MouseEvent e){}
     
    	public void mousePressed(MouseEvent e){}
     
    	public void mouseReleased(MouseEvent e){}
     
    	/** Retourne un MouseEvent correspondant au dernier clic de l'utilisateur, ou null s'il n'y a plus de clic à renvoyer. */
    	public MouseEvent getClic(){
    		if(this.clics.isEmpty()) return null;
    		else return this.clics.remove(0);
    	}
     
    	private class Graphic extends JPanel{
    		public void paint(Graphics gr){
    			if(GUIEpidemie.this.fond != null){
    				gr.setColor(GUIEpidemie.this.fond);
    				gr.fillRect(0,0,this.getWidth(),this.getHeight());
    			}
    			if(GUIEpidemie.this.img != null){
    				gr.drawImage(GUIEpidemie.this.img,0,0,this);
    			}
    			for(Affichable a:GUIEpidemie.this.elements){
    				gr.setColor(a.getColor());
    				((Graphics2D) gr).fill(a.getShape());
    				gr.setColor(Color.BLACK);
    				gr.setFont(gr.getFont().deriveFont(Font.BOLD));
    				Point p = a.getStringPosition();
    				String[] s = a.getString().split("\n");
    				for(int i=0;i<s.length;i++) gr.drawString(s[i],p.x,p.y+(i+1)*GUIEpidemie.this.offset);
    			}
    		}
    	}
     
    	/** Affiche le message m dans une boite de dialogue. */
    	public void displayMessage(String m){
    		JOptionPane.showMessageDialog(this,m);
    	}
     
    	/** Affiche le texte s dans la zone de texte en bas de la fenêtre. */
    	public void setBottomFieldText(String s){
    		this.jtf.setText(s);
    	}	
     
    }
    et Affichable.java qui va avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package display;
     
    public interface Affichable{
     
    	public java.awt.Shape getShape();
    	public java.awt.Color getColor();
    	public String getString();
    	public java.awt.Point getStringPosition();
    }
    donc j'ai mon main :
    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
     
    import display.*;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import java.lang.IllegalArgumentException;
    import java.util.ArrayList;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.File;
     
    public class projet {
     
        //@param args
     
        public static void main(String[] args){
            //création du tableau de vaccins :
            Affichable p;
            //Ville[] tableau = new Ville[6];
            //Vaccin[] lestock = new Vaccin [100];
     
            //random ensuite un chiffre, qui correspond à une ville, pour savoir comment seront distribués les stocks etc (il faut remplir la classe après)
     
            Ville villetest = new Ville()
            Color fond = new Color (0.0f, 0.0f, 0.0f);
             GUIEpidemie a = new GUIEpidemie("Titre", 180, 300, fond);
            //GUIEpidemie a = new GUIEpidemie ("teste", 640, 480, fond);
     
            try {
                GUIEpidemie b = new GUIEpidemie ("test2", "carte.jpg");
                a.addAffichable(p);
            } catch (IOException e) {
                System.out.println("ERROR");
            }
            //a.displayMessage(r);
     
            System.out.println("Lel");
        }
    }
     
    // DEBUT BOUCLE JEU
     
    }
    et par exemple j'aimerais faire apparaître des carrés qui symboliseront les villes, donc j'ai implémenté Affichable dans ma classe :

    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
    import display.*;
    import java.awt.*;
     
    public class Ville implements Affichable {
     
    	String nom;
    	int population;
    	int x;
    	int y;
    	int taille;
    	public Ville(String pNom, int pPopulation, int px, int py, int pTaille){
    		this.nom = pNom;
    		this.population = pPopulation;
    		this.x = px;
    		this.y = py;
    		this.taille = pTaille;
    	}
    	public java.awt.Shape getShape(){
    		Rectangle bounds = new Rectangle(0, 0, -1, -1);
    		return bounds;
     
    	}
    	public java.awt.Color getColor(){
    		Color couleur = new Color(0, 0, 255);
    		return couleur;
    	}
    	public String getString(){
    		return this.nom;
    	}
    	public java.awt.Point getStringPosition(){
    		Point position = new Point (this.x, this.y);
    		return position;
    	}
     
    	public void Afficher(){
     
    	}
    }
    Sauf que voilà dans "Afficher()" je bloque je sais pas du tout comment m'y prendre?

    je croisq u'il faut utiliser addAffichable() qui est dans GUIEpidemie.java (le 1er code là) mais ce qui me trouble c'est le fichier qu'il faut mettre en paramèe, il doit être de type "Affichable"

    vous avez une idée de comment il faudrait que je fasse ma classe Afficher() pour qu'elle affiche un point sur la carte que j'affiche dans mon main ?

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Il n'y a pas de méthode "Afficher()" dans l'interface "Affichable", donc c'est peut-être pour ça que tu bloques !

    Si je comprends bien le code qu'on t'a donné, le but du jeu est que tu implémentes correctement l'interface Affichable, que tu passes les instances de tes objets Affichables à ton GUIEpidemie qui va se charger d'afficher ton élément affichable.


    Et je précise parce que je me rends compte que ma réponse est un peu courte :
    Le GUIEpidemie est la base de l'affichage. Il a deux constructeurs, donc un avec une image, à toi d'utiliser celui que tu veux pour afficher ton "fond".
    A ce fond, tu dois ajouter des éléments affichables : une Ville, une Route, etc... qui sont autant d'objets "Affichable"s
    Ton but est donc de créer les classes des objets affichables avec chacun possédant ses propriétés, et de les passer à ton "fond" qui se chargera de les afficher (ou de les supprimer)

    Donc normalement, pour afficher ton carré, il suffit d'ajouter un objet Affichable à ton GUIEpidemie
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ouais ouais c'est normal c'est moi qui veut la faire la méthode Afficher ! ^^
    en me servant justement de Affichable.java et de addAffichable() (dans GUIEpidemie)
    mais je sais pas trop comment faire en fait
    y a qqun qui m'a dit que j'devais faire genre un
    a.addAffichable((Affichable) ville);

    genre en castant ville en Affichable mais ça change rien du tout c'est étrange

    et j'ai pas le droit de modifier GUIEpidemie aussi

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par Henley Voir le message
    a.addAffichable((Affichable) ville);
    Pas besoin du cast : Ville EST-UN Affichable

    Et je répète ma question : que veux-tu faire dans ta fonction afficher? Si l'idée c'est de faire en sorte que ta ville s'affiche sur ta frame, c'est déjà géré dans la classe GUIEpidemie, dans la méthode addAffichable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /** Ajoute un Affichable à l'interface et rafraichit l'affichage. */
    	public void addAffichable(Affichable a){
    		this.elements.add(a);
    		this.p.repaint();
    	}
    Ce bout de code permet de dire :
    - Je prend l'objet de type Affichable qu'on me passe en paramètre
    - Je le met dans ma liste d'éléments
    - Je rafraîchis l'affichage

    Du coup, normalement tu n'as pas à essayer de contrôler dans Ville comment tu veux afficher dans ton UI.


    Mais je pense que ton problème est ailleurs : essayes ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     public static void main(String[] args){
            Color fond = new Color (0.0f, 0.0f, 0.0f);
     
            //création de l'UI
            GUIEpidemie a = new GUIEpidemie("Titre", 180, 300, fond);
            //création d'une ville
            Ville villetest = new Ville("Paris", 10000, 0, 0, 1000);
                 //Ajout de la ville
                a.addAffichable(villetest);
     
     
            System.out.println("Lel");
        }
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    ah mince mince j'avais pas vu ton message mais j'ai trouvé entre temps !
    je reposterais si j'ai un autre problème
    merci quand même !

Discussions similaires

  1. probléme au moment de la création d'une nouvelle classe
    Par Djug dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 22/01/2009, 11h19
  2. [eZ Publish] création d'une nouvelle classe
    Par easyjava dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/12/2007, 08h28
  3. création d'une dll (classe c++)
    Par TheShadow dans le forum MFC
    Réponses: 4
    Dernier message: 10/04/2006, 16h21

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