Partikkelit

Listat, partikkelit ja partikkelisysteemit

Listat: ArrayList

Viidennessä luvussa tutustuimme peleihin ja olioihin. Jos pelissämme alkaa olla useita, kymmeniä tai jopa satoja erillisiä olioita, niiden käsittely muuttuu nopeasti hyvin vaivalloiseksi. Ongelmaan on olemassa näppärä ratkaisu: listat.

Alla on esimerkki ArrayListista, johon voi lisätä merkkijonoja. ArrayListiin lisätään asioita add-metodilla ja sieltä voi hakea asioita get-metodilla.

ArrayList<String> nimilista;

void setup(){
  size(200, 200);
  textSize(32);
  // luodaan uusi ArrayList nimeltä nimilista.
  // ArrayListia luodessa täytyy määritellä, minkä tyyppisiä muuttujia
  // tai olioita siihen voi lisätä. Valitaan tyypiksi nyt String.
  nimilista = new ArrayList<String>();
  nimilista.add("Liisa");
  nimilista.add("Matti");
}              

void draw(){
  // koska "Liisa" on lisätty listaan ensimmäisenä, se löytyy listan kohdasta 0. 
  // "Matti" lisättiin seuraavaksi, joten se löytyy listan kohdasta 1.
  text(nimilista.get(0), 50, 50);
  text(nimilista.get(1), 50, 100);
}

Lopputulos näyttää tältä. "Liisa" listan kohdasta, eli indeksistä 0 tulostetaan ensin ja sitten "Matti" indeksistä 1.


Partikkelit

Partikkeli on määritelmän mukaisesti pieni palanen jotakin asiaa. Sillä voi olla erilaisia fysikaalisia ja kemiallisia ominaisuuksia. Tietokonegrafiikassa partikkeleilla tai tarkemminkin partikkelisysteemeillä tarkoitetaan tekniikkaa, jossa isoilla määrillä pieniä objekteja simuloidaan esimerkiksi erilaisia luonnonilmiöitä, kuten vaikkapa vettä, tulta, tähtiä, hiuksia ja puita.

Toteutamme nyt pala palalta oman partikkelin ja sen jälkeen muodostamme niistä partikkelisysteemin. Ammennamme Processing.orgin tutoriaalista, joka käsittelee listoja ja partikkeleita, ja joka on aivan erinomaista luettavaa.

Aloitetaan luomalla luokka yhdelle partikkelille. Uusi luokka luodaan klikkaamalla välilehteä. Virkistä tarvittaessa muistiasi Pelit-luvun ohjeilla

Tarvitsemme muuttujat kuvaamaan sen sijaintia ja nopeutta, sekä kaksi metodia liikkumista ja partikkelin piirtämistä varten.

class Particle {
  // x ja y ovat partikkelin sijainti, vx ja vy partikkelin nopeus
  float x, y;
  float vx, vy;
  
 Particle(float xstart, float ystart){
   this.x = xstart;
   this.y = ystart;
  // arvotaan partikkelille alkunopeus
   this.vx = random(-1, 1);
   this.vy = random(-2, 0);
 }
 
 void move(){
   this.x += this.vx;
   this.y += this.vy;
  // lisätään partikkelin nopeuteen maan vetovoimaa simuloiva arvo 0.05 
   this.vy += 0.05;
 }
  
  void show(){
   ellipse(x, y, 20, 20); 
  }
}

Luodaan seuraavaksi Particle-luokan olio ja kokeillaan sen toimintaa pääohjelmassa.

Particle particle;

void setup() {
  size(200, 200);
  background(0);
  particle = new Particle(100, 100);
}

void draw() {
   particle.move();
   particle.show(); 
}

Nyt partikkeli sinkoaa satunnaiseen suuntaan, kun ohjelma ajetaan.


Partikkelisysteemit

Nyt olemme saaneet aikaan yhden partikkelin. Hyödynnetään nyt listaa ja listan omaa erityistä for-looppia nimelta for-each, jotta saamme ruudulle useampia partikkeleja.

ArrayList<Particle> particles;

void setup(){
  size(200, 200);
  background(0);
  // luodaan uusi ArrayList, johon laitetaan Particle-olioita
  particles = new ArrayList<Particle>();
}              

void draw(){
  // luodaan uusi partikkeli joka draw-kierroksella
  Particle particle = new Particle(100, 100);
  // lisätään uusi partikkeli listaan
  particles.add(particle);
  
  // käydään particles-lista läpi ja kutsutaan move- ja show-metodeja
  // jokaiselle listan oliolle
  for(Particle p : particles){
   p.move();
   p.show();
  }
}

Nyt ruudulla on oikea partikkelien tulva!

Esimerkkimme on hyvin yksinkertainen. Voit hyvin myös tehdä partikkelisysteemistä oman luokkansa ja olionsa - silloin partikkelisysteemeitäkin on helppo luoda useita erilaisia yhden ohjelman sisällä. Voit myös pohtia ja kokeilla, mitä tapahtuu jos ohjelma on pitkään päällä. Hidastuuko suoritus? Esimerkissämme vanhoja partikkeleita ei siivota mitenkään pois, vaan niitä tuotetaan loputtomiin. Miten ruudulta ohi menneet partikkelit saisi poistettua ohjelmasta? Millaisen ehtolausekkeen tarvitsisit sitä varten?