dyno >
y1 = position y raquette 1
y2 = position y raquette 2
dy = longueur y des raquettes
x1 = position x du tamis de la raquette 1(on se fiche de la largeur de la raquette)
x2 = pareil pour la raquette 2.
x,y : position de la balle
vx,vy : direction de la balle
if ( x<x1 && vx<0) / / la balle est chez le Joueur 1 ( a gauche)
{
if ( y>y1 && y<y1+dy) / / sur la raquette ( n´importe ou)
{
rebondit(vx,vy,(y-(y1+dy)/2.0)/((y1+dy)/2.0))
}
else
{
/ / perd le point
}
}
if ( x>x2 && vx>0) / / la balle est chez le Joueur 2 ( a droite)
{
if ( y>y2 && y<y2+dy)
{
rebondit(vx,vy,(y-(y2+dy)/2.0)/((y2+dy)/2.0)))
}
else
{
/ / perd le point
}
}
Tu vas me dire, d´ou vient la formule :
( y-(y1+dy)/2.0)/((y1+dy)/2.0))
alors on décompose :
( y1+dy)/2.0 --> c´est la position y du centre de la raquette. ( met bien 2.0 et pas 2 pour manipuler des nombres réels)
si on appelle yc ce centre, on a :
( y-yc)/yc
y-yc, ça te donne la distance de la balle au centre. Il est positif si la balle tape la partie basse, et négatif si elle tape sur la partie haute.
on divise par yc pour ramener ça entre 0 et 1.
en gros, ce calcul va dire :
si on est au centre, on dit " 0", si on est tout au bord, on dit " 1" ou " -1" selon le coté
et au milieu, y´a tous les nombres entre 0 et 1. ça fait un beau dégradé.
ça va jusque la ?
alors on implémente :
void rebondit(int& vx,int& vy,double coeff)
{
double vcoeff=3.0;
vx=-vx / /--> change de sens pour x, ce que tu as dans le cas le plus simple.
vy+=(int)(coeff*vcoeff);
}
Voila, ici, donc, on fait le rebond normal, et on ajoute une ligne qui change vy en fonction du coeff, et également du vcoeff.
Qu´est ce que le vcoeff ? c´est simplement l´amplitude maxi que peut prendre la balle.... Si tu trouve que ça fait trop, diminue le ( pas en dessous de 1)
si tu trouve que ça ne fait pas assez, augmente...
Essaie, et dit moi ce que tu en penses ( j´ai pas testé, il y a peut etre des erreurs, mais ça te donne la piste...)