A la ferme du code heureux, des codes, des programmes, broutent en champ libre.
Une balle, une raquette
Voici un petit programme écrit en Processing qui montre comment faire rebondir une balle sur une raquette et sur les bords du sketch. Il explique aussi comment appliquer une effet d'apesanteur à la balle.

Your browser does not support the canvas tag.





// On commence par définir quelques variables.
float balleX = 0; // Une variable contenant la position X de la balle,
float balleY = 0; // et une autre pour sa position Y.

float vitesseX = 0; // Une variable pour la vitesse sur l'axe des X de la balle,
float vitesseY = 0; // puis une pour sa vitesse sur l'axe des Y.

float tailleDeLaBalle = 10; // Ca c'est pour la taille de la balle.

float raquetteY; // La position verticale de la raquette,
int score = 0; // et le score

float pesanteur = 0.1; // On à besoin d'une constante de pesanteur pour que notre balle retombe.

boolean enAttenteDuClic = true; // Celle là c'est un 'drapeau' pour determiner si la balle est lancée ou si elle reste collée à la raquette.

void setup() {
size(780, 240); // On définit la taille du sketch.
noStroke(); // On ne dessine pas de contours,
raquetteY = height-10; // et on positionne la raquette vers la bas du sketch.

textAlign(CENTER);
}


void draw()
{
background(211); // on efface le fond du sketch en gris clair

if (enAttenteDuClic == true) { // si j'attend le clic,
// la balle reste collée la raquette
balleX = mouseX;
balleY = raquetteY-tailleDeLaBalle/2;
}
else { // sinon il faut animer la balle.
balleX = balleX + vitesseX; // On additionne sa vitesse X à sa position X (pour qu'elle avance).
balleY = balleY + vitesseY; // Pareil pour les Y.

vitesseY = vitesseY + pesanteur; // Puis on applique la pesanteur pour la faire revenir au sol.
}

// Detection de la collision avec raquette
// La balle touche la raquette quand elle est en même temps plus basse que le haut de la raquette
// et comprise entre ses deux bords droit et gauche.
if ( (balleY > raquetteY) && (balleX>mouseX-25) && (balleX<mouseX+25)) { // si la balle touche la raquette :
vitesseY = -(vitesseY); // On inverse sa vitesse sur l'axe vertical pour la faire rebondir.
balleY= raquetteY-tailleDeLaBalle/2; // On la repositionne sur la surface de la raquette
score = score +1; // Et on gagne un point.
}

// On ne veut pas que la balle sorte du cadre du sketch, il faut donc la faire rebondir quand elle touche un bord.
if (balleX > width) { // Si la balle dépasse le bord droit du sketch,
vitesseX = -vitesseX; // pour qu'elle rebondisse on inverse sa vitesse.
balleX = width; // Et par précaution on la replace à la limite qu'elle ne doit pa dépasser.
}

if (balleX < 0) { // On fait la même chose pour le bord gauche du sketch.
vitesseX = -vitesseX;
balleX = 0;
}

if (balleY < 0) { // Et finalement pour le haut du sketch.
vitesseY = -vitesseY;
balleY=0;
}

if (balleY > height) { // Si la balle touche le bas du sketch c'est qu'on la manqué.
vitesseY = 0;
vitesseX = 0;

enAttenteDuClic =true; // On baisse le drapeau pour quelle reste collée à la raquette jusqu'au prochain clic,
score = score -1; // et on perd un point.
}

// Maintenant on peut dessiner la balle et la raquette.
fill(127); // en gris moyen
ellipse(balleX, balleY, tailleDeLaBalle, tailleDeLaBalle); // Ca c'est pour dessiner la balle
rect(mouseX-25, raquetteY, 50, 7); // Là c'est la raquette.
text(score, width/2, 10); // Et il ne faut pas oublier d'afficher le score.
}


// Quand on clic dans le sketch avec la souris (ou qu'on touche l'écran du doigt).
void mousePressed()
{
if (enAttenteDuClic == true) { // Si le drapeau d'attente du clic est levé
enAttenteDuClic = false; // on le baisse pour libérer la balle
vitesseX = random(-5.0, 5.0); // et on redonne à la balle une vitesse X et Y aléatoire.
vitesseY = random(-5.0, -2.0);
}
}