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

2D Java Discussion :

Boucle infinie et paintComponent


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Boucle infinie et paintComponent
    Bonjour à tous,

    Peut-on m'aider sur une boucle infinie?

    je suis sûr que la réponse est devant mes yeux mais etant un novice,je ne trouve pas et ca m'enerve

    j'ai fait une boucle infinie pour faire rebondire une balle quand elle touche les bords de la fenetre( enfantin normalement...)
    mais voila, le code ci-dessous n'affiche rien et si je désactive la méthode lancer(), ben l'affichage est correct mais ca ca bouge pas; le probleme est donc la méthode lance()...

    Encore une chose, pour les animations, est il plus adéquat d'utiliser un Thread.sleep ou un objet ActionListener? et pourquoi?

    Merci d'avance.

    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
    private void lancer(){
     
    		int x,y;
    		boolean invX=false;
    		boolean invY=false;
    		while(true)
    		{
    			x=bal.getPosX();
    			y=bal.getPosY();
     
    			if (x>this.getWidth()-bal.getLargBal())
    				invX=true;
    			if (x<1)
    				invX=false;
    			if (y>this.getHeight()-bal.getHautBal())
    				invY=true;
    			if (y<1)
    				invY=false;
    			if (invX==true)
    			{
    				bal.setPosX(x--);
    			}
    			else
    			{
    				bal.setPosX(x++);
    			}
    			if (invY==true)
    				{
    					bal.setPosY(y--);
    				}
    			else 
    				{
    					bal.setPosY(y++);	
    				}
    			this.repaint();
    			try {
    					Thread.sleep(10);
    				} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    		}
     
    	}

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Comment est appelée ta méthode "lancer" ? Via l'EDT (sur un listener de composant graphique) ?
    Si oui, alors il faut faire un thread dédié pour cette méthode car tu figes l'interface graphique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé les 2 façons ci-dessous, en appelant lancer() simplement et aussi via un actionlistener.

    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
     
    public Panneau(){
     
    		this.setSize(800, 600);
    		rac = new Racket();
    		rac.setPosX((this.getWidth()/2)-rac.getLargRaquette()/2);
    		rac.setPosY(this.getHeight()-rac.getHauteurRaquette()-rac.vide);	
     
    		bal = new Balle();
    		bal.setPosX(rac.getPosX()+((rac.getLargRaquette()/2)-(bal.getLargBal()/2)));
    		bal.setPosY(this.getHeight()-40-rac.getHauteurRaquette()-bal.getHautBal());	
     
    		lancer();
    		/*t= new Timer(100,action);
    		t.start();
    		action = new ActionListener(){
     
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				// TODO Auto-generated method stub
     
    				lancer();
    				repaint();
    			}
    		 };*/
    	}

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu dois créer un Thread à part, soit toi-même, soit via un Timer pour appeler le code de "lancer".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Manifestement, je n'arrive pas a faire ce que je veux.
    J'ai lu des infos sur les threads mais j'ai sans doute raté quelque chose.

    J'ai ajouté un thread que je lance avec un Timer mais lancer() ne fonctionne pas.
    Cependant, grace a mon thread, maintenant la fenetre apparait mais l'animation ne fonctionne tjs pas...

    Je commence a croire que c'est une erreur de logique dans la méthode lancer()...
    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
     
    	public Panneau(){
     
    		this.setSize(800, 600);
    		this.setBackground(Color.black);
    		rac = new Racket();
    		rac.setPosX((this.getWidth()/2)-rac.getLargRaquette()/2);
    		rac.setPosY(this.getHeight()-rac.getHauteurRaquette()-rac.vide);	
    		bal = new Balle();
    		bal.setPosX(rac.getPosX()+((rac.getLargRaquette()/2)-(bal.getLargBal()/2)));
    		bal.setPosY(this.getHeight()-40-rac.getHauteurRaquette()-bal.getHautBal());	
     
    		action = new ActionListener(){
     
    			public void actionPerformed(ActionEvent arg0) {
    				// TODO Auto-generated method stub
    				System.out.println("Juste avant le thread");
    				th = new Thread() {
     
    					public void run() {	
    						System.out.println("Dans le thread");
    						lancer();
     
    					}
    				};
    				th.start();	
    			}
    		 };	
     
    		 t = new Timer(5000,action);
    		 t.start();
    	}
    Et voilà le code de la méthode lancer()

    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
     
    	private void lancer(){
    		System.out.println("Dans lancer");
    		int x,y;
    		boolean invX=false;
    		boolean invY=false;
    		while(true)
    		{
    			x=bal.getPosX();
    			y=bal.getPosY();
    			if (x>this.getWidth()-bal.getLargBal())
    				invX=true;
    			if (x<1)
    				invX=false;
    			if (y>this.getHeight()-bal.getHautBal())
    				invY=true;
    			if (y<1)
    				invY=false;
    			if (invX==true)
    			{
    				bal.setPosX(x--);
    			}
    			else
    			{
    				bal.setPosX(x++);
    			}
    			if (invY==true)
    				{
    					bal.setPosY(y--);
    				}
    			else 
    				{
    					bal.setPosY(y++);	
    				}
    			this.repaint();
    		/*	try {
    					Thread.sleep(5000);
    				} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    					e.printStackTrace();
    				}*/
    		}
     
    	}

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu n'as pas saisie le fonctionnement de Timer.
    Tu ne dois pas faire de boucle ni construire un Thread, c'est le Timer qui va s'occuper d'exécuter périodiquement le code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Ca marche, merci beaucoup.

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

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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