Programación de videojuegos - Posición, Velocidad y Aceleración

Siguiendo con el uso de la librería de físicas que vimos en la entrada anterior vamos a ver como la podemos usar para animar objetos en nuestros juegos. Se trata de usar los vectores para designar la posición de un objeto y su movimiento.

De forma sencilla para animar cualquier elemento se puede idealizar como si fuera un punto que expresaremos con un objeto Point2D que recibe los valores de los ejes x e y.

Point2D position = new Point2D (x, y); 

A este objeto le vamos a añadir una velocidad, que estará representada por un objeto Vector2D y tiene las instrucciones de como se debe mover de un momento a otro.

Vector2D velocity = new Vector2D (0.1f, 0.1f); 

En este caso tendremos una velocidad 0.1f tanto para el eje x como para el eje y

Para aplicar la velocidad al punto le añadimos este vector velocidad al punto de posición:

position.add (velocity); 

A la posición le añadimos la velocidad. Esto hará que nuestro objeto se desplace de un punto a otro de forma constante. Pero para simular un movimiento más real necesitamos añadir un vector más: la aceleración, que representaremos también con un objeto Vector2D y se lo añadiremos a la velocidad. Este objeto aceleración será crucial cuando apliquemos fuerzas que la modifiquen.

Por ahora tenemos entonces que la aceleración afecta a la velocidad y esta a la posición:

velocity.add (acceleration); 

La velocidad nos dice por tanto como va a cambiar la posición y la aceleración nos indica como va a cambiar la velocidad. 

Ejemplo 1: Aceleración constante

Vamos con un ejemplo. Se trata de mover unos objetos a una velocidad que incrementamos con una aceleración constante. Esta aceleración es aleatoria. Realmente creamos unos circulos con una masa aleatoria, y esta masa la usamos para calcular el tamaño y la aceleración:

this.mass = mass; 
this.radio = mass * 16; 
position = new Point2D (x, y); 
velocity = new Vector2D (0.1f, 0.0f); 
acceleration = new Vector2D (0.2f * this.mass, 0.0f); 
circle1 = new Circle2D (position, radio); 

El movimiento lo calculamos entonces de forma muy sencilla como hemos visto, añadimos la aceleración a la velocidad y ésta a la posición:

velocity.add (acceleration); 
position.add (velocity); 
 
check_edges (); 

En check_edges () lo que hacemos es comprobar los bordes de la pantalla para invertir el movimiento cuando choquemos con el borde:

var width = wsdl.width () - 1; 
 
if (position.x + radio >= width) { 
    position.x = width - radio; 
    velocity.x *= -1; 
} else if (position.x + radio < 0) { 
    position.x = radio; 
    velocity.x *= -1; 
} 

Tenemos el ejemplo completo en el repositorio git:

$ git clone https://git.clibre.io/sgp/randomacceleration.git

Para construir e instalar:

$ cd randomacceleration
$ meson build
$ cd build
$ ninja
$ ninja install

Random Attraction

Ejemplo 2: Seguir al puntero

El siguiente ejemplo esta basado en uno de los ejemplos del libro The Nature of Code de Daniel Shiffman. Lo que hacemos es crear un objeto que siga el cursor del ratón. Para esto tenemos que realizar los siguientes pasos:

  1. Calcular el vector que apunta desde el objeto a la localización del objetivo (en este caso el puntero del ratón)
  2. Normalizar el vector (reducir su longitud a 1)
  3. Escalar el vector a un valor apropiado (lo multiplicamos por una constante, en este caso 0.5f)
  4. Asignar el vector al vector aceleración

Lo que en código sería:

Vector2D dir = input.vmouse.copy ().sub (position); 
dir.normalize ().mult_scalar (0.5f); 
acceleration = dir; 

Para calcular el movimiento entonces solo tenemos que, como ya hemos visto, añadir la aceleración a la velocidad y esta a la posición:

velocity.add (acceleration).limit (topspeed); 
position.add (velocity); 

En este caso limitamos al velocidad usando limit () a un máximo de topspeed.

Tenemos el ejemplo completo en el repositorio git:

$ git clone https://git.clibre.io/sgp/mattractions.git

Para construir e instalar:

$ cd mattraction
$ meson build
$ cd build
$ ninja
$ ninja install

Mouse Attraction 

 

Solo con el uso de vectores podemos crear movimiento para nuestros juegos de una forma 'creíble'. Pero vamos a añadir algo más  de realismo aplicando fuerzas, que es justo lo que veremos en la próxima entrega. Espero que sea de utilidad.

 

 

(1 Voto)
Etiquetado como :

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.