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 :

Animation d'un JLabel contenant une image


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut Animation d'un JLabel contenant une image
    Salut,

    *)Introduction:
    La classe "main" ,"image" et "image util" fonctionne normalement.

    *)Présentation:
    Voila je voudrais que une image contenue dans un "JLabel",parte du haut de l'écran puis descende progressivement jusqu'à arriver en bas de la fenêtre puis ce mm "JLabel" reprend une position aléatoire en haut de la fenêtre.
    voir img:
    Nom : prb.png
Affichages : 903
Taille : 8,8 Ko

    *)Problème:
    Mon problème concerne "seulement" la partie animation.Tout le reste fonctionne(affichage,gestion de la position aléatoire).

    *)Précision:
    Je tiens à préciser que j'ai vue les threads "officieusement"

    *)Code:

    Classe Obstacle:
    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
    public class Obstacle extends JPanel {
     
    int posX,posY;
     
    public int getPosX(){
    	return this.posX;
    }
    public void setPosX(int posX){
    	this.posX=posX;
    }
    public int getPosY(){
    	return this.posY;
    }
    public void setPosY(int posY){
    	this.posY=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
     
    Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    JLabel labImgObstacle =null;
     
    public void fctMvtObstacle(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int posXDepart=fctHasard(0,fenPrincipale.getWidth()),posYDepart=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    	boolean continuer=true;
     
    	posX=posXDepart;
    	posY=posYDepart;
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    	panPrincipale.add(labImgObstacle);
     
    	/*while(continuer){
    		posY++;
    		//remetlefondvierge
    		labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    		panPrincipale.add(labImgObstacle);
    		if(posY==fenPrincipale.getHeight()){
    			posX=fctHasard(0,fenPrincipale.getWidth());
    			posY=-ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			//remet le fond vierge
    			labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    			panPrincipale.add(labImgObstacle);
    		}
     
    	}*/
     
    }
     
    }
    Classe 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class Main extends JPanel {
     
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		//Principale
    		JFrame fenPrincipale=new JFrame("-ProjetNfa032-");//On definit la JFrame //fen=fenetre
    		JPanel panPrincipale=new JPanel();
            fenPrincipale.setSize(new Dimension(1024,768));
            fenPrincipale.setResizable(false);
            fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            int framWidth=fenPrincipale.getWidth() , framHeight=fenPrincipale.getHeight();
     
     
            //Joueur
            Image imgJoueur =new Image("C:\\Users\\antoine\\Desktop\\imgProjetJoueur.gif");
            JLabel labImgJoueur=null;
            try {
    			labImgJoueur=imgJoueur.fctAfficherImg(panPrincipale, framWidth/2,framHeight-150,ImageUtil.getImageWidth(imgJoueur.adresseImg), ImageUtil.getImageHeight(imgJoueur.adresseImg));
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
            panPrincipale.add(labImgJoueur);
     
           //Obstacle
            Obstacle obstacle1=new Obstacle();
            try {
    			obstacle1.fctMvtObstacle(fenPrincipale, panPrincipale);
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
            //fond
            Image imgFond= new Image("C:\\Users\\antoine\\Desktop\\imgProjetFond.jpg");
            JLabel labImgFond = null;
            try {
    			labImgFond=imgFond.fctAfficherImg(panPrincipale, 0,0,ImageUtil.getImageWidth(imgFond.adresseImg), ImageUtil.getImageHeight(imgFond.adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            panPrincipale.add(labImgFond);
     
     
            //
            fenPrincipale.add(panPrincipale);
            fenPrincipale.setVisible(true);
     
    	}
     
    }
    Merci à vous.
    Bonsoir.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu arrive déjà à positionner ta boule où tu veux, le plus simple pour l'animation, c'est d'utiliser un swing Timer, c'est dédié à la gestion entre autres d'animations. Une méthode que tu définis sera appelée X fois par seconde. A toi d'y calculer une position et de positionner l'élément comme tu y arrive déjà.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void bouger(ActionEvent e){
    //faire une étape du mouvement
    }
    //......
     
      int delay = 200; // (5 fois par seconde)  
      new Timer(delay, this::bouger).start();

  3. #3
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Tchize//

    *)
    Merci à toi.Cependant peux tu me donner une exemple de code avec cette fonction.Et surtout aprés je vais devoir créer et gérer un personage qui se déplace de gauche à droite.Cette technique est elle alors adaptée ?

    *)De plus je souhaite que l'animation se lance automatiquement à l'ouverture de la fenêtre dans ce cas je n'ai donc pas de "Action event".

    *)Mais aussi qd je lance mon programme aucune erreur n'apparait mais mon ordi il tourne dans le vide à l'infini.

    Et si d'autres personnes ont d'autres solution.

    Merci à vous en tout cas.

    EDIT 1:

    Voici le nouveau code de ma classe obstacle plus claire,je trouve:

    Remarque:Le probléme vient de ttes évidences de la méthode "fctMouvement()" en effet dés que je ne l'appel pas tout s'affiche correctement,sans animation bien sur.
    SVP j'ai vraiment besoin d'aide je ne vois vraiment pas ou est l'erreur d'autant plus que l'ordi ne me renvoie aucune erreur il se contente de tourner indéfiniment sans rien afficher...

    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 class Obstacle extends JPanel  {
     
    //Position
    int posX,posY;
    public int getPosX(){
    	return this.posX;
    }
    public void setPosX(int posX){
    	this.posX=posX;
    }
    public int getPosY(){
    	return this.posY;
    }
    public void setPosY(int posY){
    	this.posY=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
    //Image Obstacle
    Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    JLabel labImgObstacle =null;
     
    public void fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int posXDepart=fctHasard(0,fenPrincipale.getWidth()),posYDepart=ImageUtil.getImageHeight(imgObstacle.adresseImg);
     
     
    	posX=posXDepart;
    	posY=posYDepart;
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    	panPrincipale.add(labImgObstacle);
     
    	//fctMouvement(fenPrincipale, labImgObstacle ,panPrincipale,posX,posY);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JLabel labImgObstacle , JPanel panPrincipale,int posX ,int posY) throws IOException{
    	boolean continuer=true;
     
    	while(continuer){
    		posY++;
    		labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    		panPrincipale.add(labImgObstacle);
    		panPrincipale.repaint();//remetlefondvierge
    		if(posY==fenPrincipale.getHeight()){
    			posX=fctHasard(0,fenPrincipale.getWidth());
    			posY=-ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			//remet le fond vierge
    			labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    			panPrincipale.add(labImgObstacle);
    		}
    	}
    }
     
     
    }

  4. #4
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Bonjour,

    *)Problème en partie résolu.

    En effet j'ai mantenant une "trainée"(voir capture d'écran) et surtout je n'ai pas "l'illusion du mouvement".Cette image s'affiche directement je ne vois pas l'avion bouger.Pourquoi?
    Nom : Capture.JPG
