Aquí está la lógica relevante que usé en el pong en mi página de inicio : (por favor, juegue antes de leer, para que sepa el efecto que estoy logrando con el siguiente código)
Esencialmente, cuando la pelota choca con la pala, su dirección se ignora por completo; se le da una nueva dirección de acuerdo a qué tan lejos del centro de la pala chocó. Si la pelota golpea la paleta justo en el centro, se envía exactamente horizontal; Si golpea justo en el borde, vuela en un ángulo extremo (75 grados). Y siempre viaja a una velocidad constante.
var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;
Tome el valor medio Y de la pala y reste la intersección Y de la pelota. Si la paleta tiene una altura de 10 píxeles, este número estará entre -5 y 5. Yo lo llamo la "intersección relativa" porque ahora está en el "espacio de la paleta", la intersección de la pelota con respecto al centro de la paleta.
var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;
Tome la intersección relativa y divídala por la mitad de la altura de la pala. Ahora nuestro número de -5 a 5 es un decimal de -1 a 1; se normalizó . Luego multiplíquelo por el ángulo máximo por el cual desea que la pelota rebote. Lo configuré en 5 * Pi / 12 radianes (75 grados).
ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);
Finalmente, calcule las nuevas velocidades de la pelota, usando trigonometría simple.
Es posible que este no sea el efecto que busca, o que también desee determinar una velocidad multiplicando la intersección relativa normalizada por una velocidad máxima; esto haría que la pelota vaya más rápido si golpea cerca del borde de una pala, o más lenta si golpea cerca del centro.
Posiblemente me gustaría algún código sobre cómo se vería un vector o cómo podría guardar la variable del vector que tienen las bolas (velocidad y dirección).
Un vector contiene velocidad y dirección, implícitamente. Almaceno mi vector como "vx" y "vy"; es decir, la velocidad en la dirección x y la velocidad en la dirección y. Si no ha tomado un curso introductorio de física, esto puede parecerle algo extraño.
La razón por la que hago esto es porque reduce los cálculos necesarios por cuadro; cada cuadro, simplemente lo hace x += vx * time;
y y += vy * time;
donde el tiempo es el tiempo desde el último cuadro, en milisegundos (por lo tanto, las velocidades están en píxeles por milisegundo).
Con respecto a la implementación de la capacidad de curvar la pelota:
En primer lugar, necesitaría saber la velocidad de la pala en el momento en que golpea la pelota; lo que significa que necesitaría hacer un seguimiento del historial de la pala, para poder conocer una o más de las posiciones pasadas de la pala para poder compararlas con su posición actual para ver si se movió. (cambio de posición / cambio en el tiempo = velocidad; por lo que necesita 2 o más posiciones, y los tiempos de esas posiciones)
Ahora también necesita rastrear una velocidad angular de la pelota, que prácticamente representa la curva a lo largo de la que viaja, pero es equivalente al giro de la pelota en el mundo real. De manera similar a cómo interpolaría el ángulo de rebote desde la posición relativa de la pelota en colisión con la pala, también necesitaría interpolar esta velocidad angular (o giro) desde la velocidad de la pala en colisión. En lugar de simplemente establecer el giro como lo hace con el ángulo de rebote, es posible que desee sumar o restar el giro existente de la pelota, porque eso tiende a funcionar bien en los juegos (el jugador puede notar que la pelota está girando y hacer que gire) incluso más salvajemente, o contrarresta el giro en un intento de hacer que viaje en línea recta).
Sin embargo, tenga en cuenta que, si bien este es el sentido más común y probablemente la forma más fácil de implementarlo, la física real de un rebote no depende únicamente de la velocidad del objeto que golpea; un objeto sin velocidad angular (sin giro) que golpea una superficie en ángulo tendrá un giro impartido sobre él. Esto podría conducir a una mejor mecánica de juego, por lo que es posible que desee investigar esto, pero no estoy seguro de la física detrás de esto, así que no voy a tratar de explicarlo.