Info Draft Processing suomeksi

Metodit

Yksi menetelmä on blokki, joka sisältää ohjeet, joita tahdot käyttää uudestaan. Metodeita on hyvä käyttää, sillä voimme kirjoittaa toiminnon vain kerran ja käyttää sitä uudestaan lukemattomia kertoja. Käyttäessämme metodia koodissamme voimme kutsua sitä uudestaan eri kohdissa ohjelmaa.

Tiedät jo monia metodeja, mutta vain käyttäjänä. Esimerkiksi rect(), ellipse(), line() ja stroke() ovat kaikki metodeja. Luomalla omat metodimme voimme lisätä Processingiin ominaisuuksia, joita ohjelman kehittäjät eivät ole vielä tehneet.

Tässä on puhtaan teoreettinen esimerkki lopputuloksesta. 

tausta(255);
kaunisMaisema();
puu(sypressi, 0,300);
kuu(400,100);
ruoho(0,300,width,100);
lammas(50,133);
lammas(213,98);
lammas(155,88);

Päämääränä on pakata ohjelmien monimutkaisuus avainsanoihin, joita voit kutsua niin usein kuin tahdot. Samalla voit käyttää Processingin omia metodeja. Tuloksena on yksinkertaisempi ja luettavampi koodi. Myös toistolta vältytään. Enemmän järjestystä ja vähemmän leikkaamista ja liimaamista. 

 

Avainsanat

Kun luomme omat metodimme, meidän täytyy antaa jokaiselle niistä nimi. Kun metodi on nimetty, sitä voidaan käyttää ohjelmassa. Kutsu sitä vain sen nimellä.

Processing yhdistää joukon menetelmiä, joilla voimme korjata omat versiomme. Tämä pätee metodeille draw(), setup(), mousePressed()... Katso muista luvuista. Voimme myös luoda kustomoituja metodeja antamalla niille valitsemamme nimen. Tässä tapauksesa voit vain varoa käyttämästä nimeä, joka on jo otettu.

Leikkaus

Toistaiseksi olemme ohjelmoineet lineaarisesti Processingissa, olemme kirjoittaneet koodia ohjelman alusta alaspäin. Kun tahdomme luoda ohjelmamme metodit itse, joudumme leikkaamaan ohjelmamme kappaleiksi. Tämä antaa meidän osoittaa osat, jotka suoritetaan heti ohjelman alussa, ja ne osat, jotka kutsutaan myöhemmin.

Huono puoli on se, että emme voi kirjoittaa komentoja suoraan Processingiin laittamatta niitä metodin tai luokan sisään. Metodien kanssa toimiminen on kaikki tai ei mitään.

void setup ()

Processing tarjoaa paikan kirjoittaa koodia, joka suoritetaan ohjelmamme alussa. Tämä metodi on setup()

 

void setup() {

}

Kaikki ohjelman alussa suoritettava koodi pitää sijoittaa metodin setup() aaltosulkujen sisälle. Nyt ei kannata miettiä sanan void merkitystä, mutta sen täytyy olla ohjelman alussa. Tämän jälkeen sana setup, jota seuraa sulut, ja sitten aaltosulut.

Suurimman osan aikaa käytämme menetelmää setup() määrittelemään kuvamme koon. Tämä koko voidaan asettaa vain kerran - mikä yhteensattuma, sillä käynnistyskin tapahtuu vain kerran ohjelmassa. 

 

void setup() {
  size(500,500);
}

Luo kustomoituja metodeja

 

Alla olevissa esimerkeissä luomme metodin luoLammas(), joka sisältää ohjeet lampaan piirtämiseen.

quatre_moutons

Todellisuudessa lammas on kätketty laatikkoon, joten näemme vain laatikon! Se piirtää myös reikiä, jotta lammas voisi hengittää. Kutsumme tätä metodia monta kertaa piirtääksemme enemmän lampaita.

Tässä on koodi piirtämiselle:

void setup() {

  size(600, 220);
  background(153,204,255);
  smooth();

  // Kutsutaan metodiamme lampaan piirtämiseksi
  luoLammas();
  translate(120, 60);
  luoLammas();
  translate(120, 60);
  luoLammas();
  translate(140, -60);
  luoLammas();
}


// Metodi lampaan piirtämiseksi.

void luoLamma() {

  strokeWeight(3);
  strokeJoin(ROUND);
  stroke(0);
  fill(255);

  rect(20, 40, 80, 40);
  beginShape();
  vertex(20, 40);
  vertex(40, 20);
  vertex(120, 20);
  vertex(120, 40);
  endShape(CLOSE);

  beginShape();
  vertex(100, 40);
  vertex(120, 20);
  vertex(120, 60);
  vertex(100, 80);
  endShape(CLOSE);

  fill(0);
  ellipse(40, 60, 5, 5);
  ellipse(60, 60, 5, 5);
  ellipse(80, 60, 5, 5);
}

Ohjelman alku määritellään metodissa setup(). Koska käytämme metodia piirtääksemme lampaamme, loput ohjelmasta pitää sijoittaa johonkin tässä metodissa. Processingissa: 

 void setup() {
}

Tämän jälkeen määrittelemme kuvamme koon ja sen taustavärin.

  size(600, 220);
  background(153,204,255);

Olet ehkä esittänyt kysymyksen komennon smooth() roolista ohjelmassamme. Tämä komento on valinnainen, mutta se antaa meille miellyttävimmät viivat tietokoneen ruudulla. 

smooth();

