Voici la logique pertinente que j'ai utilisée sur le pong sur ma page d'accueil : (allez jouer avant de lire, afin que vous sachiez l'effet que j'obtiens avec le code suivant)
Essentiellement, lorsque le ballon entre en collision avec la raquette, sa direction est complètement ignorée; on lui donne une nouvelle direction selon la distance du centre de la pagaie à laquelle il est entré en collision. Si la balle frappe la raquette en plein centre, elle est renvoyée exactement à l'horizontale; s'il frappe directement sur le bord, il s'envole à un angle extrême (75 degrés). Et il voyage toujours à vitesse constante.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Prenez la valeur Y du milieu de la raquette et soustrayez l'intersection Y de la balle. Si la palette mesure 10 pixels de haut, ce nombre sera compris entre -5 et 5. J'appelle cela "l'intersection relative" car elle se trouve maintenant dans "l'espace de la palette", l'intersection de la balle par rapport au milieu de la palette.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Prenez l'intersection relative et divisez-la par la moitié de la hauteur de la palette. Maintenant, notre nombre de -5 à 5 est une décimale de -1 à 1; c'est normalisé . Multipliez-la ensuite par l'angle maximum selon lequel vous voulez que la balle rebondisse. Je l'ai réglé sur 5 * Pi / 12 radians (75 degrés).
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Enfin, calculez les nouvelles vitesses de balle, en utilisant une trigonométrie simple.
Ce n'est peut-être pas tout à fait l'effet recherché, ou vous pouvez également déterminer une vitesse en multipliant l'intersection relative normalisée par une vitesse maximale; cela rendrait le ballon aller plus vite s'il frappe près du bord d'une pagaie, ou plus lentement s'il frappe près du centre.
J'aimerais peut-être un peu de code sur ce à quoi ressemblerait un vecteur ou comment je pourrais enregistrer la variable du vecteur que les balles ont (vitesse et direction).
Un vecteur contient à la fois la vitesse et la direction, implicitement. Je stocke mon vecteur en tant que "vx" et "vy"; c'est-à-dire la vitesse dans la direction x et la vitesse dans la direction y. Si vous n'avez pas suivi de cours d'introduction à la physique, cela peut vous sembler quelque peu étranger.
La raison pour laquelle je fais cela est parce qu'elle réduit les calculs par image nécessaires; chaque image, il suffit de le faire x += vx * time;
et y += vy * time;
où le temps est le temps écoulé depuis la dernière image, en millisecondes (donc les vitesses sont en pixels par milliseconde).
Concernant la mise en œuvre de la capacité à courber le ballon:
Tout d'abord, vous devez connaître la vitesse de la raquette au moment où la balle frappe; ce qui signifie que vous devez garder une trace de l'historique de la pagaie, afin de pouvoir connaître une ou plusieurs positions passées de la pagaie afin de pouvoir les comparer à sa position actuelle pour voir si elle a bougé. (changement de position / changement de temps = vitesse; vous avez donc besoin de 2 positions ou plus, et les heures de ces positions)
Vous devez maintenant également suivre une vitesse angulaire de la balle, qui représente pratiquement la courbe le long de laquelle elle se déplace, mais est équivalente à la rotation réelle de la balle. Semblable à la façon dont vous interpoleriez l'angle de rebond à partir de la position relative de la balle lors de la collision avec la palette, vous devrez également interpoler cette vitesse angulaire (ou rotation) à partir de la vitesse de la palette lors de la collision. Plutôt que de simplement régler le spin comme vous le faites avec l'angle de rebond, vous voudrez peut-être ajouter ou soustraire au spin existant de la balle, car cela a tendance à bien fonctionner dans les jeux (le joueur peut remarquer que la balle tourne et la faire tourner) encore plus follement, ou contrer le spin pour tenter de le faire voyager droit).
Notez, cependant, que bien que ce soit le sens le plus commun et probablement le plus facile à mettre en œuvre, la physique réelle d'un rebond ne repose pas uniquement sur la vitesse de l'objet qu'il frappe; un objet sans vitesse angulaire (sans rotation) qui frappe une surface à un angle, se verra conférer une rotation. Cela pourrait conduire à un meilleur mécanisme de jeu, donc vous voudrez peut-être examiner cela, mais je ne suis pas certain de la physique derrière, donc je ne vais pas essayer de l'expliquer.