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 :

Rendre visible/invisible un sprite


Sujet :

Java

  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut Rendre visible/invisible un sprite
    Bonjour tout le monde,

    Je suis encore débutante en Java et je voudrais savoir comment on peut rendre une Arraylist invisible par défaut pour que, lorsque je lance le programme, je ne puisse la rendre visible que lorsqu'il y a une action précise (le contact de mon personnage avec une autre ArrayList).

    Est-ce qu'il y a un terme à l'inverse de Arraylist.remove qui permet de la créer/rendre visible l'ArrayList ou quelque chose comme ça ?

    Si besoin est, je peux mettre une image à l'appui pour expliquer ma demande si n'est pas assez compréhensible.

    En tout cas, merci d'avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une ArrayList est une structure de données. Qu'est-ce que tu entends pas visible/pas visible pour une structure de données ?

    Si tu as besoin de créer cette structure seulement au terme d'une action particulière, et bien, tu la crées à ce moment (créer = new ...). Tu peux créer n'importe quel objet à n'importe quel moment.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Merci de ta réponse.
    J'ai un ensemble d'objets, les champignons, dont je souhaite qu'ils ne soient visibles que lorsque mon personnage entre en contact avec les blocs mystères.
    J'ai fait une ArrayList puisqu’il y aura plusieurs Champignons



    Est-ce que ma réponse t'a aidé ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Donc ce n'est pas l'ArrayList qui doit être visible, mais des éléments à l'écran (des sprites a priori). Donc peu importe que tu stockes tes "champignons" dans une liste ou autre chose, il te faut simplement pouvoir savoir qu'un champignon est affiché ou pas. Si chaque champignon peut être visible indépendamment des autres (certains sont visibles, d'autres pas), le plus simple est de gérer un champignon avec une classe qui a un attribut booléen. Ainsi, tu vas avoir une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Mushroom extends Sprite {
     
        private boolean visible;
     
        public void setVisible(boolean visible) {
             this.visible=visible;
        }
     
        public boolean isVisible() {
            return this.visible;
        }
     
    }
    Et donc une List<Mushroom> mushrooms qu'il te suffira te parcourir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(Mushroom mushroom : mushrooms) {
        if ( mushroom.isVisible() ) {
             drawSprite(mushroom); // on affiche le champignon
        }
    }
    Si tous les champignons sont visibles à la fois ou invisible à la fois, tu peux procéder de la même façon, ou gérer un seul booléen externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( showMushrooms ) {
         for(Mushroom mushroom : mushrooms) {
             drawSprite(mushroom); // on affiche le champignon
         }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Merci de ta réponse.

    J'essaie depuis un moment, mais ça ne fonctionne pas. Je pense que le problème viens de deux endroits:
    - Je n'ai pas de classe nommé Sprite (j'ai un dossier image)
    -Il me demande de construire la méthode isVisible dans la classe Champ (ou Mushrooms dans ton exemple), or je l'ai déjà créé. C'est comme si elle ne l'a lisait pas.

    Est-ce que le fait que ma classe Champ soit une super class peux poser problème ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aliez Voir le message
    - Je n'ai pas de classe nommé Sprite (j'ai un dossier image)
    Peu importe, c'était juste le principe. Mais en avoir une pourra te simplifier le code.

    Citation Envoyé par Aliez Voir le message
    -Il me demande de construire la méthode isVisible dans la classe Champ (ou Mushrooms dans ton exemple), or je l'ai déjà créé. C'est comme si elle ne l'a lisait pas.
    Est-ce que le fait que ma classe Champ soit une super class peux poser problème ?
    [/quote]
    Non, en général. Mais il faudrait voir quelle est exactement la hiérarchie de ta classe Champ. Tu peux me montrer ton code, ce sera plus simple pour voir quel est le problème ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Peu importe, c'était juste le principe. Mais en avoir une pourra te simplifier le code.
    Tu me l'apprends. D'ailleurs tu m'apprends pas mal de chose et je t'en remercie.

    Voici le screen de ma class Champ :

    Nom : 1501863562-capture2.jpg
