Para simular el efecto que produce la gravedad en una pelota primero debemos entender lo que pasa en la realidad. La gravedad equivale a aplicar una fuerza constante que empuja a los objetos hacia el centro de la tierra. Esta fuerza produce un cambio en la velocidad de los objetos (aceleración), y es la velocidad la que produce el cambio en su posición.
En nuestra simulacilación representaremos gráficamente la pelota mediante un círculo. Para simular el movimiento de la pelota la dibujaremos en posiciones que irán cambiando a lo largo del tiempo. Es decir, las coordenadas del centro de la pelota cambiarán de un frame al siguiente. Por lo tanto tendremos que usar dos variables para representar dichas coordenadas. Pero la velocidad también cambiará de un frame al siguiente pues esta se verá afectada en todo momento por la fuerza de la gravedad.
Supongamos que x e y son las dos variables que representan la posición del centro de la pelota, y que vx y vy son las que representan su velocidad. Inicialmente, la pelota estará en una posición elevada y su velocidad será nula. En cada nuevo frame calcularemos la nueva posición de la pelota en función de la velocidad que tenga en ese momento. Además, justo después calcularemos la nueva velocidad en función de la gravedad.
// Antes de dibujar cada nuevo frame se modifica la posición en función de la velocidad, y después, la velocidad en función de la gravedad. En este caso aumentamos vy en una unidad cada frame.
x = x + vx;
y = y + vy;
// Aumentamos la velocidad vertical simulando la aplicación de la fuerza de gravedad
vy = vy + 1;
// El círculo se dibuja en sus coordenadas (x,y)
De este modo, a medida que pase el tiempo la velocidad será mayor y el efecto visual será similar al producido en la realidad. Evidentemente, el círculo termina desapareciendo por la parte inferior de la pantalla cuando la coordenada y se hace suficientemente grande.
Si queremos que la pelota deje de caer al llegar al suelo debemos detectar este hecho. Lo más sencillo es establecer un valor máximo para y (recuerda que las coordenadas verticales crecen hacia abajo) a partir del cual no dejaremos pasar la pelota. Por ejemplo, si queremos que el límite de la imagen represente el suelo, la coordenada y máxima que podrá tomar la pelota será ALTURA-radio, siendo ALTURA el tamaño vertical de la ventana y radio el radio de nuestro círculo.
// En cada actualización de la pantalla se modifican x e y sumando vx y vy
x = x + vx;
y = y + vy;
// Aumentamos la velocidad vertical simulando la aplicación de la fuerza de gravedad
vy = vy + 1;
// Detectamos colisión y corregimos posición antes de dibujar el frame actual
if ( y > ALTURA-radio ) {
y = ALTURA-radio;
}
// El círculo se dibuja en sus coordenadas (x,y)
Tras calcular la nueva posición detectamos si la pelota está en una posición incorrecta, es decir, más abajo de lo que puede estar. Si es así, corregimos su posición. Tras la colisión, la pelota permanece quieta en la posición que le corresponde, pero la velocidad sigue aumentando. Esto ocurre porque cada nuevo frame la velocidad se sigue viendo afectada por la gravedad pero como antes de dibujar el frame corregimos la posición, aparentemente todo está bien.
Si quisieramos simular un rebote, lo único que tendríamos que hacer es cambiar el signo de la velocidad en el momento que detectamos la colisión. Pero, como todos hemos comprobado alguna vez, los rebotes no continúan eternamente debido a que la pelota siempre pierde algo de energía en el choque y bota que menos velocidad de la que llevaba antes del mismo.
// En cada actualización de la pantalla se modifican x e y sumando vx y vy
x = x + vx;
y = y + vy;
// Aumentamos la velocidad vertical simulando la aplicación de la fuerza de gravedad
vy = vy + 1;
// Detectamos colisión y corregimos posición y velocidad antes de dibujar el frame actual
if ( y > ALTURA-radio ) {
y = ALTURA-radio;
vy = -(vy-4); // En cada choque perdemos cuatro puntos de velocidad
}
// El círculo se dibuja en sus coordenadas (x,y)
Para simular un salto, basta con aplicar un impulso a la pelota, es decir cambiar repentinamente su velocidad. Normalmente, esto sólo lo haremos si la pelota está en reposo ya que, de lo contrario, podríamos saltar a mitad de un salto anterior dando la sensación de que la pelota se apoya en el aire para dar el nuevo salto.
// En cada actualización de la pantalla se modifican x e y sumando vx y vy
x = x + vx;
y = y + vy;
// Aumentamos la velocidad vertical simulando la aplicación de la fuerza de gravedad
vy = vy + 1;
// Detectamos colisión y corregimos posición y velocidad antes de dibujar el frame actual
if ( y > ALTURA-radio ) {
y = ALTURA-radio;
vy = -(vy-4); // En cada choque perdemos cuatro puntos de velocidad
}
// Si la pelota está en reposo y se pulsa alguna tecla aplicamos un impulso de 25 puntos
if ( y == ALTURA-radio && keyPressed ) {
vy = -20;
}
// El círculo se dibuja en sus coordenadas (x,y)