W prawdziwym świecie, na którym się wzorujemy, mamy więcej niż jeden przemieszczający się obiekt - jesteśmy otoczeni przez wiele obiektów z różną masą i położeniem. Sprawdźmy, jak możemy sprawić, by nasz Mover lepiej odwzorowywał prawdziwy świat.
Aby to zrobić, potrzebujemy szybkiego przeglądu zagadnień programowania obiektowego. Ponownie, nie zamierzamy opisać wszystkich podstaw programowania obiektowego. Jednak biorąc pod uwagę, że koncept tworzenia świata wypełnionego obiektami jest podstawą wszystkich przykładów w tym kursie, warto poświęcić chwilę by nauczyć się obsługi więcej niż jednego obiektu.
Dla przypomnienia, oto jak nasz aktualny Mover wygląda. Jest on identyczny do obiektu Mover, który stworzyliśmy wprowadzając wektory, lecz z dwoma dodatkami—masą(mass) i nową metodą applyForce():
Teraz, gdy nasz obiekt jest ustalony, możemy stworzyć, dajmy na to, dwanaście instancji obiektu Mover w tablicy, inicjalizując je za pomocą pętli
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
Ale teraz mamy mały problem. Jeśli odwołamy się do konstruktora obiektu 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);
};
…odkryjemy, że każdy obiekt typu Mover jest tworzony dokładnie tak samo. Chcemy, aby różne obiekty typu Mover różniły się masą i zaczynały w różnych położeniach. Musimy teraz zwiększyć złożoność naszego konstruktora dodając argumenty.
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);
};
Zauważ, że masa i położenie nie są już na sztywno wpisanymi wartościami, lecz inicjalizowane są przez argumenty przekazane do konstruktora. Oznacza to, że możemy stworzyć wiele różnych obiektów typu Mover: dużych, małych, znajdujących się po lewej stronie ekranu, znajdujących się po prawej stronie ekranu, itp.
// Duży Mover po lewej stronie okna
var m1 = new Mover(10, 0, height/2);
// Mały Mover po prawej stronie okna
var m2 = new Mover(0.1, width, height/2);
W tablicy chcielibyśmy jednak zainicjować wszystkie obiekty za pomocą pętli.
for (var i = 0; i < 20; i++) {
    movers[i] = new Mover(random(0.1, 5), 0, 0);
}
Dla każdego utworzonego Movera, masa jest losową wartością pomiędzy 0.1 a 5. Współrzędna x położenia początkowego ma wartość 0, początkowa współrzędna y również ma wartość zero. Oczywiście, istnieje znacznie więcej sposobów by zainicjować obiekty; te przykłady to tylko przedstawienie jednej z możliwych opcji.
Gdy już tablica obiektów zostanie zadeklarowana, stworzona i zainicjowana, reszta kodu jest prosta. Wywołujemy każdy z obiektów, dodajemy do nich siły występujące w środowisku i cieszymy się widowiskiem.
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();
  }
};
Oto jak wygląda program w całości. Zauważ, że w tym programie mniejsze kółka docierają na prawy koniec ekranu szybciej niż większe. Wynika to z naszego wzoru: przyspieszenie = siła podzielić przez masę. Im większa masa, tym mniejsze przyspieszenie.

Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.
Ładowanie