Affichages : 1211
Taille : 217,3 Ko


    La deuxième partie de ton code se trouve dans la Classe Scene puique c'est dans cette class que se positionne la plupart de mes méthodes. De plus, j'ai moins d'erreurs quand je le place dans cette classe donc je m'étais dit que c'était le bon emplacement.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Quand je parlais de mettre ton code, je parlais d'utiliser le système intégré, décrit dans cette animation :

    Ce sera plus facile à lire, et surtout, je pourrai faire des copier/coller.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Ah oui d'accord j'avais pas compris.

    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
    package com.julie.personnages;
    import java.awt.Image;
    import javax.swing.ImageIcon;
    import com.julie.Main;
    import com.julie.objet.objet;
    public class Champ extends Personnages implements Runnable {
     
    	// VARIABLE
    	private Image imgChamp;
    	private ImageIcon icoChamp;
     
    	private final int PAUSE = 15;
    	private int dxChamp;
     
    	// CONSTRUCTOR
    	public Champ(int x, int y){
    		super(x, y, 17, 30);
    		super.setVersDroite(true);
    		super.setMarche(true);
     
    		this.icoChamp = new ImageIcon(getClass().getResource("/image/champArretDroite.png"));
    		this.imgChamp = this.icoChamp.getImage();
     
    		Thread chronoChamp = new Thread(this);
    		chronoChamp.start();	}
     
    	// GETTERS
    	public Image getImgChamp(){return imgChamp;}
     
    	// METHODES
    	public void bouge(){
    		if(super.isVersDroite() == true){this.dxChamp = 1;}
    		else{this.dxChamp = -1;}
    		super.setX(super.getX() + this.dxChamp);
    		}
    public void run(){
    		try{Thread.sleep(20);}
    		catch (InterruptedException e){}	
     
    		while(true){
    			this.bouge();
    			try{Thread.sleep(PAUSE);}
    			catch (InterruptedException e){}	}}
     
    public void recontact (objet objet){
     
    	 	// contact avec un objet en dessous
    	if(super.contactDessous(objet) == true) {  // Mario saute sur un objet
    		Main.scene.setySol(objet.getY());
    	}else if(super.contactDessous(objet) == false){ // Mario tombe sur le sol initial
    		Main.scene.setySol(293);   // altitude du sol initial
    		{this.setY(265);}	}}	 // altitude initial de mario	
     
    private boolean visible;
     
    public void setVisible(boolean visible) {
         this.visible=visible; }
     
    public boolean isVisible() {return this.visible;  }}

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Mais tu appelles setVisible(true) quelque part ? Parce par défaut le champignon est invisible (visible=false par défaut). Tu dois avoir un mécanisme qui fait apparaître le champignon (une collision par exemple), et qui appelle setVisible(true) sur l'instance de champignon. Aussi, il faudrait ne pas déplacer le champignon lorsqu'il est invisible (enfin, on peut imaginer un champignon invisible qui se déplace, mais normalement, tant qu'il n'est pas visible, il n'est pas censé se déplacer à priori).
    Au lieu d'utiliser un thread, un Timer serait plus simple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Bonjour, navré pour cette absence (les vacances)

    Alors j'y arrive toujours pas.
    J'ai mis dans la classe Champ ceci :

    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
    Private boolean visible;
     
    Public void setVisible (boolean visible, objet objet) {
        If(super.contactDessous(objet) == true) { 
            this.visible=true;
        }
        else if (super.contactDessous (objet) == false) {
            this.visible = false;
        }
    }
     
    public boolean isVisible() {
        If (this.visible == true) {
             return true;
        }
        else { 
             return false;
        }
    }
    Et dans la classe principale (Scene)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (Champ Champ : tabChamp) {
        If (Champ.isVisible()){
            drawSprite(champ);
        }
    }
     
    private void drawSprite(com.julie.personnages.Champ champ) {
        for (int i = 0; i < this.tabblocmystere.size(); i++)
            if (this.mario.contactblocmystere(this.tabblocmystere.get(i)) == true) {
                drawSprite(Champ);
            }
       }
    Si je mets drawimage puis drawSprite il ne veut pas et si je mets drawImage ou drawSprite au deux, ça ne fonctionne toujours pas

    Sorry mais je ne vois toujours pas comment faire

    Envoyé depuis Smartphone

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Avant tout, toutes ces majuscules qu'on voit partout, ce sont des fautes de frappes dans ton post ou ton code que tu as copié-collé ? Parce que même si ton code n'est pas comme ça (s'il l'est, alors il ne compile pas), c'est quand même un peu plus lisible sans. Idem pour les conventions Java.

    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void setVisible (boolean visible, objet objet) {
        If(super.contactDessous(objet) == true) { 
            this.visible=true;
        }
        else if (super.contactDessous (objet) == false) {
            this.visible = false;
        }
    }
    C'est bien une méthode qui sert à rendre visible un champignon, ou pas visible, en agissant sur l'état qui correspond, soit la variable visible. Que viennent faire :
    • le paramètre objet ? A quoi sert-il ? Que représente-t-il ? Pourquoi aurait-on besoin d'un paramètre dans un mutateur (setter) autre que la valeur à affecter
    • C'est quoi cette méthode concteDessous ? C'est quoi le rapport dans le changement d'état "visible" ?
    • Pourquoi le seul paramètre à priori pertinent, visible, n'est-il pas utilisé ?


    Et même si ce code était le bon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void setVisible (boolean visible, objet objet) {
        If(super.contactDessous(objet) ) { 
            this.visible=true;
        }
        else {
            this.visible = false;
        }
    }
    serait plus clair, plus concis.
    On peut faire aussi plus concis (même si dans ce cas, je veux bien admettre que pour beaucoup de débutant, c'est plus difficile à appréhender que le code ci-avant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setVisible (boolean visible, objet objet) {
        this.visible = super.contactDessous(objet);
    }
    M'enfin, un setter, c'est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setVisible(boolean visible) {
          this.visible=visible;
    }
    Ensuite, tu peux faire éventuellement, par commodité (convenience):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setVisible (objet objet) {
        setVisible( super.contactDessous(objet) );
    }
    Aussi faut-il que la méthode soit appelée quelque part, comme je l'ai déjà dit...

    Ensuite, il y a un énorme souci dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void drawSprite(com.julie.personnages.Champ champ) {
        for (int i = 0; i < this.tabblocmystere.size(); i++)
            if (this.mario.contactblocmystere(this.tabblocmystere.get(i)) == true) {
                drawSprite(Champ);
            }
       }
    Parce que de deux choses l'une :
    1. si le code est bien drawSprite(Champ);, alors je ne vois pas bien ce que fait cette méthode (Champ est une classe, drawSprite est à priori une méthode pour dessiner un sprite. Qu'est-ce que pourrait bien être un sprite correspondant à une classe ?
    2. et si le code est drawSprite(champ); ce qui est plus logique mais très problématique, parce que tu as une méthode qui potentiellement s'appelle elle-même. Donc tu obtiendras une stackoverflow error si this.tabblocmystere.size() > 0. Et si cette taille est 0, alors la méthode ne fait rien, donc ne risque pas d'afficher quoique ce soit.


    Voici un exemple : par défaut, les champignons ne sont pas affichés. Il y a une case à cocher pour chaque, il suffit de la cocher pour afficher le champignon correspondant. Décoche-là le champignon redevient invisible.
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    public class Champignon {
     
    	public static final int SPRITE_SIZE = 64;
     
    	private int x;
    	private int y;	
    	private final Image image;
    	private boolean visible;
     
    	public Champignon() {
    		image = loadImage();
    	} 
     
    	public int getX() {
    		return x;
    	}
     
    	public void setX(int x) {
    		this.x = x;
    	}
     
    	public int getY() {
    		return y;
    	}
     
    	public void setY(int y) {
    		this.y = y;
    	}
     
    	public boolean isVisible() {
    		return visible;
    	}
     
    	public void setVisible(boolean visible) {
    		this.visible = visible;
    	}
     
    	private Image loadImage() {
    		// ici je construis l'image en mémoire pour que la classe puisse marcher sans fichier,
    		// mais c'est juste pour l'exemple
    		// ne fait pas attention à ce code et imagine que ça charge un fichier .png
    		BufferedImage image = new BufferedImage(SPRITE_SIZE, SPRITE_SIZE, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g = image.createGraphics();
    		try {
    			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    			g.setColor(Color.WHITE);
    			g.fillRect(SPRITE_SIZE/4, SPRITE_SIZE/2, SPRITE_SIZE/2, SPRITE_SIZE/2); 
    			g.setColor(Color.RED); 
    			g.fillArc(0, 0, SPRITE_SIZE, SPRITE_SIZE, 0, 180);
    		}
    		finally {
    			g.dispose();
    		}
    		return image;
    	}
     
    	public void drawSprite(Graphics g) {
    		g.drawImage(image, x, y, null);
    	}
     
    	// exemple de programme utilisant ce sprite de champignon
    	public static void main(String[] args) {
     
    		final int nbChamp = 10;
     
    		// l'écran de jeu où on va afficher les champignons
    		class GameBoard extends JPanel {
     
    			private Champignon[] champignons; // l'ensemble des champignons à afficher
     
    			public GameBoard() {
    				super(true);
    				setBackground(Color.BLACK);
    				// initialise les champignons
    				champignons = new Champignon[nbChamp];
    				for(int i=0; i<champignons.length; i++) {
    					Champignon champignon = new Champignon(); 
    					champignon.setX(SPRITE_SIZE/2+i*SPRITE_SIZE*2);
    					champignons[i] = champignon;
    				}
    			}
     
    			// on redéfinit la méthode de dessin de JPanel pour qu'il dessine les champignons
    			@Override
    			protected void paintComponent(Graphics g) {
    				super.paintComponent(g);
    				for(Champignon champignon : champignons) { // on parcourt tous les champignons
    					if ( champignon.isVisible() ) { // si le champignon est visible
    						champignon.drawSprite(g); // je l'affiche
    					}
    				}
    			}
     
    			/**
                             * permet de manipuler un champignon par son index
                             */
    			public Champignon getChampignon(int i) {
    				return champignons[i];
    			}
     
    		}
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel(new BorderLayout());
    		GameBoard gameBoard = new GameBoard();
    		panel.add(gameBoard);
    		// on créé une checkbox pour chaque champignon
    		JPanel panelCheckbox = new JPanel(new FlowLayout(FlowLayout.CENTER));
    		for(int i=0; i<nbChamp; i++) {
    			JCheckBox checkbox = new JCheckBox(String.valueOf(i+1));
    			int index = i;
    			// permet à la boite à cocher de modifier la visibilité du champignon auquel elle est associée
    			checkbox.addActionListener(e-> {
    				gameBoard.getChampignon(index).setVisible( checkbox.isSelected() ); // mettre la visibilité du champignon à jour par rapport à l'état de la checkbox
    				gameBoard.repaint(); // mettre à jour l'affichage
    			});
    			panelCheckbox.add(checkbox);
    		}
    		panel.add(panelCheckbox, BorderLayout.SOUTH);
     
    		// une petit timer pour l'animation, à la limite, tu ignores ça si tu ne comprends pas comment ça fonctionne
    		int[] dy = new int[nbChamp];
    		for(int i=0; i<dy.length; i++) {
    			dy[i]=Math.max(SPRITE_SIZE/10,2);
    		}
    		Timer timer = new Timer(33,e-> {
    			boolean anim=false;
    			for(int i=0; i<nbChamp; i++) {
    				Champignon champignon = gameBoard.getChampignon(i);
    				if ( champignon.isVisible() ) { // on ne bouge que les champignons visibles
    					anim=true;
    					int y = champignon.getY() + dy[i];
    					if ( y+SPRITE_SIZE > gameBoard.getHeight() ) {
    						y = gameBoard.getHeight()-SPRITE_SIZE;
    						dy[i]=-dy[i];
    					}
    					else if ( y<0 ) {
    						y = 0;
    						dy[i]=-dy[i];
    					}
    					champignon.setY(y);
    				}
    			}
    			if ( anim ) {
    				gameBoard.repaint();
    			}
    		});
    		timer.start();
    		frame.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosed(WindowEvent e) {
    				timer.stop();
    			}
    		});
    		// fin de la partie animation
     
    		frame.add(panel);
     
    		frame.setResizable(false);
    		frame.setSize(nbChamp*SPRITE_SIZE*2, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    C'est mon code qui contient des majuscule. Cela m'aidait à me repérer.

    J'avais mis la méthode ContactDessous (qui correspond à Mario quand il rentre en contact avec un objet par dessous) pour que le champignon n'apparaisse que lorsque Mario rentre en contact avec un objet.
    Mais j'ai bien compris que ce n'était pas là sa place.

    Toutefois je n'y arrive toujours pas, sûrement parce que l'exemple que tu m'as donnée et qui m'aide à comprendre la logique, est pour un Sprite dessinée or moi ce sont des sprites png et à mon niveau, je n'arrive pas encore à géré.

    Si cela peut t'aider, j'ai mis en archive Zip mon dossier du jeu (j'ai supprimé le code des set.visibles pour qu'il n'y ait pas d'erreur).

    Si tu ne comprends pas pourquoi il y a une image d'Harmonie au-dessus du champignon c'est que c'est une image par défaut que je vais remplacer. Comme le champignon, elle fait partie d'une ArrayList (mise dans la classe Scène) qui va inclure d'autres images mais qui répondront toutes à la méthode de "visible et animée lorsque Mario rentre en contact avec les blocs et invisible par défaut".
    Ainsi, le code que j'essaie d'apprendre via ton aide servira en réalité surtout pour l'ArrayList "photos".
    Fichiers attachés Fichiers attachés

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aliez Voir le message
    C'est mon code qui contient des majuscule. Cela m'aidait à me repérer.
    Oui, m'enfin, les mots clefs Java sont toujours entièrement en minuscules, et Java est sensible à la casse, donc Public ne sera jamais considéré comme public, ni If comme if. Pour se repérer, il y a la colorisation syntaxique !

    Citation Envoyé par Aliez Voir le message
    J'avais mis la méthode ContactDessous (qui correspond à Mario quand il rentre en contact avec un objet par dessous) pour que le champignon n'apparaisse que lorsque Mario rentre en contact avec un objet.
    Mais j'ai bien compris que ce n'était pas là sa place.
    Oui, parce qu'une collision est un événement particulier, qui déclenche éventuellement l'apparition d'un truc. Donc, il vaut mieux découpler cet événement de la notion de rendre visible ou pas.
    Ce genre de chose se programme plutôt par déclencheur (trigger). Et au lieu de rendre visible un champignon, on le crée. En généralisant la notion de trigger, on va programmer son jeu en mettant en place des règles du genre s'il se passe ceci alors on fait ça, comme par exemple, si le personnage est en collision avec le bloc n°283, on crée un "monstre" au coordonnées x1,y1,

    Citation Envoyé par Aliez Voir le message
    Toutefois je n'y arrive toujours pas, sûrement parce que l'exemple que tu m'as donnée et qui m'aide à comprendre la logique, est pour un Sprite dessinée or moi ce sont des sprites png et à mon niveau, je n'arrive pas encore à géré.
    Comme je l'ai dit, c'est exactement la même chose : le png est chargé dans un objet de classe Image et moi je dessine dans un objet de classe Image. Et afficher un objet de classe Image c'est comme dessiner un objet de classe Image, c'est la même chose, à l'évidence...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2010, 12h04
  2. Superposer les textarea puis rendre visible/invisible
    Par icicmoi dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 11/08/2008, 13h16
  3. Rendre visible / invisible plusieurs éléments en même temps
    Par Bluespike62 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/01/2006, 17h43
  4. [FLASH 8] Rendre visible/invisible un bouton sur un clic
    Par PrinceMaster77 dans le forum Flash
    Réponses: 11
    Dernier message: 10/01/2006, 15h08
  5. Réponses: 2
    Dernier message: 06/05/2005, 21h45

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