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?