Ohjelmointi perustuu lopulta toistamiseen. Komentoja suoritetaan
uudestaan ja uudestaan, ja kun välissä tehdään pieniä muutoksia, saamme
aikaan jonkinlaista liikettä. Tähän mennessä tällä polulla on
työskennelty melko kokeilevasti käyttämällä satunnaislukuja muotojen
sijainteina, kokoina ja väreinä. Monet ympäristömme ilmiöt näyttävät
meistä ainakin osittain satunnaisilta, ja ohjelmointi on oivallinen
työkalu tällaisen liikkeen esittämiseen ja luomiseen.
Tässä luvussa syvennytään kuitenkin ennakoidumpaan liikkeeseen. Jatkuva
liike on jollain tapaa läsnä kaikissa kuvissa: esimerkiksi valokuvia
katsellessamme alamme vaistomaisesti kuvitella, mitä ennen kuvaa on
tapahtunut ja mitä kuvan jälkeen saattoi tapahtua.
Pohdintaruutu
Minkälaisia säännönmukaisia muotoja hahmotat yllä olevasta kuvasta? Mitä kuvasta osaisit jo toteuttaa ohjelmoimalla? Entä minkälaista liikettä löydät kuvasta? Mikä yllätys kuvassa voisi seuraavaksi tapahtua?
Idea: Ensin perehdytään vähän muuttujiin ja liikkeeseen
ohjelmoinnissa. Sitten havainnoidaan ympäristöä, ja pohditaan, mitä
tällaisella liikkeellä voisi esittää. Lopuksi viimeistellään työ.
Aloitetaan ohjelmointi
Pääset tämän harjoituksen aikana havainnoimaan ympäristöä, ja tuomaan
siellä huomaamaasi liikettä osaksi työtäsi. Liikettä luodaksemme meidän
tulee kuitenkin ensin ottaa käyttöön muutama uusi ohjelmointityökalu.
Aloitetaan harjoitus perehtymällä hieman muuttujiin ja liikkeen
luomiseen ohjelmoinnissa.
Vaihe 1
Kopioi alla oleva ohjelma Processingiin ja suorita se. Ohjelman
ylimmällä rivillä luodaan desimaalilukutyypin (float) muuttuja ja
annetaan sille nimi "paikkaX" ja alkuarvo 0.
Muuta muuttujan paikkaX alkuarvoa, joka nyt on 0. Suorita ohjelma aina
muutoksen jälkeen ja katso, miten se vaikuttaa lopputulokseen.
Ohjelman draw-osassa muutetaan paikkaX arvoa lisäämällä siihen
luku 2. Muuta lukua 2 pienemmäksi ja suuremmaksi ja katso, miten
se vaikuttaa lopputulokseen.
Vastaa lopuksi sivun alalaidassa oleviin monivalintoihin. Näitä ei
mitenkään arvioida, vaan tavoitteena on helpottaa omaa
oppimistasi.
float paikkaX = 0;voidsetup(){// Asetetaan piirtoikkunan koko.
size(750, 400);}voiddraw(){// Liikkuva neliö
rect(paikkaX, 200, 40, 40);
paikkaX = paikkaX + 2;}
Mitä suurempi on muuttujan paikkaX alkuarvo, sitä...
Mitä suurempi on muuttujaan paikkaX lisättävä arvo, sitä...
Mitä muuttujat ovat
Ohjelman yläreunassa luomasi muuttuja on kuin tietosäiliö, johon
tallennettua arvoa voi hyödyntää myöhemmin ohjelmassa, joko setup- tai
draw-osassa. Arvoa voi myös muuttaa ohjelman aikana - siitä nimi
muuttuja. Muuttujalla on Processingissa ja monissa muissakin
ohjelmointikielissä aina tyyppi, nimi ja arvo.
Ohjelman yläreunassa asetit muuttujan paikkaX alkuarvoksi 0. Käytit
muuttujaa myöhemmin rect-komennossa suorakulmion vaakasuuntaisena paikkana. Siksi ruudulle ilmestyvä suorakulmio oli aluksi aivan
piirtoikkunan vasemmassa reunassa. Muista, että x-koordinaatti on
piirtoikkunan vasemmassa reunassa 0 ja kasvaa oikealle siirryttäessä.
Jokaisella draw-metodin kierroksella muuttujan paikkaX edelliseen arvoon
lisätään 2. Ensin arvo on 0, sitten 2, sitten 4, sitten 6.…
Nelikulmio piirretään siksi koko ajan hiukan enemmän oikealle ja se
näyttää liikkuvan! Mitä suurempi luku muuttujaan lisätään, sitä
nopeammin nelikulmio liikkuu.
Asiaa on havainnollistettu alla olevassa animaatiossa. Muuttujan
paikkaX arvo on aluksi 0 ja kasvaa koko ajan.
Vaihe 2
Piirrä draw-osan alussa koko piirtoikkunan kokoinen taustanelikulmio,
joka voi olla osittain läpinäkyvä. Taustanelikulmio pyyhkii aina
aiemmat muodot piirtoikkunasta ja siksi neliön "häntä" katoaa.
Kokeile eri peittävyysarvoja taustanelikulmiolle! Muista, että arvon
tulee olla väliltä 0-255.
Extra
Voit kokeilla käyttää muuttujaa sijainnin sijaan neliön leveytenä tai
korkeutena, tai vaikka molempina samaan aikaan! Mitä tapahtuu? Esim.
rect(200, 200, paikkaX, paikkaX);
float paikkaX = 0;voidsetup(){// Asetetaan piirtoikkunan koko.
size(750, 400);}voiddraw(){// Taustanelikulmion väriksi musta. Väri on osittain läpinäkyvä(peittävyysarvo 50).
fill(0, 0, 0, 50);// Taustanelikulmion piirtäminen
rect(0, 0, 750, 400);// Neliön täyttöväriksi valkoinen
fill(255, 255, 255);// Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaapaikkaX
rect(paikkaX, 150, 40, 40);// Edelliseen paikkaX arvoon lisätään aina 2, joten paikkaX kasvaa!
paikkaX = paikkaX + 2;}
Nopeus muuttujaksi
Vaihe 3
Luo ohjelman yläosassa vielä muuttuja nopeusX, ja aseta sille jokin
arvo. Muuta draw-osaa siten, että muuttujaan paikkaX lisätäänkin
numeron sijaan nopeusX.
Vaihda nopeusX:n alkuarvoa ohjelman ylälaidassa. Suorita ohjelma aina
muutoksen jälkeen niin huomaat, mihin arvo vaikuttaa. Tässä ei tehdä
mitään kovin uutta, sillä aiempi numero korvattiin vain numeron
sisältävällä muuttujalla.
float paikkaX = 0;float nopeusX = 2;voidsetup(){// Asetetaan piirtoikkunan koko.
size(750, 400);}voiddraw(){// Taustanelikulmion väriksi osittain läpinäkyvä musta
fill(0, 0, 0, 50);// Taustanelikulmion piirtäminen
rect(0, 0, 750, 400);// Neliön täyttöväriksi valkoinen
fill(255, 255, 255);// Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaa paikkaX
rect(paikkaX, 150, 40, 40);// Edelliseen paikkaX arvoon lisätään aina muuttuja nopeusX, joten paikkaX kasvaa!
paikkaX = paikkaX + nopeusX;}
Pystysuuntainen liike
Neliö on tähän mennessä liikkunut pelkästään vaakasuuntaisesti.
Pystysuunnassa paikka on ollut koko ajan sama. Liikutetaan neliötä
seuraavaksi myös pystysuunnassa. Tämä tapahtuu ihan samalla
periaatteella kuin vaakasuuntainenkin liikuttelu. Luodaan siis kaksi
uutta muuttujaa pystysuuntaista liikettä varten.
Vaihe 4
Luo ohjelman yläosassa vielä kaksi uutta muuttujaa: paikkaY ja
nopeusY. Anna näille jotkin alkuarvot.
Lisää draw-osassa muuttujan paikkaY arvoon muuttuja nopeusY.
Kokeile muuttujille paikkaY ja nopeusY eri arvoja ohjelman
ylälaidassa. Suorita ohjelma aina muutoksen jälkeen. Miten nämä arvot
vaikuttavat lopputulokseen?
float paikkaX = 0;float nopeusX = 2;float paikkaY = 100;float nopeusY = 1;voidsetup(){// Asetetaan piirtoikkunan koko.
size(750, 400);}voiddraw(){// Taustanelikulmion väriksi osittain läpinäkyvä musta
fill(0, 0, 0, 50);// Taustanelikulmion piirtäminen
rect(0, 0, 750, 400);// Neliön täyttöväriksi valkoinen
fill(255, 255, 255);// Neliön piirtäminen. Vaakasuuntaisena paikkana käytetään muuttujaa paikkaX ja pystysuuntaisena muuttujaa paikkaY.
rect(paikkaX, paikkaY, 40, 40);// Edelliseen paikkaX arvoon lisätään aina muuttuja nopeusX, joten paikkaX kasvaa!
paikkaX = paikkaX + nopeusX;// Edelliseen paikkaY arvoon lisätään aina muuttuja nopeusY, joten paikkaY kasvaa!
paikkaY = paikkaY + nopeusY;}
Havainnoidaan!
Olemme tähän mennessä luoneet tasaista liikettä muuttujien avulla. Ehkä
sinulle onkin syntynyt jokin ajatus siitä, mitä tällaisella liikkeellä
voisi esittää tai ilmaista? Seuraavaksi pääset jalostamaan liikettä
kohti tekemiäsi havaintoja.
Vaihe 5
Tuuleta aivojasi pienellä havainnointikävelyllä! Voit käydä pihalla, tai
havainnoida vaikka ihan työpisteesi ympäriltäkin llöytyviä asioita.
Poimi ympäristöstä jokin tasaisesti liikkuva objekti, ilmiö tai
olio. Liike on harvoin täysin tasaista, mutta kunhan kyse ei ole ihan
mielivaltaisesta poukkoilusta, niin se kelpaa. Voit jo pohtia, miten
poimimaasi asian voisi esittää pelkistämällä sen yhteen tai muutamaan
geometriseen muotoon.
Poimi liikkeen ympäriltä jokin paikallaan pysyvä säännöllinen muoto
tai jokin asia, jota voisit pelkistää erilaisilla geometrisilla
muodoilla. Muotoja voi myös olla useita. Jos kyseessä on maisema, voi
muoto olla esimerkiksi rakennus, tie, taivas, kukkula tai sateenkaari.
Jos teet jotain rajatumpaa, voi muoto olla jokin esine, yksityiskohta
tai vaikka kehon osa!
Hitaat ja abstraktit muutokset?
On olemassa paljon tasaista muutosta, jota on vaikea havaita lyhyessä ajassa. Tällaista on esimerkiksi auringon nouseminen, päivän vaihtuminen yöksi tai ilmastonmuutoksen eteneminen. Toisaalta voidaan puhua tunnelman tai mielialan vaihtelusta, ja tällaista “liikettä” voi visualisoida esimerkiksi värieen vaihtumisella tai liikkeen rytmin muutoksilla.
Jos haluat, voit ottaa hidasta tai abstraktiakin liikettä tämän tehtävän lähtökohdaksi!
Havaintoja kohti
Olet tähän asti liikutellut objektia melko kokeilevasti. Nyt voit
pohtia, miten voisit hyödyntää liikettä havainnoimiesi asioiden
esittämisessä. Muista, että kyse on tässä kohtaa pelkistävästä
ilmaisusta - tarkka jäljitteleminen ei ole välttämättä hedelmällistä.
Vaihe 7
Korvaa aiempi liikkuva neliö muodolla. joka voisi esittää
havaitsemaasi liikkuvaa asiaa. Voit joko säätää suorakulmion kokoa
muokkaamalla rect-komennon kahta viimeistä parametriä, tai sitten
vaihtaa muodon esimerkiksi ellipsiksi. Kun vaihdat vielä muodon väriä,
saa ellipsillä tai nelikulmiolla pelkistettyä jo hyvin monenkaltaisia
asioita.
Säädä myös muodon lähtöpaikkaa ja nopeutta sopivaksi muuttamalla
muuttujien lähtöarvoja ohjelman ylälaidassa.
Extra
Voit käyttää muuttujia myös fill-komennon sisällä. Tällöin väritkin
vaihtuvat. Värit voivat olla jopa ainoa muuttuva asia teoksessa!
Käytä muuttujaa muodon korkeutena tai leveytenä. Jos muodon koko
kasvaa tasaisesti, se näyttää tulevan koko ajan lähemmäksi. Tämä tuo
teokseen kolmiulotteisuutta.
Eikö ellipsi tai suorakulmio riitä? Myös esim.
kolmion,
nelikulmion tai viivan
liikuttelu on mahdollista. Nämä muodot piirretään määrittelemällä
niiden kärkipisteistä jokainen erikseen. Voit halutessasi liikuttaa
esimerkiksi vain yhtä kolmion kärkipistettä muiden pysyessä
paikallaan.
Voit koostaa objektin myös useista muodoista ja liikutella niitä
samanaikaisesti. Sivun alalaidassa on malliksi koodi, jossa kuudesta
muodosta koostettu harakka liitelee piirtoikkunan läpi.
//Tämä on extra-tekemistä!
//Jos sinulla on intoa ja kärsivällisyyttä, voit tehdä sommitelman useista muodoista ja liikutella sitä
//Tässä koodissa piirretään useista muodoista koostuva harakka.
//Jokainen muoto paikannetaan erikseen käyttämällä muuttujia paikkaX ja paikkaY.
//Kun näiden muuttujien arvot muuttuvat, harakka liikkuu
//Ensin Harakan pää
fill(0);
ellipse(paikkaX, paikkaY, 10, 10);//Harakan keho
fill(255);
rect(paikkaX - 12, paikkaY, 8, 18);// Harakan sininen osa
fill(0, 20, 240);
rect(paikkaX-15, paikkaY, 5, 10);// Harakan vihertävä pyrstö
fill(50, 200, 20);
rect(paikkaX-50, paikkaY, 30, 5);// Harakan mustat siivet on tehty nelikulmioina quad-komennoilla.
fill(0);
quad(paikkaX-10, paikkaY, paikkaX-25, paikkaY-25, paikkaX-50, paikkaY-50, paikkaX + 10, paikkaY - 25);
quad(paikkaX-10, paikkaY, paikkaX-25, paikkaY+25, paikkaX-50, paikkaY+50, paikkaX + 10, paikkaY - 25)
Muoto maisemassa
Vaihe 8
Lisää työhösi aiemmin havaitsemasi paikallaan pysyvä muoto, joka
auttaa hahmottamaan liikkeen mittasuhteet ja ehkä luo teokseen
perspektiiviäkin.
Piirrä muoto draw-osan alussa heti taustanelikulmion piirtämisen
jälkeen.
Alla on muutamia esimerkkejä muodoilla esittämisestä ja
pelkistämisestä.
Viimeistele vielä työsi. Muista, että harjoituksen tavoitteena on ollut tutkia liikettä ja sen lakeja pelkistämisen kautta, ei esittää asioita yksityiskohtaisesti.
Alla on jonkin verran extra-ideoita. Jos virtaa vielä riittää, tutustu niistä ainakin muutamaan!
Extra
Jos haluat, voit kehitellä työtäsi pidemmälle esimerkiksi seuraavin
keinoin.
Lisää setup- ja draw-osien
ulkopuolelle mouseClicked-osa,
jonka sisällä olevat komennot suoritetaan aina hiirtä klikattaessa.
Vaihda osan sisällä muuttujien nopeusX ja nopeusY arvot joksikin
toisiksi. Nyt liikkeen suunta muuttuu, kun klikkaat hiirtäsi työn
päällä (painat ja päästät
ylös)! Voit
käyttää nopeutena myös negatiivista arvoja tai nollaa. Jos vaihdat
nopeudet nolliksi aina hiirtä klikattaessa, liike pysähtyy.
Esim.
voidmouseClicked(){
nopeusX =-2;
nopeusY = 3;}
Olet tässä harjoituksessa muuttanut muodon paikkaa lisäämällä
paikka-muuttujiin tasaisena pysyvän nopeuden. Kokeile lisätä
muuttujiin paikkaX ja paikkaY nopeuden sijaan satunnaisluku, esim.
seuraavalla tavalla.
Satunnaisuutta voi myös hyödyntää siten, että aina hiirtä
klikattaessa nopeudet arvotaan uudestaan joltakin väliltä.
Mitä jos liikkuvan asian kokoa voisi säätää reaaliaikaisesti hiirtä
liikuttamalla? Aseta muodon leveydeksi ja korkeudeksi muuttujat
mouseX ja
mouseY, jotka pitävät
kirjaa hiiren sijainnista.
Loppuivatko ideat kesken? Ota pohjaksi viikon 2 Bezier-työsi, ja
lisää siihen tasaisesti liikkuvia muotoja!
Haluaisitko, että luomasi muoto palaisi takaisin ikkunaan, kun se on
ylittänyt piirtoikkunan
rajan? Lisää if-lause koodisi
draw-osaan. Seuraava koodi palauttaa paikkaX-muuttujan takaisin
nollaan, jos se ylittää arvon 750. Aseta arvon 750 tilalle oman
piirtoikkunasi leveys.