Info Draft Processing suomeksi

Objektien animointi

Olioiden animointi

Olioiden animointi on näyttämö, jolle voimme ajatella laajempia käyttötarkoituksia. Olion animointi merkitsee toimintojen lisäämistä malliin: liike, pomppoilu, törmäysten testaus jne. Tämä luku näyttää esimerkkejä luvussa Oliot luodun pallon käsittelystä ja sen pomppoiluttamisesta ruudun neljän reunan välillä.

Lopputulos on kuin seuraavassa kuvassa. Laitamme viivästysefektin näyttääksemme pallon liikeradan.

Balle3

Koodiperusta

Alkupisteeksi otamme pallon koodin luvusta Kohteet. Se antaa meidän nähdä pallon ruudulla. Tämän proseduurin kuluessa lisäämme koodinpätkiä perusesimerkkiin. Uudet osat näytetään paksulla ja niissä on kommentit //LISÄÄ tai // LISÄYS ALKAA ja // LISÄYS LOPPUU. Voit myös kopioida koko koodiblokin ja korvata kyseessä olevan luokan tai metodin.

Balle

//Yhden pallon instanssin julistaminen
Pallo myPallo = new Pallo(100, 100, color(255));

void setup() {
  smooth(); 
  size(400, 200); //Ikkunan koko
}

void draw() {
  background(0); //Mustan taustan luominen
  noStroke(); //Ei ääriviivaa

  myPallo.display(); //Näytetään pallo
}

class Pallo {
  //Pallon ominaisuuksien julistus
  float x;
  float y;
  color col;

  //Pallon luominen
  Pallo (float newX, float newY, color newColor) {
    x      = newX;
    y      = newY;
    col    = newColor;
  }

  //Pallon suunnittelu
  void display() {
    fill(col);
    ellipse(x, y, 40, 40);
  }
}

Liike

Pallon täytyy liikkua x- ja y- akseleita pitkin. Luomme kaksi muuttujaa malliin ja olion toimintaa edustaa sen nopeus akseleita x ja y pitkin. Tämän jälkeen lisäämme olioon uuden metodin move(), jota kutsutaan ohjelman metodista draw(). Tämä metodi tulee kuitenkin, aina oliota näytettäessä, muuttamaan pallon sijaintia suhteessa sen nopeuteen. Se alustaa myös konstruktorin nopeuden kuvaavat muuttujat. Aluksi annamme niille pysyvän arvon.

class Pallo {
  //Pallon ominaisuuksien julistus
  float x;
  float y;
  float speedX; //LISÄÄ
  float speedY; //LISÄÄ
  color col;

  //Pallon rakentaminen
  Pallo (float newX, float newY, color newColor) {
    x      = newX;
    y      = newY;
    col    = newColor;

    speedX = 2; //LISÄÄ
    speedY = 2; //LISÄÄ
  }

  //Pallon suunnittelu
  void display() {
    fill(col);
    ellipse(x, y, 40, 40);
  }

  //LISÄYS ALKAA
  void move() {
   x = x + speedX;
   y = y + speedY;
  }
  //LISÄYS LOPPUU
}

Se kutsuu metodia move() metodista draw(). Voimme lisätä kutsun komentoon background pyyhkiäksemme ruudun jokaisen uuden kuvan jälkeen. 

void draw() {
  background(0); //Mustan taustan luominen
  noStroke(); //Ei ääriviivoja

  //Pallon liikuttaminen ja näyttäminen
  myPallo.move(); //LISÄÄ
  myPallo.display();
}

Törmäykset

Tällä hetkellä pallo jatkaa liikettään törmätessään ruudun seinään. Pallo pitäisi saada poukkoilemaan seinistä, joten lisäämme metodin testaaTormays, joka kääntää pallon liikesuunnan sen osuessa seinään.

class Pall {
  //Pallon ominaisuuksien julistaminen
  float x;
  float y;
  float speedX;
  float speedY;
  color col;

  //Pallon luominen
  Pallo (float newX, float newY, color newColor) {
    x      = newX;
    y      = newY;
    col    = newColor;

    speedX = 2;
    speedY = 2;
  }

  //Pallon suunnittelu
  void display() {
    fill(col);
    ellipse(x, y, 40, 40);
  }

  void move() {
   x = x + speedX;
   y = y + speedY;
  }

  //LISÄYS ALKAA
  void testaaTormays() {
    //Pallo pomppaa törmätessään seinään
    if (x > width-20 || x < 20) {
      speedX = speedX * -1;
    }
    if (y > height-20 || y < 20) {
      speedY = speedY * -1;
    }
  }
  //LISÄYS LOPPUU
}

Nyt lisätään kutsu metodiin testaaTormays metodista draw(). 

void draw() {
  //Korvataan komennolla background () näille kahdelle riville
  fill(0, 0, 0, 1); // Läpinäkyvä väri
  rect(0, 0, width, height);
  noStroke();

  //Pallon liikuttaminen ja näyttö
  myPallo.move();
  myPallo.testaaTormays(); //LISÄÄ
  myPallo.display();
}

Lopullinen koodi

Tässä on lopullinen koodi kaikkien näiden muutosten jälkeen.

//Yhden olion pallo instanssin luominen
Pallo myPallo = new Pallo(100, 100, color(255));

void setup() {
  smooth(); 
  size(400, 200); //Ikkunan koko
}
void draw() {
  fill(0, 0, 0, 1);
  rect(0, 0, width, height);

  noStroke();

  //Pallon näyttö ja liikuttaminen
  myPallo.move();
  myPallo.testaaTormays();
  myPallo.display();
}

class Pallo {
  //Pallon luokan ominaisuuksien julistaminen
  float x;
  float y;
  float speedX;
  float speedY;
  color col;

  //Pallon luominen
  Pallo (float newX, float newY, color newColor) {
    x      = newX;
    y      = newY;
    col    = newColor;

    speedX = 2;
    speedY = 2;
  }

  //Pallon suunnittelu
  void display() {
    fill(col);
    ellipse(x, y, 40, 40);
  }

  void move() {
   x = x + speedX;
   y = y + speedY;
  }

  void testaaTormays() {
    //Pallo pomppaa törmätessään muuriin
    if (x > width-20 || x < 20) {
      speedX = speedX * -1;
    }
    if (y > height-20 || y < 20) {
      speedY = speedY * -1;
    }
  }
}