[Java] rebond d'une balle sur une paroi

Résolu
Bonjour,

J'ai un exercice à réaliser en Java et je bloque à une étape du début : faire rebondir la boule sur les parois du billard.

Quand ma boule arrive sur une paroi, elle est comme absorbée, déviée vers l'extérieur de la paroi. Par contre quand elle arrive dans un coin, elle rebondit bien.

les parois sont regroupées dans 2 vecteurs (parVert et parHor), la boule est dessinée dans un rectangle au moyen de fillOval et les parois sont des rectangles dessinés au moyen de fillRectangle.

Le code de la méthode bouge de la classe Balle:

public void bouge()
{
	for(Paroi vectVert : billard.getParVert()) //on boucle sur les parois verticales
	{
		if(vectVert.collision(this))
			deltaX*=-1;
	}
		
	for(Paroi vectHor : billard.getParHor()) //on boucle sur les parois horizontales
	{
		if(vectHor.collision(this))
			deltaY*=-1;
	}
		
	rect.x+=deltaX;
	rect.y+=deltaY;
}


Et le code de la méthode collision de la classe Paroi:

public boolean collision(Balle b)
{
	return rect.intersects(b.getRect());
}


Pour que la boule se déplace à l'écran, j'utilise un thread de la classe ThreadMouvement:
public void run()
{
	while(true)
	{
		try
		{
			Thread.sleep(3);
			billard.getBalle().bouge();
			billard.repaint();
		}
		catch (Exception e)
		{}
	}
}


5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Ajoute a ta methode Coliision un
    System.out.println('Je touche');

    Et vérifie avec le console que ton event est bien appeler au bon momment :)
    1. Pas bête du tout ça :) .

      Alors, quand la balle entre dans le coin supérieur gauche, c'est parfait. Autre part, ça foire complètement : sur les parois horizontales, le message "Je touche" apparait une multitude de fois.
      J'ai rajouté un message à afficher quand le programme entre dans les if des for (hum) de la méthode bouge.
      Quand une paroi horizontale est touchée, le message du if sur les parois verticales s'affiche !

      Et je vois toujours pas pourquoi ça plante :P
      1. Je viens de voir un truc
        Dans ta methode bouge(), tu initialise pas deltaX et deltaY ?
        1. Si si, quand je les déclare dans ma classe Balle, je les initialise à 1 (sinon il n'y aurait pas de mouvement du tout).
          1. Finalement, au bout de plusieurs jours de recherche, j'ai trouvé la faille :
            c'était dans la méthode fillRect(), j'ai inversé les 2 derniers paramètres (width et height).