Pràctica 2. Màquina d’estats i animació controlada per teclat

Aquesta segona pràctica ja va resultar una mica més difícil. Es tractava de realitzar una animació d’una figura que podia estar o quieta o be saltant. El pas d’una acció a una altra es realitza amb el teclat. A més, per arrodonir l’exercici es podien incloure altres elements animats (ocells, núvols, etc.)

Aquest és el document corresponent a l’explicació de la pràctica:

practica2_pere_amengual

I aquest és el codi de l’exercici 4:

 

import processing.sound.*;

SoundFile comba, forest;

PImage paisatge, bg, bg_mask, sol, lluna; 
PImage[] personatge = new PImage[3]; // podem canviar les mides del array per animar amb u nombre arbitrari d'imatges
boolean saltant, haSonat;
int contador, velocitat_salts, salt, properBosc;


void setup() {
  size(800, 600);
  frameRate(30);
  textSize(48);
  paisatge = loadImage("paisatge.png");
  bg = loadImage("paisatge.png");
  bg_mask = loadImage("paisatge_mask.png");
  sol = loadImage("sun.png");
  lluna = loadImage("moon.png");
  bg.mask(bg_mask);
  for ( int i = 0; i< personatge.length; i++ ) {
    personatge [i] = loadImage( "personatge" + i + ".png" );
  }
  saltant = false; // false equival a frame 1/parats i true equival a frame 2/saltant
  contador = 0;
  properBosc = 0;
  velocitat_salts = 10;
  comba = new SoundFile(this, "comba.mp3");
  forest = new SoundFile(this, "forest.mp3");
}

void draw() {
  background(paisatge);
  dibuixarSol(frameCount+600);
  dibuixarLluna(frameCount+1200);
  image (bg, 0, 0);
  imprimirStatus();
  dibuixarPersonatge();
  dibuixarNit(frameCount+700);
  sonsBosc();
}

void imprimirStatus() {
  fill (255, 255, 255);
  if (saltant) {
    text("SALTANT", 50, 50);
  } else {
    text("PARATS", 50, 50);
  }
}

void dibuixarNit(int pos) {
  float y = sin((pos)/200.0)*65+55;
  if (true) {
    fill (0, 0, 40, y);
    rect (0, 0, width, height);
  }
}

void dibuixarSol (int pos) {
  float x = cos((pos)/200.0)*420+420;
  float y = int(sin((pos)/200.0)*400+400);
  fill (255, 255, 255);
  image (sol, x, y, 150, 127);
}

void dibuixarLluna(int pos) {
  float x = cos((pos)/200.0)*420+420;
  float y = int(sin((pos)/200.0)*400+400);
  fill (255, 255, 255);
  image (lluna, x, y, 150, 127);
}

void dibuixarPersonatge() {
  if (saltant) {
    contador++;
  }
  salt = (contador/velocitat_salts) % personatge.length;
  image (personatge[salt], 200, 300);
  if ( salt == 2) {
    if (!haSonat) {

      comba.play();
      comba.rate(random(0.8, 1.1));
      haSonat = true;
    }
  } else {
    haSonat = false;
  }
}

void sonsBosc() {
  // funció implementada degut a que no funciona correctament el mètode loop()
  if (millis() > properBosc) {
    forest.play();
    properBosc = millis() + int(forest.duration()*1000)-100;
  }
}

void mouseClicked() {
  saltant = !saltant;
}

 

 

Leave a Reply