Bij het maken van de laatste oefening heb je gemerkt dat je nog steeds veel manueel aan het doen bent. Het zelf aanmaken van 5 objecten kost best veel werk en levert alsnog veel globale variabelen op.
We kunnen het maken en updaten van een grote hoeveelheid objecten automatiseren door gebruik te maken van een speciaal soort array: een arrayList.
Een ArrayList maken
Een ArrayList is bijzonder omdat je deze kan vullen met objecten en omdat je gemakkelijk objecten kan bijvoegen of weghalen uit de lijst. In tegenstelling tot een gewone array moeten we niet definiëren hoe groot de lijst zal zijn.
Om een ArrayList te maken gebruiken we volgende syntax:
ArrayList <MovingCircle> cirkels = new ArrayList<MovingCircle>();
we merken hier een aantal zaken op:
- Een ArrayList is een type variabele
- Een ArrayList heeft een naam. In ons geval cirkels
- het type object dat we willen opslaan in de lijst komt tussen <> te staan
Een ArrayList vullen
Om een ArrayList te vullen gebruik je de functie .add(). Er wordt dan letterlijk 1 object aan de lijst toegevoegd. Binnen de add() functie maak je in feite een nieuw object aan zoals je dat gewend bent.
cirkels.add(new MovingCircle(3));
Als we meerdere objecten willen toevoegen in 1 keer (en dat was toch onze bedoeling), bouwen we een for loop. Het maakt niet uit hoe lang deze wordt. In de loop gebruiken we de .add() functie.
for(int i=0; i<5; i=i+1){ cirkels.add(new MovingCircle(3)); }
Op deze manier voeg ik 5 cirkels aan de lijst toe, met een snelheid van 3.
Uiteraard heeft deze methode meestal enkel zin als ik objecten aan de lijst toevoegen die verschillend van elkaar zijn. Ik pas mijn code daarom aan naar:
for(int i=0; i<5; i=i+1){ cirkels.add(new MovingCircle(int(random(10))); }
Op deze manier worden cirkels met een willekeurige snelheid tussen 0 en 10, omgezet naar een geheel getal, toegevoegd aan mijn ArrayList.
Objecten uit een ArrayList ophalen
wanneer we onze objecten uit de ArrayList willen ophalen, gebruiken we opnieuw een for loop. Aangezien we niet weten of de lijst langer of korter is geworden tijdens het lopen van ons programma, gebruiken we steeds de .size() functie om de lengte van de lijst op te vragen. (vergelijkbaar met de .length om de lengte van een standaard array op te vragen)
for(int i=0; i<cirkels.size(); i=i+1){ }
Als we door de ArrayList loopen, vragen we elk object op. Dit doen we met het .get() commando. Het resulterende object slaan we op in een tijdelijke variabele:
for(int i=0; i<cirkels.size(); i=i+1){ MovingCircle c = cirkels.get(i); }
Nu kunnen we door gebruik te maken van deze tijdelijke variabele (c in ons geval) data opvragen uit al onze objecten in de lijst, alle objecten laten updaten of iets laten zien etc…
Als we bijvoorbeeld alle objecten in onze lijst willen laten updaten en laten zien dan kunnen we dat op deze manier voor ons programma:
for(int i=0; i<cirkels.size(); i=i+1){ MovingCircle c = cirkels.get(i); c.drawBlackCircle(); }
Dynamisch objecten toevoegen
het grootste voordeel van een ArrayList ten opzichte van een gewone array is dat de lengte kan variëren. Het is dus heel eenvoudig om op elk moment in je programma een object toe te voegen of te verwijderen.
Wanneer we bijvoorbeeld een nieuw object willen toevoegen als er geklikt wordt met de muis kunnen we dat op deze manier doen:
cirkels.add(new MovingCircle(int(random(8)));
Telkens als ik nu klik zal er een cirkel worden toegevoegd met een willekeurige snelheid tussen 0 en 8. Als er in mijn draw loop een for loop zit die door de hele ArrayList heen loopt, zal mijn nieuw object ook direct tevoorschijn komen en mee updaten met de rest.
Als we alle voorgaande samenvoegen tot 1 codevoorbeeld krijgen we:
Inleveropdracht
Maak een programma waarbij er een cirkel verschijnt op de plek van de muis als er wordt geklikt. Deze cirkel wordt in een ArrayList bewaard en heeft een willekeurige grootte, x snelheid en y snelheid.