Affichages : 778
Taille : 50,7 Ko

    *)nouvelle classe:
    Voici donc ma nouvelle "classe Obstacle":
    Remarque:Pour rendre le mouvement infini changer en :
    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
    public class Obstacle extends JPanel  {
     
    //Position
    private int posXo,posYo;
    public int getPosXo(){
    	return this.posXo;
    }
    public void setPosXo(int posX){
    	this.posXo=posX;
    }
    public int getPosYo(){
    	return this.posYo;
    }
    public void setPosYo(int posY){
    	this.posYo=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
    //
    private Main main1=new Main();
     
    //Image Obstacle
    public Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    public JLabel labImgObstacle =null;
    private int i=0;//pour que le tirage au sort ne se fasse qu'une fois
     
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) throws IOException{
     
    	if(i==0){
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    	panPrincipale.add(labImgObstacle);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
     
    //Mouvement Obstacle
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true;
     
    	System.out.println("indice posXo:"+tabPos[0]+" ,posYo:"+tabPos[1]);
    	do{
    		//main1.fctFond();
    		posYo++;
    		System.out.println("-indice X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    		continuer ++;
    	}while(continuer<1000);
    }
     
     
    }

  5. #5
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Probléme résolu

    Cependant mon fond disparait et la trainé de l'avion reste.

    Voici ma nouvelle classe Obstacle:
    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
    public class Obstacle extends JPanel  {
     
    //Position
    private int posXo,posYo;
    public int getPosXo(){
    	return this.posXo;
    }
    public void setPosXo(int posX){
    	this.posXo=posX;
    }
    public int getPosYo(){
    	return this.posYo;
    }
    public void setPosYo(int posY){
    	this.posYo=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
    //
    private Main main1=new Main();
     
    //Image Obstacle
    public Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    public JLabel labImgObstacle =null;
    private int i=0;//pour que le tirage au sort ne se fasse qu'une fois
     
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) throws IOException{
     
    	if(i==0){
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    	panPrincipale.add(labImgObstacle);
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
     
    //Mouvement Obstacle
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    	while(continuer<10000){
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    		//main1.fctFond();
    		try {
    	         Thread.sleep(0);
    	    } catch (InterruptedException e) {
    	         e.printStackTrace();
    	    }
    		continuer ++;
     
    	}
    }
     
     
    }

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Tchize//

    Merci à toi.Cependant peux tu me donner une exemple de code avec cette fonction.
    C'est ce que j'ai fait, t'as juste à remplacer le contenu de la méthode par un truc du genre "bougerLAvionDunCran", ce que tu fais déjà (et mal j'y reviens)
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Et surtout aprés je vais devoir créer et gérer un personage qui se déplace de gauche à droite.Cette technique est elle alors adaptée ?
    C'est une technique qui te permet d'avoir la main toutes les X millisecondes pour faire un changement graphique. C'est assez adapté pour commencer

    Citation Envoyé par Pif_Paf_Pouf Voir le message
    De plus je souhaite que l'animation se lance automatiquement à l'ouverture de la fenêtre dans ce cas je n'ai donc pas de "Action event".
    Ce n'est pas à toi de fournir cet ActionEvent, tu le reçois (cf c'est un paramètre de ta méthode qui est appelée par swing). Après tu peux l'ignorer t'en a pas besoin pour cet exemple.

    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Probléme résolu

    Cependant mon fond disparait et la trainé de l'avion reste.
    Ta méthode est complètement erronée.
    D'abord tu as une boucle infinie, ce qui ne peut vouloir dire que deux chose:
    • Soit cette boucle tourne dans le Thread Graphique et alors tu ne vois rien car tu monopolise ce thread en empechant swing de faire ses dessins => ce n'est pas bon
    • Soit cette boucle travaille dans le Thread principal de l'application (ce qui semble être le cas). Dans ce cas tu ne peux pas appeler des méthodes sur les composant swing (les add que tu fais, par exemple), c'est interdit de le faire en dehors du Thread graphique et au mieux ton code "tombe en marche".


    Bref il suffit que tu prenne ce qui se trouve entre les crochets du while (hormis le sleep) et que tu le tappe dans la méthode que je t'ai montré avant pour faire fonctionner ton code à l'identique.

    Enfin, la trainée. Ton code se contente d'ajouter un nouveau JLabel 1pixel plus bas à chaque boucle. C'est sympa, mais tu n'a pas supprimé le label précédent => Sur ton image il n'y a pas 1 mais quelques centaines de JLables présents dans la fenêtre. Soit tu supprime le label (un peu lourd) soit tu te content de le déplacer en changeant ses coordonées.


    Je te conseille de jeter un oeil aux docs suivantes:

    http://java.developpez.com/faq/gui/?...#GRAPHIQUE_EDT
    http://java.developpez.com/faq/gui/?...UE_SWING_Timer

  7. #7
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Tchize//

    Je vais essayer en tt cas merci à toi la je faisais un peu "traversée du désert avec mes réponses à mes postes".

    Mon code ressemble à ça mtn.Je précise que l'animation se fit,laisse une trainée puis l'image de fond apparait avec les trainée qui reste.Voila ce que je vois à la fin:
    Nom : Capture.JPG
Affichages : 731
Taille : 50,7 Ko
    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
    public class Obstacle extends JPanel  {
     
    //Position
    private int posXo,posYo;
    public int getPosXo(){
    	return this.posXo;
    }
    public void setPosXo(int posX){
    	this.posXo=posX;
    }
    public int getPosYo(){
    	return this.posYo;
    }
    public void setPosYo(int posY){
    	this.posYo=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
    //
    private Main main1=new Main();
     
    //Image Obstacle
    private Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    private JLabel labImgObstacle =null;
    private int i=0;//pour que le tirage au sort ne se fasse qu'une fois
     
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) throws IOException{
     
    	if(i==0){//position de depart de l'img
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,ImageUtil.getImageWidth(imgObstacle.adresseImg), ImageUtil.getImageHeight(imgObstacle.adresseImg));
    	panPrincipale.add(labImgObstacle);
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
     
    //Mouvement Obstacle
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    	while(continuer<1000){
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    		continuer ++;
     
    	}
    }
     
     
    }

  8. #8
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Bonsoir,

    *)En essayant de suivre tes conseils au mieux j'ai fait ça:

    Mais une erreur mais renvoyée avant que je compile à la ligne 23:
    Multiple markers at this line
    - The type Obstacle does not define fctMouvement(ActionEvent) that is
    applicable here
    Code
    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
    //Mouvement Obstacle
    public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=ImageUtil.getImageHeight(imgObstacle.adresseImg);
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    }
     
    public void fctMouvement(){
    	int delay = 200 ; // (5 fois par seconde)  
    	new Timer(delay, this::fctMouvement).start();
    }

  9. #9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    L'erreur te dit qu'il n'y a pas de méthode fctMouvement(ActionEvent e) dans ta classe Obstacle, ce qui est le cas, puisque la méthode est fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale).

    Tu peux t'en sortir

    • en passant ces paramètres à la méthode de démarrage du timer
    • en passant ces paramètres au constructeur de la classe Obstacle et en les stockant dans des variables de classe (ce qui "attachera" en quelque sorte ta classe Obstacle à la frame et au panel en question - il faudrait créer une instance nouvelle à chaque nouveau panelPrincipal, ou frame)


    Il va y avoir un second problème avec l'utilisation du lambda : la méthode retourne une exception, ce qui va t'obliger à la catcher dans le lambda, ce qui va rendre son écriture moins pratique. L'exception vient de ta méthode getImageHeight() qui relit l'image sur disque à chaque fois. Je t'avais déjà dit que c'était une mauvaise idée, pour d'autres raisons. Voici une raison supplémentaire.

    Tu peux t'en sortir de plusieurs façons :

    1. En utilisant la taille de l'image déjà chargée comme je te l'avais déjà indiqué ;
    2. En partant du principe que la taille de l'image ne change pas (il est possible qu'elle change, mais comme de toute manière tu ne rechargrs pas l'image à priori par ailleurs, ce ne serait pas logique de ne charger l'image que pour avoir sa nouvelle taille sans recharger l'image complètement)
    3. Encapsuler l'IOException dans une RuntimeException


    Donc, pour la méthode 3 :

    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
     
    //Mouvement Obstacle
    public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) {
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
                            try {
    			   posYo=ImageUtil.getImageHeight(imgObstacle.adresseImg);
                            }
                            catch(IOException e) {
                                throw new RuntimeException(e);
                            }
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale){
    	int delay = 200 ; // (5 fois par seconde)  
    	new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale).start();
    }
    Pour là méthode 2 :

    [CODE]Donc, pour la méthode 3 :

    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
     
    //Mouvement Obstacle
    private void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale, int imageHeight) {
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//
    			   posYo=imageHeight;
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale) throws IOException {
            int imageHeight = ImageUtil.getImageHeight(imgObstacle.adresseImg);
    	int delay = 200 ; // (5 fois par seconde)  
    	new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale, imageHeight).start();
    }
    Bien sûr, je préfère la première solution.

    À noter également que tu peux te dispenser de passer l'ActonEvent à la méthode fctMouvement, vu que tu ne l'utilises pas.
    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.

  10. #10
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel Drigo//

    MErci à vous tous.

    Présentation:
    J'ai préféré la méthode 1.Je rentre la taille de l'image tout de suite (cad 82)vu qu'elle n'a pas vocation à changer.

    Probléme:
    Maintenant le code tourne indefiniment tt semble fonctionner SAUF que ... "l'obstacle" n'est dessiné qu'une fois le reste du temps il se dessine "au dessous"du fond.J'ai donc ça tout le temps.
    Nom : Capture.JPG
