En el mundo real, en el cual estamos buscando inspiración, tenemos más de un objeto en movimiento: estamos rodeados por muchos objetos de masa y ubicación variables. Veamos como podemos conseguir que nuestro Mover simule mejor ese aspecto del mundo real.
Para hacer esto, necesitaremos una revisión rápida de programación orientada a objetos. De nuevo, no estamos cubriendo todos los conocimientos básicos de programación OO aquí. Sin embargo, puesto que la idea de crear un mundo lleno de objetos es fundamental para todos los ejemplos en este curso, vale la pena tomar un momento para recorrer los pasos para ir de un objeto a muchos.
Como recordatorio, así es como se ve nuestro Mover actual. Es idéntico al Mover que creamos cuando introdujimos vectores por primera vez, pero con dos cosas más: masa y un nuevo método applyForce():
Ya que nuestro objeto está definido, podemos crear, digamos, veinte instancias de Mover con un arreglo, inicializándolos con un bucle
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
Pero ahora tenemos un pequeño problema. Si nos referimos de nuevo al constructor del objeto Mover
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(30, 30);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
…descubrimos que cada objeto Mover se hace exactamente de la misma manera. Lo que queremos son objetos Mover con masa variable que comiencen en ubicaciones variables. Aquí es donde tenemos que aumentar la sofisticación de nuestro constructor agregándole argumentos.
var Mover = function(m, x, y) {
    this.mass = m;
    this.position = new PVector(x, y);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
Observa cómo la masa y la ubicación ya no se igualan a números predefinidos, sino más bien se inicializan mediante argumentos que se pasan a través del constructor. Esto significa que podemos crear una variedad de objetos Mover: grandes, pequeños, que empiezan a la izquierda de la pantalla, que empiezan a la derecha, etc.
// Un Mover grande del lado izquierdo de la pantalla
var m1 = new Mover(10, 0, height/2);
// Un Mover pequeño del lado derecho de la pantalla
var m2 = new Mover(0.1, width, height/2);
Sin embargo, con un arreglo queremos inicializar todos los objetos con un bucle.
for (var i = 0; i < movers.length; i++) {
    movers[i] = new Mover(random(0.1, 5), 0, 0);
}
Para cada mover creado, la masa se hace igual a un valor aleatorio entre 0.1 y 5, la ubicación inicial de x se hace igual a 0 y la ubicación inicial de y se hace igual a 0. Ciertamente, hay todo tipo de formas que podríamos elegir para inicializar los objetos; esta es solo una demostración de una posibilidad.
Una vez que se declara, crea e inicializa el arreglo de objetos, el resto del código es sencillo. Pasamos por todos los objetos, les damos cada una de las fuerzas en el entorno y disfrutamos del espectáculo.
draw = function() {
  background(50, 50, 50);

  for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0.01, 0);
    var gravity = new PVector(0, 0.1);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
};
Aquí está cómo se ve el programa ya todo junto. Observa cómo en el programa, los círculos más pequeños llegan a la derecha de la ventana más rápido que los grandes. Esto es debido a nuestra fórmula: aceleración = fuerza dividida entre la masa. Entre mayor sea la masa, menor será la aceleración.

Este curso de "Simulaciones Naturales" es un derivado de "La Naturaleza del Código" por Daniel Shiffman, usado bajo una Licencia Creative Commons Reconocimiento-NoComercial 3.0 Unported.