Leonardo Maldonado - Proyecto Imagen Escrita 2019 T1
De Casiopea
| Título | Leonardo Maldonado - Proyecto Imagen Escrita 2019 T1 |
|---|---|
| Asignatura | Imagen Escrita |
| Del Curso | Imagen Escrita 2019 |
| Carreras | Formación y Oficio"Formación y Oficio" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property., Interacción y Servicios"Interacción y Servicios" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property., Otra |
| Nº | 1 |
| Alumno(s) | Leonardo Maldonado |
Demo (sin audio): http://chaleco.org/files/imagenEscrita/
Partidas
- Personaje
- Definición del personaje (una elipse de 10x10px)
- Colisión del personaje (si es que está en la misma altura que una plataforma, se activa)
- Definición de vectores de movimiento del personaje (PVector)
- Definición de controles de desplazamiento (izquierda, derecha, salto)
- Etapa
- Creación de un array que guarde la serie de plataformas
- Definición de plataformas (líneas de 25 px)
- Randomización de plataformas (cada vez que se lanza la aplicación, cambia la distribución)
- Limitación de altura máxima entre plataformas (hasta 25 pixeles de diferencia)
- Detalles
- Importar un fondo (PImage)
- Importar sonidos (librería de audio)
- Sonido de fondo, activado "on Setup"
- 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;
}
}