Affichages : 702
Taille : 46,2 Ko

    Mon code:

    classe obstacle
    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
    //Mouvement Obstacle
    public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) {
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=82;
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale) throws IOException{
    	int delay = 0; 
    	new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale)).start();
    }
    classe main dans la méthode main: (a l'endroit ou je crée l'objet).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Obstacle
            Obstacle obstacle1 =new Obstacle();
            obstacle1.fctMouvement(fenPrincipale, panPrincipale);
     
            //fond
    		fctFond();

  11. #11
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le fond c'est aussi un JPanel ? Que tu ajoutes au début, c'est ça ? En fait, sans layout, les composants sont affichés dans l'ordre inverse de leur ajout. Donc ton avion, un JPanel que tu ajoutes en dernier, se paint avant le fond qui le couvre quand lui se paint. C'est pour ça que j'avais mis dans AbsoluteImagePanel cette ligne setComponentZOrder(label, 0); // pour que le dernier s'affiche au dessus : fait pareil sur le panel auquel tu ajoutes ton avion (enfin si c'est bien ça ton "obstacle", parce que je ne vois pas vraiment ce que tu appelels "obstacle", mais peu importe, c'est le même principe quelque soit le panel), en passant, bien sûr, la référence du panel "avion"(ou "obstacle"...).


    Accessoirement, tout ça serait bien plus simple à gérer en Java2D directement dans un JPanel ou un Canvas, que Swing.
    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.

  12. #12
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel//

    Salut,
    non le fond est un "JLabel".Comme mon avion et les deux sont déssinée sur le mm "JPanel"
    Excuse moi l'obstacle est l'objet à mettre en mouvement.

    enJAVA2E
    Surement mais je suis débutant alors je connais pas

  13. #13
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    @Joel//

    Salut,
    non le fond est un "JLabel".Comme mon avion et les deux sont déssinée sur le mm "JPanel"
    Excuse moi l'obstacle est l'objet à mettre en mouvement.
    C'est pareil, quelque soit le composant et quelque soit le conteneur.

    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Surement mais je suis débutant alors je connais pas
    JAVA2D pas JAVA2E et ça consiste à dessiner directement dans un le contexte graphique

    Voir tutoriels

    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.

  14. #14
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Salut,

    1-
    C'est pareil, quelque soit le composant et quelque soit le conteneur.
    On peut donc mettre 2 JLabel dans un seul JPanel?

    2-

    Citation Envoyé par joel.drigo Voir le message
    . C'est pour ça que j'avais mis dans AbsoluteImagePanel cette ligne setComponentZOrder(label, 0); // pour que le dernier s'affiche au dessus : fait pareil sur le panel auquel tu ajoutes ton avion
    Quand as tu fait ça?

    3-
    J'ai éssayé mais j'ai toujours le mm probléme.
    Dans ma classe main:
    rem:fonction fond affiche le fond:
    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 class Main extends JPanel {
     
    	public static JFrame fenPrincipale=new JFrame("-Jeu-");//On definit la JFrame //fen=fenetre
    	public static JPanel panPrincipale=new JPanel();
     
    	public static int framWidth=fenPrincipale.getWidth();public static int framHeight=fenPrincipale.getHeight();	
     
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		fenPrincipale.setSize(new Dimension(1024,768));
    		fenPrincipale.setResizable(false);
    		fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenPrincipale.add(panPrincipale);
            fenPrincipale.setContentPane(panPrincipale);
     
            //joueur
            Joueur joueur=new Joueur();
    		joueur.fctDessinerJ(fenPrincipale, panPrincipale, framWidth, framHeight);//J=joueur
     
            //Obstacle
            Obstacle obstacle1 =new Obstacle();
    		obstacle1.fctMouvement(fenPrincipale, panPrincipale);
     
            //fond
    		fctFond();
     
            //
            fenPrincipale.setVisible(true);
    	}
     
    	//fond
    	public static JLabel fctFond() throws IOException{
    		Image imgFond= new Image("C:\\Users\\antoine\\Desktop\\imgProjetFond.jpg");
    		JLabel labImgFond = null;
    		labImgFond=imgFond.fctAfficherImg(panPrincipale, 0,0,1024,768);
    		panPrincipale.setComponentZOrder(imgFond, 0);
    		return labImgFond;
    	}
     
    }

  15. #15
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    1-

    On peut donc mettre 2 JLabel dans un seul JPanel?
    Autant qu'on en veut.



    Citation Envoyé par Pif_Paf_Pouf Voir le message
    2-



    Quand as tu fait ça?
    Dans le dernier code de ce post.

    Citation Envoyé par Pif_Paf_Pouf Voir le message
    3-
    J'ai éssayé mais j'ai toujours le mm probléme.
    Dans ma classe main:
    rem:fonction fond affiche le fond:
    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 class Main extends JPanel {
     
    	public static JFrame fenPrincipale=new JFrame("-Jeu-");//On definit la JFrame //fen=fenetre
    	public static JPanel panPrincipale=new JPanel();
     
    	public static int framWidth=fenPrincipale.getWidth();public static int framHeight=fenPrincipale.getHeight();	
     
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		fenPrincipale.setSize(new Dimension(1024,768));
    		fenPrincipale.setResizable(false);
    		fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenPrincipale.add(panPrincipale);
            fenPrincipale.setContentPane(panPrincipale);
     
            //joueur
            Joueur joueur=new Joueur();
    		joueur.fctDessinerJ(fenPrincipale, panPrincipale, framWidth, framHeight);//J=joueur
     
            //Obstacle
            Obstacle obstacle1 =new Obstacle();
    		obstacle1.fctMouvement(fenPrincipale, panPrincipale);
     
            //fond
    		fctFond();
     
            //
            fenPrincipale.setVisible(true);
    	}
     
    	//fond
    	public static JLabel fctFond() throws IOException{
    		Image imgFond= new Image("C:\\Users\\antoine\\Desktop\\imgProjetFond.jpg");
    		JLabel labImgFond = null;
    		labImgFond=imgFond.fctAfficherImg(panPrincipale, 0,0,1024,768);
    		panPrincipale.setComponentZOrder(imgFond, 0);
    		return labImgFond;
    	}
     
    }
    Ce sont les "avions" qu'il faut mettre en ZOrder = 0, pour qu'il soit "au dessus" du fond (le 0 est le dernier à s'afficher, donc au dessus). Par contre, je ne vois pas dans ce code où tu supprimes le LayoutManager de panPrincipal : un JPanel a par défaut un FlowLayout. Le layout n'intervient pas lors de la modification par le timer : donc en gros, ce qu'il doit se passer, c'est que le fond se docke (conformément au flowlayout), puis les autres composants sont placés sur forçage des bounds, tant qu'un layout n'est pas effectué, mais ils s'affichent dans l'ordre inverse d'ajout.

    J'ai modifié ma classe AbsoluteImagePanel pour que tu vois la différence :

    - au départ pas de layout : les composants sont placés aléatoirement puis tournent autour du centre (la vitesse est déterminée par la distance de la souris au centre)
    - le bouton droit de la souris permet de passer à un FlowLayout, puis de repasser sans layout (avec replacement aléatoire).

    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
    public class AbsoluteImagePanel extends JPanel {
     
    	private final Timer timer;
    	private double angle;
     
     
    	public AbsoluteImagePanel() {
    		super();
    		setLayout(null);
    		timer = new Timer(30, new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				moveImages();
    			}
    		});
    	}
     
    	private final static double ANGLE = Math.PI/20;
    	private final static double PIx2 = 2*Math.PI;
    	private void moveImages() {
    		Point point = getMousePosition();
    		if ( point==null ) {
    			point = MouseInfo.getPointerInfo().getLocation();
    			SwingUtilities.convertPointFromScreen(point, this);
    		}  
    		double cx = getWidth()/2d;
    		double cy = getHeight()/2d;
    		double speed = Point.distance(cx, cy, point.x, point.y)/50;
    		angle+=ANGLE*speed;
    		if ( angle>PIx2 ) angle -= PIx2;
    		for(Component component : getComponents()) {
    			Rectangle bounds = component.getBounds();
    			double x = bounds.getCenterX();
    			double y = bounds.getCenterY();
    			double dist = Point.distance(x, y, cx, cy); 
    			x = cx + dist*Math.sin(angle);
    			y = cy + dist*Math.cos(angle);
    			component.setLocation((int)(x-bounds.getWidth()/2),(int)(y-bounds.getHeight()/2));
    		}
    	} 
     
    	public void startAnimation() {
    		timer.start();
    	}
     
    	public void addImage(Image image, int x, int y, int width, int height) {
    		JLabel label = new JLabel(new ImageIcon(image));
    		label.setBounds(x, y, width, height);
    		add(label);
    		setComponentZOrder(label, 0); // pour que le dernier s'affiche au dessus
     
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		g.setColor(Color.RED);
    		g.setFont(getFont().deriveFont(Font.BOLD));
    		if ( getLayout()==null ) {
    			g.drawString("Pas de layout manager", 5 , g.getFontMetrics().getHeight() );
    		}
    		else {
    			g.drawString("Avec " + getLayout().getClass().getSimpleName(), 5, g.getFontMetrics().getHeight());
    		}
    	}
     
    	public static void main(String[] args) throws IOException {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final AbsoluteImagePanel panel = new AbsoluteImagePanel();
    		frame.getContentPane().add(panel);
     
    		final Random random = new Random();
    		final Image image = ImageIO.read(new File("suricate.png"));
     
    		for(int i=0; i<10; i++) {
    			addImage( panel, image, random  );
    		}
     
    		panel.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mousePressed(MouseEvent e) {
    				switch(e.getButton()) {
    				case  MouseEvent.BUTTON1:
    					addImage( panel , image, random );
    					panel.repaint();
    					break;
    				case MouseEvent.BUTTON3:
    					if ( panel.getLayout()==null ) {
    						panel.setLayout(new FlowLayout());
    						panel.revalidate();
    						panel.repaint();
    					}
    					else {
    						panel.setLayout(null);
    						for(Component component : panel.getComponents()) {
    							Rectangle bounds = randomBounds(random);
    							component.setBounds(bounds);
    						}
    						panel.repaint();
    					}
    					break;
    				}
    			}
     
    		});
     
    		frame.setSize(300, 200);
    		frame.setLocationRelativeTo(null);
     
    		frame.setVisible(true);
     
    		panel.startAnimation();
     
     
    	}
    	private static void addImage(AbsoluteImagePanel panel, Image image, Random random) {
    		Rectangle rectangle = randomBounds(random);
    		panel.addImage(image, rectangle.x, rectangle.y, rectangle.width, rectangle.height);
    	}
     
    	private static Rectangle randomBounds(Random random) {
    		int x = random.nextInt(200);
    		int y = random.nextInt(150);
    		int width = 10 + random.nextInt(90);
    		int height = 10 + random.nextInt(90);
    		return new Rectangle(x, y, width, height);
    	}
     
    }
    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.

  16. #16
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Merci joel,

    1-
    pour tes réponses tjrs completes est détaillée ...

    2-
    Bref je vais etre direct ou dois je placer ce foutu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setComponentZOrder(labImgFond, 0);
    J'ai essayé un peu partout mais rien !
    Je pense qu'il faut donc le mettre ici ds la fct qui dessine mais ou :

    Voila un essai bien infructueux:
    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
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) {
     
    	if(i==0){//position de depart de l'img
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82;
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82);
    	labImgObstacle.setComponentZOrder(panPrincipale, 0);
    	panPrincipale.add(labImgObstacle);
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
    Encore un grd merci

  17. #17
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah :
    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
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) {
     
    	if(i==0){//position de depart de l'img
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82;
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82);
    	// c'était presque ça, mais il fallait le faire après avoir ajouter le composant : labImgObstacle.setComponentZOrder(panPrincipale, 0);
    	panPrincipale.add(labImgObstacle);
            [highlight]panPrincipale.setComponentZOrder(labImgObstacle, 0);[highlight]
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
    Par contre, je ne vois pas ce que @Tchize_ t'a dire de faire (supprimer le panel précédent, mais peut-être est-ce fait dans imgObstacle.fctAfficherImg() ?)
    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.

  18. #18
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel//

    Problème:
    Je pige pas ça ne fonctionne pas j'ai bien le fond qui s'affiche l'image aussi mais mtn elle fait des trainées sur le fond....
    En gros j'ai ça à un moment "t"sinon évidemment ça tourne à l'infini):
    Nom : Capture.JPG
