Close menu
Close menu

Tunnistaudu

Kirjaudu

Etkö ole vielä jäsen?

Liity jäseneksi
Etusivu / Materiaalit / Taidetta ohjelmoimalla / 7. Laskuri / Liikettä laskurin avulla

Liikettä laskurin avulla

Laskuri

Jos teemme muuttujalla laskutoimituksen: muuttuja + 1 ja sijoitamme sen saman muuttujan arvoksi, niin saamme aikaiseksi laskutoimituksen, jossa muuttujan arvo kasvaa yhdellä. Esimerkiksi, jos määrittelemme muuttujan laskuri ja annamme sille alkuarvon heti ohjelman alussa, niin muuttuja on voimassa kaikissa aliohjelmissa. Kun sitten lisäämme laskutoimituksen: laskuri = laskuri + 1; funktioon draw, niin saamme laskurin kasvamaan, koska draw-lohko on ikuisessa silmukassa. Yhden luvun lisäys voidaan merkitä lyhemmin muodossa: laskuri++;

Katsotaan laskurin käyttöä esimerkin avulla. Tehdään ohjelma, jossa laskuri-muuttuja saa alkuarvon -50 ja laskuri kasvaa yhdellä draw-lohkossa. Lisätään ohjelmaan if-lause eli jos laskurin arvo on suurempi kuin 650, niin silloin palautamme laskurin arvon takaisin alkuarvoonsa eli -50:een. Käytännössä laskuri-muuttuja saa tällöin arvoja -50:stä 650:een. Kun laitamme laskuri-muuttujan piirtokomentoon: ellipse(laskuri,150,100,100); niin ympyrä tällöin liikkuu vasemmalta oikealle. Kun laitamme ikkunan leveydeksi 600 ja ympyrän halkaisijaksi 100, niin saamme vaikutelman, että ympyrä tulee aina vasemmalta ja häviää oikealle.

Kokonainen ohjelma on seuraavanlainen.

var laskuri = -50;                // Määritellään laskuri-muuttuja ja annetaan sille alkuarvo
function setup() {
  createCanvas(600, 300);         // Ikkunan koko on 600 x 300
  fill(0,100,200);                // Täyttöväri sininen
}

function draw() {
  background(220);                // Taustaväri harmaa
  laskuri++;                      // Kasvata laskuria yhdellä
  ellipse(laskuri,150,100,100);   // Piirrä ellipsi muuttujan avulla
  if (laskuri > 650) {            // Jos laskuri on suurempi kuin 650, niin 
    laskuri = -50;                // silloin palauta laskurille alkuarvo -50
  }                               // Lopeta if-lause
}

Kun ajat ohjelman, niin se näyttää seuraavanlaiselta.

 

Jaksollinen liike

Entä jos haluamme liikkua oikealta vasemmalle? Tällöin laitamme alkuarvoksi 650 ja pienennämme laskuria. Esimerkiksi komento: laskuri–; pienentää laskurin arvoa yhdellä, jolloin sama komento voitaisiin kirjoittaa muotoon: laskuri = laskuri -1; Entä jos haluamme liikkua nopeammin? Silloin voimme ottaa käyttöön uuden muuttujan nimeltään nopeus, jolloin laskuri voidaan kirjoittaa muodossa: laskuri = laskuri – nopeus. Alla oleva kuva havainnollistaa asiaa.

Tehdään tästä ohjelma. Tehdään vielä sellainen muutos, että y-koordinaatti muuttuu jaksollisesti sin-funktion avulla. Laitamme y-koordinaatin vaihteluväliksi -100:sta 100:aan ja siksi on järkevää siirtää origo pystysuunnassa ikkunan keskelle translate(0,height/2); komennolla. Kokonainen ohjelma on seuraavanlainen.

var laskuri = 650;                // Määrittele laskuri-muuttuja ja anna sille alkuarvo
var nopeus = 5;                   // Määrittele nopeus-muuttuja ja anna sille alkuarvo
function setup() {
  createCanvas(600, 300);         // Ikkunan koko 
  fill(0,100,200);                // Täyttöväri sininen
}

function draw() {
  background(220);                    // Taustaväri harmaa
  translate(0,height/2);              // Siirrä origo alapäin pystysuunnassa ikkunan keskikohtaan
  laskuri=laskuri-nopeus;             // Pienennä laskuri-muuttujan arvoa nopeus-muuttujan verran
  var y = 100*sin(radians(laskuri));  // Määrittele y-muuttuja ja anna sille arvo laskukaavasta
  ellipse(laskuri,y,100,100);         // Piirrä ympyrä paikkaan (laskuri,y)
  if (laskuri < -50) {                // Jos laskuri on pienempi kuin -50 niin 
    laskuri = 650;                    // silloin anna laskurille arvo 650
  }                                   // Lopeta if-lause
}

Kun ajat ohjelman, niin ohjelman suoritus näyttää tältä.

Pallo pomppaa