Lopulta piirrämme lampaan käyttäen menetelmää, jonka olemme määritelleet myöhemmin.

  luoLammas();

Kun Processing kohtaa sanan luoLammas() se tietää sanojen olevan metodina jossain ohjelmassamme. Jos tämä metodi on olemassa, se kulkee tämän metodin läpi ja tekee kaiken sen sisällä olevan. 

Jos tätä metodia ei löydy - ja sitä ei ole Processingissa itsessään - ohjelmasi lopettaa virheviestiin.

Huomaa: voit kirjoittaa avainsanan luoLammas () niin monta kertaa kuin tahdot. Tässä ohjelmassa luoLammas() on kirjoitettu 4 kertaa:

  luoLammas();
  translate(120, 60);
  luoLammas();
  translate(120, 60);
  luoLammas();
  translate(140, -60);
  luoLammas();

Huomaa, että asetimme jokaisen metodin luoLammas () väliin komennon translate (x, y). Tämä komento antaa meidän piirtää saman lampaan neljä kertaa eri paikkaan. Luku Muutokset selittää komennon translate() toiminnan. Komentoa translate () käytetään siirtämään piirrosten alkupiste. 

void luoLammas() {
  
  /* ... */

}

Lopulta pääsemme metodiin luoLammas() itseensä. Tässä piirrämme tarvitut viivat ja muodot. Emme keskustele tästä, sillä käytetyt komennot selitetään muotoja käsittelevässä luvussa. 

Huomaa void-avainsana ennen metodimme nimeä. Tämä merkitsee, että se ei palauta mitään. Emme siis saa dataa ulos metodistamme.

 

Metodin palautusarvo

 

Metodilla voi olla palautusarvo. Toistaiseksi emme ole määritelleet palautusarvoa. Metodilla setup() tai draw() ei ole palautusarvoa. Sana void kertoo näissä tapauksissa, että mitään ei pitäisi palauttaa metodille, joka kutsui ne.

Jos metodilta tahdotaan ulos joku tieto, se tulee palautusarvon muodossa. Jos tahdomme tietää paljonko kello on, käytämme metodia second(), minutes() tai hour() saadaksemme niiden arvon muodossa integer (int). Jos nämä metodit eivät anna meille mitään (void) palautusarvona, ne eivät mahdollistaisi hyödyllisiä toimintoja.

Metodien täytyy palauttaa arvo kutsulle, joka on esitetty ennen avainsanaa, joka määrittelee palautetun arvon tyypin. Metodi jonka tyyppi on int palauttaa arvotyypin int, metodi jonka tyyppi on float palauttaa tyypin float arvon, ja niin edelleen.

Tässä on esimerkki metodista, joka antaa sekuntien määrän kellon 00:00:00 jälkeen.

int sekuntejaEilisesta() {
  return hour() * 3600 + minute() * 60 + second();
}

void draw() {
  println( sekuntejaEilisesta() );
}

Jos et tiedä metodia draw(), käytä silti tätä miniohjelmaa ja katso konsolia Processing-ikkunan alaosassa. Voit nähdä, että metodi draw() kutsuu jatkuvasti komentoa sekuntejaEilisesta () ja käyttää tämän metodin tuloksia näyttääkseen sekunteja. 

Metodin parametrit

Metodi voi ottaa vastaan parametrejä. Yleensä niitä kutsutaan argumenteiksi. Jokaisella parametrillä täytyy olla tyyppi ja nimi, aivan kuin muuttujilla.

Metodin kutsumiseksi voit kirjoittaa sen nimen, jonka perään tulee sulut. Sulkujen sisällä ovat metodin parametrit. 

kerroin(2, 2);

Metodin sisällä Processing pääsee käyttämään niiden arvoja, kuten se tekee muuttujien kanssa.

Esimerkiksi tässä metodi kutsutaan argumenteilla 2 ja 2, arvot ovat a = 2 ja b = 2. Metodin palautusarvo on 4. 

int kerroin⁞(int a, int b) {
  return a * b;
}

Huomaa, että argumenttien sijainti määrittää, mitkä arvot asetetaan mihinkin pisteeseen.

multiplier

Esimerkissä loimme metodin, joka palauttaa kahden argumentin kertolaskun tuloksen. Tämä kerrotaan metodia ennen olevassa kommentissa. Tällainen kommentointi on hyvä tapa. 

/*
 * Palauta kahden argumentin kertolaskun tulos. 
 */
int kerroin(int a, int b) {
  return a * b;
}

void setup() {
  int tulos = kerroin(2, 2);
  print(tulos);
}

multip_result.tiff

Muuttujien laajuus


Katsotaanpa yleistä virhettä, joka voi tapahtua, kun käytät ohjelmassa muuttujia ja metodeja.

Muuttujat - olkoot primitiivisiä tyyppejä tai objekteja - eivät välttämättä ole saatavilla koko ohjelmassasi. Se riippuu niiden julistuspaikasta. Metodin sisällä julistettu muuttuja on käytettävissä seuraavassa: 

void setup() {
  int x = 10;
}

void draw() {
  /* Tästä ohjelmasta tulee virheviesti, koska 
   * muuttuja x on olemassa vain metodin setup() sisällä 
   */
  x = x + 1;
}

var_error.tiff

Jotta muuttujat ovat saatavilla koko ohjelmassasi, sinun pitää julistaa se ohjelman alussa: 

int x;

void setup() {
  x = 10;
}

void draw() {
  x = x + 1;
}