Liikeen animointi
Liikkeen animointi
Edellisissä esimerkeissä olet luonut animaatioita random-metodin avulla.
Esimerkiksi komento
ellipse(random(width), random(height), 50,50);
piirtää 50 pikseliä
leveän ympyrän satunnaiseen sijaintiin ruudulla. Entä jos haluat
animoida jatkuvaa liikettä? Yksinkertainen esimerkki voisi olla
x-koordinaatin kasvattaminen jokaisen piirtokerran jälkeen. Kokeile
seuraavaa esimerkkiä:
float x = 0;
float speed = 1;
void setup() {
size(500,500);
}
void draw(){
ellipse(x,height/2,50,50);
x = x + speed;
}
Esimerkki toimii hienosti, kunnes ellipsi saavuttaa ruudun oikean reunan. Olisi mukavaa, jos ellipsi vaihtaisi suuntaa kohdatessaan reunan, eli kimpoaisi reunasta. Suomeksi ilmaistuna ohjelman käytös vaikuttaisi tältä:
Piirrä ellipsi.
Muuta ellipsin x-koordinaattia nopeuden verran.
Jos x-koordinaatti on suurempi kuin leveys:
- muuta nopeus negatiiviseksi.
Jos x-koordinaatti on pienempi kuin 0:
- muuta nopeus positiiviseksi.
Uutta edeltävässä kuvauksessa ovat "jos suurempi kuin" ja "jos pienempi kuin" -rakenteet. Processingilla ilmaistuna "Jos suurempi, kuin leveys" näyttää tältä:
if (x > width) {
//tämä koodi suoritetaan jos x on suurempi kuin width
}
Kokonaisuudessaan edellinen esimerkki näyttää tältä:
float x = 0;
float speed = 1;
void setup() {
size(500,500);
}
void draw(){
ellipse(x,height/2,50,50);
x = x + speed;
if (x > width) {
speed = speed * -1;
}
if (x < 0) {
speed = speed * -1;
}
}
Esimerkki toimii nyt oikein mainiosti. Ellipsi liikkuu edestakaisin x-akselilla ja kimpoaa pystyreunoista. Ohjelmassa on kaksi eri ehtolausetta, jotka toteuttavat täsmälleen saman toiminnallisuuden. Edellistä esimerkkiä elegantimpi tapa olisi ilmaista looginen ehto yhdessä lauseessa:
Jos x < width tai x < 0:
- muuta nopeus nopeuden vastaluvuksi
Tai ilmaistaan javassa merkillä '||'. Ja ilmaistaisiin javassa merkillä '&&'. Näin ollen lause 'jos x < width tai x < 0' voidaan ilmaista seuraavasti:
if (x < 0 || x > width) {
//code here
}
Koko esimerkki näyttää tältä:
float x = 0;
float speed = 1;
void setup() {
size(500,500);
}
void draw(){
ellipse(x,height/2,50,50);
x = x + speed;
if (x < 0 || x > width) {
speed = speed * -1;
}
}
Lisätehtävä
Edellisessä esimerkissä y-koordinaatti pysyi vakiona. Toteuta nyt y-koordinaatille sama toiminnalisuus, kuin edellisessä esimerkissä toteutettiin x-koordinaatille.
Vinkki: Luo y, speedX ja speedY
-muuttujat.
Tehtävästä voi olla sinulle apua seuraavan sivun harjoituksessa, joka päättää tämän luvun.