Affichages : 675
Taille : 51,4 Ko

    *)Code:

    Classe Obstacle:
    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
    public class Obstacle extends JPanel  {
     
    //Position
    private int posXo,posYo;
    public int getPosXo(){
    	return this.posXo;
    }
    public void setPosXo(int posX){
    	this.posXo=posX;
    }
    public int getPosYo(){
    	return this.posYo;
    }
    public void setPosYo(int posY){
    	this.posYo=posY;
    }
     
    public int fctHasard(int borneInf,int borneSup){
    	int random = (int)(Math.random() * (borneSup-borneInf)) + borneInf;
    	return random;
    }
     
    //
    private Main main1=new Main();
     
    //Image Obstacle
    private Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG");
    private JLabel labImgObstacle =null;
    private int i=0;//pour que le tirage au sort ne se fasse qu'une fois
     
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) {
     
    	if(i==0){//position de depart de l'img
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82;
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
     
    	labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82);
    	// c'était presque ça, mais il fallait le faire après avoir ajouter le composant : labImgObstacle.setComponentZOrder(panPrincipale, 0);
    	panPrincipale.add(labImgObstacle);
        panPrincipale.setComponentZOrder(labImgObstacle, 0);
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
     
     
     
    //Mouvement Obstacle
    public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) {
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=82;
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}	
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale){
    	int delay = 0; 
    	new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale)).start();
    }
    }
    Classe 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
    public class Main extends JPanel {
     
    	public static JFrame fenPrincipale=new JFrame("-Jeu-");//On definit la JFrame //fen=fenetre
    	public static JPanel panPrincipale=new JPanel();
     
    	public static KeyEvent e = null;
     
    	public static int framWidth=fenPrincipale.getWidth();public static int framHeight=fenPrincipale.getHeight();	
     
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		fenPrincipale.setSize(new Dimension(1024,768));
    		fenPrincipale.setResizable(false);
    		fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenPrincipale.add(panPrincipale);
            fenPrincipale.setContentPane(panPrincipale);
     
     
            //joueur
            Joueur joueur=new Joueur();
    		joueur.fctDessinerJ(fenPrincipale, panPrincipale, framWidth, framHeight);//J=joueur
    		//joueur.fctMvtJoueur(fenPrincipale, panPrincipale, e);
     
            //Obstacle
            Obstacle obstacle1 =new Obstacle();
    		obstacle1.fctMouvement(fenPrincipale, panPrincipale);
     
            //fond
            fctFond(panPrincipale);
     
            //
            fenPrincipale.setVisible(true);
    	}
     
    	//fond
    	public static JLabel fctFond(JPanel panPrincipale) {
    		Image imgFond= new Image("C:\\Users\\antoine\\Desktop\\imgProjetFond.jpg");
    		JLabel labImgFond = imgFond.fctAfficherImg(panPrincipale, 0,0,1024,768);
    		return labImgFond;
    	}
    }

  19. #19
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    @Joel//

    Problème:
    Je pige pas ça ne fonctionne pas j'ai bien le fond qui s'affiche l'image aussi mais mtn elle fait des trainées sur le fond....

    Je te l'ai dit :

    Citation Envoyé par joel.drigo Voir le message

    Par contre, je ne vois pas ce que @Tchize_ t'a dire de faire (supprimer le panel précédent, mais peut-être est-ce fait dans imgObstacle.fctAfficherImg() ?)
    Le problème c'est que toute la structure de ton programme est tellement alambiquée que ce n'est pas simple à faire : il faut que lorsque tu crées un nouveau panel, tu supprimes l'ancien, donc que tu aies une référence sur l'ancien. Ou alors, il ne faut pas créer un nouveau panel à chaque mouvement, mais utiliser toujours la même instance, et simplement changer ses bounds (ce que je fais moi dans mon exemple AbsoluteImagePanel que je t'ai donné.

    En fait, le problème dans ta structure, c'est que ta classe Image se comporte en fabrique de JPanel. A chaque fois que tu fais bouger ton avion, tu fais labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82); et tu ajoutes le JPanel. Donc tu ajoutes sans arrêt des JPanel. Et tu n'as aucun moyen de savoir quel ancien panel doit être supprimé. Comme tu ne fais qu'ajouter des panels ils s'affichent tous, les uns au-dessus des autres, avec un petit décalage, donc ça fait une traînée.

    La seule façon de t'en sortir sans refaire tout ton programme, c'est d'introduire des variables statefull, ce qui t'empêchera juste de pouvoir utiliser fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) { pour afficher plusieurs avions (ou alors il faudra introduire une nouveau paramètre pour identifier l'avion).


    Par exemple, si tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    JLabel oldImgObstacle = labImgObstracle; // ça c'est ce que tu dois ajouter
    labImgObstacle=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82); // ça c'est ton code actuel
    if ( oldImgObstacle!=null ) { // ça c'est ce que tu dois ajouter
         panPrincipale.remove(labImgObstacle); // ça c'est ce que tu dois ajouter
    } // ça c'est ce que tu dois ajouter
    panPrincipale.add(labImgObstacle); // ça c'est ton code actuel
    panPrincipale.setComponentZOrder(labImgObstacle, 0); // ça c'est ton code actuel
    Dans ce code, on récupère le dernier panel que tu as stocké dans labImgObstacle. Puis on demande de créer le nouveau panle. Puis, si on a un ancien panel, on le supprime du panPrincipal. Puis on ajoute le nouveau au panPrincipal, et on le place au dessus des autres.

    Ceci fonctionnera, mais que si la méthode est utilisé pour ne gérer qu'un seul avion.
    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.

  20. #20
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel//

    1-

    Le problème c'est que toute la structure de ton programme est tellement alambiquée
    Non je l'ai fait le plus simple possible.Enfin j'ai essayé.
    En fait dans ma fonction mouvement obstacle.
    Je souhaite "effacer" l'avion précédent puis je le redessine à nouveau sur ses positions différentes.

    2-
    N'y a t il pas une possibilité plus simple en utilisant "remove"?

    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
    public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) {
     
    	if(i==0){//position de depart de l'img
    		int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82;
    		posX=posXDepart;posY=posYDepart;
    		i++;
    	}
    	labImgObst=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82);
    	panPrincipale.add(labImgObst);
    	panPrincipale.setComponentZOrder(labImgObst, 0);
     
    	fenPrincipale.setVisible(true);
     
    	int tabPos[]=new int [2];
    	tabPos[0]=posX;tabPos[1]=posY;
    	return tabPos;
     
    }
     
    //Mouvement Obstacle
    public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) {
     
    	int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    	posXo=tabPos[0];posYo=tabPos[1];
    	int continuer = 0;//boolean continuer=true; 
     
    	System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+"  -PosXo="+posXo+" posYo="+posYo);//controle
    		posYo++;
    		System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle
    		if(posYo==fenPrincipale.getHeight()){
    			System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle
    			posYo=82;
    			posXo=fctHasard(0,fenPrincipale.getWidth());
    		}	
     
    		fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
    		panPrincipale.remove(labImgObst);
     
    }
     
    public void fctMouvement(JFrame fenPrincipale, JPanel panPrincipale){
    	int delay = -100; 
    	new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale)).start();
    }
    Merci.

Discussions similaires

  1. Récupérer la cellule contenant une image
    Par phpphp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2007, 15h45
  2. Comment mettre en place un Jlabel avec une image de fond?
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 08/05/2007, 17h52
  3. Jlabel sur une image de fond est ce possible?
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2007, 12h29
  4. [JavaMail] recevoir un mail contenant une image
    Par nicotine002 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 26/08/2006, 12h38
  5. [JLabel] changer une image
    Par dadg dans le forum Composants
    Réponses: 5
    Dernier message: 28/09/2004, 10h28

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