Kuinka saisimme ympyrän pomppaamaan reunasta? Se onnistuu helposti muuttamalla nopeus-muuttujan arvo vastakkaiseksi, jolloin lisäävä laskuri muuttuu vähentäväksi tai vähentävä laskuri muuttuu lisääväksi. Katsotaan asiaa esimerkin avulla,

var laskuri = 300;               // Määrittele laskuri muuttuja. Alussa ympyrä ikkunan keskellä
var nopeus = 5;                  // Määrittele nopeus muuttuja ja anna sille arvo
var sade = 50;                   // Määrittele sade muuttuja ja anna sille arvo
function setup() {
  createCanvas(600, 300);        // Ikkunan koko
  fill(0,100,200);               // Sininen täyttöväri
}

function draw() {
  background(220);                    // Tyhjennä tausta ja väritä se harmaaksi
  laskuri = laskuri+nopeus;           // Laskuri kasvaa/vähenee noepuden verran
  ellipse(laskuri,150,2*sade,2*sade); // Piirrä ympyrä, jonka säde on sade
  if (laskuri < (sade)) {             // Jos laskuri on pienempi kuin sade (eli alle 50 vasemmasta reunasta), niin  
    nopeus = - nopeus;                // Käännä nopeuden suunta päinvastoin (nopeus kasvaa)
  }                                   // If-lauseen lopetus-merkki
  if (laskuri > (width-sade)) {       // Jos laskuri on suurempi kuin ikkunan leveys miinus sade, niin 
    nopeus = - nopeus;                // Käännä nopeuden suunta päinvastoin (nopeus vähenee)
  }                                   // If-lauseen lopetus-merkki
}

Koska koodissa on sade-muuttuja ja lisäksi ehtolauseessa on käytetty width-komentoa, niin tällöin voit vapaasti muuttaa ikkunan kokoa ja ympyrän säteen arvoa, niin ohjelma toimii kaikissa tapaukissa. Nämä kaksi erillistä if-lausetta olisi voitu yhdistää TAI-lausella seuraavasti.

if ( (laskuri < sade) || (laskuri > (width-sade) ) ) {
      nopeus = -nopeus;
}

Kun ajat ohjelman, niin se toimii seuraavasti.

 

Pallo luo taidetta

Sovelletaan edellistä esimerkkiä käytäntöön eli lisätään mukaan myös pystysuuntainen liikesuunta. Tehdään ohjelma jossa ensin arvotaan ympyrän vaaka- ja pystysuuntainen paikka. Tallennetaan ympyrän paikka muuttujiin x ja y, jotka toimivat myös laskuri-muuttujina. Määritellään muuttuja vx, joka kertoo ympyrän vaakasuuntaisen nopeuden, sekä muuttuja vy, joka kertoo ympyrän pystysuuntaisen nopeuden. Kun laitamme vaaka- ja pystysuuntaiselle nopeudelle eri arvot, niin ympyrä ei kulje vain yhtä reittiä. Siirrämme lisäksi background-komennon setup-lohkoon, niin silloin näemme pallon reitin ikkunassa, koska ikkunan tyhjennys tehdään vain ohjelman suorituksen alussa. Aina kun ympyrä siirretään uuteen paikkaan, niin väritetään se aina satunnaisella värillä. Kokonainen ohjelma on seuraavanlainen.

var x;        // Määritellään muuttuja x. Vaakasuuntainen paikka
var y;        // Määritellään muuttuja y. Pystysuuntainen paikka
var vx= 5.4;  // Määritellään muuttuja vx. Vaakasuuntainen nopeus
var vy = 3.5; // Määritellään muuttuja vy. Pystysuuntainen nopeus
var r = 50; // pallon säde

function setup() {
     createCanvas(600,600); // Ikkunan koko
     fill(0,100,200);       // Täyttöväri sininen eli pallon väri  
     x = random(50,550);    // Arvotaan vaakasuuntainen aloituspaikka
     y = random(50,550);    // Arvotaan pystysuuntainen aloituspaikka
     background(255,255,0); // Tyhjennetään tausta (vain kerran)
     noStroke();            // Ei reunaviivaa
}
function draw () {
     fill(random(255),random(255),random(255),random(255));      // Satunnainen täyttöväri
     ellipse(x,y,2*r,2*r);                                       // Piirrä pallo 
     x = x + vx;                                                 // Liiku vasemalle/oikealle
     y = y + vy;                                                 // Liiku alas/ylös
     if ( (y+r) > height) {  // Jos ikkunan alareuna saavutettu niin,
        vy = -vy;            // muuta pystynopeuden suunta
      
     }
     if ( (y-r) < 0) {       // Jos ikkunan alareuna saavutettu niin,
        vy = -vy;            // muuta pystynopeden suunta
      
     }
     if ((x+r) > width) {  // Jos ikkunan oikea reuna saavutettu niin
         vx = -vx;         // muuta vaakanopeuden suunta
     }
     if ((x-r) <0) {       // Jos ikkunan vasen  reuna saavutettu, niin 
         vx = -vx;         // muuta vaakanopeuden suunta
     }
}

Kun ajat ohjelman, niin se näyttää tältä.