Leonardo Maldonado - Proyecto Imagen Escrita 2019 T1

De Casiopea



TítuloLeonardo Maldonado - Proyecto Imagen Escrita 2019 T1
AsignaturaImagen Escrita
Del CursoImagen Escrita 2019
CarrerasFormación y Oficio, Interacción y Servicios, Otra
1
Alumno(s)Leonardo Maldonado


Demo (sin audio): http://chaleco.org/files/imagenEscrita/

Partidas
  1. Personaje
    1. Definición del personaje (una elipse de 10x10px)
    2. Colisión del personaje (si es que está en la misma altura que una plataforma, se activa)
    3. Definición de vectores de movimiento del personaje (PVector)
    4. Definición de controles de desplazamiento (izquierda, derecha, salto)
  2. Etapa
    1. Creación de un array que guarde la serie de plataformas
    2. Definición de plataformas (líneas de 25 px)
    3. Randomización de plataformas (cada vez que se lanza la aplicación, cambia la distribución)
    4. Limitación de altura máxima entre plataformas (hasta 25 pixeles de diferencia)
  3. Detalles
    1. Importar un fondo (PImage)
    2. Importar sonidos (librería de audio)
      1. Sonido de fondo, activado "on Setup"
      2. Sonido de salto, activado "on keyPressed(" ")"
import processing.sound.*; //pal audio
SoundFile fileBGM;
SoundFile fileJump;


ArrayList<Platform> p;
boolean iscolliding = false; // chequeo de colisión
PVector pos; //se utilizan vectores tanto para la posición como para la velocidad, con valores en x e y
PVector vel;
float moving = 0;
float walk = 2;
PImage bg; //fondo


void setup() {
  size(280, 256);
  bg = loadImage("bg.jpg");
  p = new ArrayList<Platform>(); // esto determina el randomizador de plataformas que aparecen
  float y = height/2;
  float ory = y; // esto hace que siempre se spawnée sobre una plataforma y no en el aire
  for(int i = 0; i < width/25; i++) {
    p.add(new Platform(i*25, y));    
    y += random(-25, 25); //ajusta la diferencia de altura posible entre plataformas
  }
  pos = new PVector(5, ory); //posición inicial del personaje
  vel = new PVector(); 
  fileBGM = new SoundFile(this, "bgm.mp3"); //música
  fileBGM.play();
}

void draw() {
  background(bg);
  iscolliding = false; // chequeo de colisión
  for(Platform i: p) {
    i.show();
    if(i.collide(pos)) { //si es que está colisionando, se activa el boolean
      iscolliding = true;
      pos.y = i.pos.y; //"si es que está a la misma altura de la plataforma, que se quede en esa altura"
    }
  }
  fill(#626e2f);
  noStroke();
  ellipse(pos.x, pos.y-5, 10, 10);
  if(!iscolliding) { //se niega para saber si es que no está colisionando, en ese caso se activa la aceleración "gravitacional"
    vel.y += 0.7; //aceleración de la "gravedad"
  }
  pos.add(vel);
  pos.x += moving; //desplazamiento cuando se presionen las teclas mencionadas más abajo (1)
  vel.mult(0.7);
}

void keyPressed() { // (1) movimiento de la pos.x
  if(key == CODED) { //CODED es necesario para usar teclas especiales
    if (keyCode == LEFT) {
      moving = -walk;
    }
  }
  if(key == CODED) {
    if (keyCode == RIGHT) {
      moving = walk;
    }
  }
  fileJump = new SoundFile(this, "jump.wav"); //sonido de salto
  if(key == ' ') { // salto
    if(iscolliding) {
      vel.y -= 10;
      
      fileJump.play();
    }
  }
}

void keyReleased() { 
  if(key == CODED) {
    if (keyCode == LEFT) {
      moving = 0;
    }
  }
  if(key == CODED) {
    if (keyCode == RIGHT) {
      moving = 0;
    }
  }
}

//esto es para generar plataformas, líneas de 25 pixeles de largo 
class Platform {
  PVector pos;
  Platform(float x, float y) {
    pos = new PVector(x, y);
  }
  void show() {
    stroke(#626e2f);
    line(pos.x, pos.y, pos.x+25, pos.y);
  }
  boolean collide(PVector p) { //se crea la colisión de cada línea
    if(p.x > pos.x && p.y > pos.y && p.x < pos.x+25 && p.y < pos.y+10) {
      return true;
    }
    return false;
  }
}