Hola gente! Hoy volvemos un poco a programación, como muchos son nuevos por acá hace muchos años atrás hice mi primer tutorial de Processing 1.0 – ¡Dios! me estoy haciendo viejo 🙁 – Bueno les cuento que ya está en la versión 2.0 y ahora está mejor que pan recién salido del horno, ya puedes exportar a javascript y android. Con lo fácil que es programar en Processing podría sernos una excelente herramienta de prototipado, bueno ya les había comentado antes que estaba llevando este curso, bueno ya presente mi primer trabajo, fue un remake de Frogger que tanto jugaba de niño en mi atari, tiempos aquellos… ¡¡¡¡Noooooo!!!! realmente me estoy haciendo viejo… :'(
Bueno en el post de hoy les voy a compartir el código y los recursos que utilice para el proyecto, no esperen demasiado pero por lo menos para reconocer el código, esta todo explicado, tristemente no lo voy a poder continuar, estoy haciendo un proyecto que usa el motor física y Sapito (nombre del juego) no se vería beneficiado en nada de la física, por lo menos yo no veo como meterle física a su jugabilidad.
Si estás en el curso también y te gusto el proyecto, siéntete libre de mejorarlo 🙂 las imágenes las encuentran en la otra pagina junto con el mismo código pero en inglés y más abajo está un vídeo del juego en funcionamiento.
pd-> Mucha gente he visto que no puede llegar a la página 2, abajo después de donde dice “me gusta” hay 2 números en azul remarcados ( 1 2 ) le dan clic al número 2
String[] carritos = {"camioncito.png","camioncito2.png","carrito.png","carrito2.png","carrito3.png"}; int espaciomin = 40; int espaciomax = 120; int velmin = 1; int velmax = 5; int tamCarros = 40; Sapo sapito; int i,j,k; Carro[] misCarros1; Carro[] misCarros2; Carro[] misCarros3; int[] nuevaVel = new int[3]; int[] nuevaX = new int[3]; void setup() { size(400,200); //Inicializa 6 carros por carril misCarros1 = new Carro[6]; misCarros2 = new Carro[6]; misCarros3 = new Carro[6]; //Inicia los carros, le pasamos el array con los carros, la altura donde se encuentra, y si va de izquierda a derecha pasaremos true carros(misCarros1, 75, true); carros(misCarros2, 105, false); carros(misCarros3, 135, true); //Iniciamos al sapo a la mitad de la pantalla en la posicion y: 165 y de un tamaño de 20 sapito = new Sapo(width/2, 165, 20, "sapito.png"); } void draw() { //Espacio entre lineas blancas j = 60; background(100); //Carga la imagen del sapo sapito.cargar(); //Carga la casa casa(); //Dibuja las lineas blamcas while(j<height-40){ i = 0; while(i<width){ stroke(255,255,255); line(i, j,i+5,j); i= i+10; } j=j+30; } //30 fps frameRate(30); int l = 0; //Avanzamos los autos (retocede en caso vaya de derecha a izquierda el carro) while(l<misCarros1.length){ misCarros1[l].avanza(); misCarros2[l].retrocede(); misCarros3[l].avanza(); //Atropello al sapito? if(sapito.atropellado(misCarros1[l])||sapito.atropellado(misCarros2[l])||sapito.atropellado(misCarros3[l])){ sapito.setImagen("sapitomuerto.png"); //Cargamos la imagen del sapito muerto sapito.cargar(); } //Si salio de la pantalla if(misCarros1[l].paso){ if(l==0){ //Va de izquierda a derecha? if (misCarros1[l].adelante){ //Generamos una nueva velocidad random nuevaVel[0] = int (random(velmin,velmax)); //lo ponemos al inicio nuevaX[0] = 0; }else{ nuevaVel[0] = int (random(-velmax,-velmin)); //Lo ponemos al final nuevaX[0] = width; } } //Cambio el carro cambiar(misCarros1[l], 0); } if(misCarros2[l].paso){ if(l==0){ if (misCarros2[l].adelante){ nuevaVel[1] = int (random(velmin,velmax)); nuevaX[1] = 0; }else{ nuevaVel[1] = int (random(-velmax,-velmin)); nuevaX[1] = width; } } cambiar(misCarros2[l], 1); } if(misCarros3[l].paso){ if(l==0){ if (misCarros3[l].adelante){ nuevaVel[2] = int (random(velmin,velmax)); nuevaX[2] = 0; }else{ nuevaVel[2] = int (random(-velmax,-velmin)); nuevaX[2] = width; } } cambiar(misCarros3[l], 2); } //incremento l l++; } } //Esta funcion genera los carros, cuando esta al inicio genera todos los carros pero los pone en posiciones negativas, solo aparecen cuando el X llega a 0 en //case vayan de izquierda a derecha void carros(Carro[] autos, int y, boolean adelante){ k=0; int vel = 0; int espacio1 = 0; int espacio2 = 0; int nux = 0; //Si va de izquierda a derecha if (adelante){ //Le damos una velocidad random vel = int (random(velmin,velmax)); //ponemos el espacio max y minimo en negativo, para que vaya sumando a la derecha y vayan apareciendo los autos espacio1 = espaciomax*-1; espacio2 = espaciomin*-1; nux = 0; //Si va de derecha a izquierda }else{ vel = int (random(-velmax,-velmin)); //ponemos el espacio max y minimo en positivo, para que vaya restando a la derecha y vayan apareciendo los autos espacio1 = espaciomin; espacio2 = espaciomax; nux = width; } //escogemos una imagen random int ima = int(random(0,carritos.length)); while(k<autos.length){ //Inicializamos el carro autos[k]=new Carro(nux,y,vel,tamCarros,carritos[ima],adelante); //aumentamos la distancia entre uno y otro carro nux = nux + int(random (espacio1, espacio2)); //escogemos una imagen random ima = int(random(0,carritos.length)); k++; } } //Cargamos la casa void casa(){ PImage pi = loadImage("casita.png"); imageMode(CENTER); image(pi,22,25); } //Genera un nuevo carro y lo unico que hace es reutilizar el objeto y cambiar sus valores void cambiar(Carro car, int lug){ if (car.adelante){ //Nueva posicion nuevaX[lug] = nuevaX[lug] + int(random (espaciomax*-1, espaciomin*-1)); }else{ nuevaX[lug] = nuevaX[lug] + int(random (espaciomin, espaciomax)); } //Cambia la posicion x, la velocidad y la imagen car.cambio(nuevaX[lug],nuevaVel[lug],carritos[int(random(0,carritos.length))]); //El auto no ha cruzado la pantalla todavia car.paso = false; } void keyPressed( ){ //Si el sapito no murio if(!sapito.murio){ //Si presionamos w if(key=='w'||key=='W'){ //El sapito va hacia arriba si esta dentro de la pantalla if(sapito.getPosy() > 0){ sapito.setPosy(sapito.getPosy() - 30); } //Si presionamos s }else if(key=='s'||key=='S'){ //El sapito va hacia abajo si esta dentro de la pantalla if(sapito.getPosy() < height){ sapito.setPosy(sapito.getPosy() + 30); } //Si presionamos a }else if(key=='a'||key=='A'){ //El sapito va hacia la derecha si esta dentro de la pantalla if(sapito.getPosx() > 0){ sapito.setPosx(sapito.getPosx() - 30); } //Si presionamos d }else if(key=='d'||key=='D'){ //El sapito va hacia la izquierda si esta dentro de la pantalla if(sapito.getPosx() < width){ sapito.setPosx(sapito.getPosx() + 30); } } } } //Si presionamos un boton del mouse void mousePressed(){ //Reiniciamos el juego setup(); } class Carro { private int posx; private int posy; private int velocidad; private int tamano; private String imagen; boolean adelante; boolean paso=false; //Inicializamos el carro Carro(int px, int py, int ve, int ta, String im, boolean adel) { posx = px; posy = py; velocidad = ve; tamano = ta; imagen = im; adelante = adel; } void setPosx(int x){posx=x;} void setPosy(int y){posy=y;} int getPosx(){return posx;} int getPosy(){return posy;} int getTam(){return tamano;} //Avanza a la siguiente posicion de izquierda a derecha, pero si cruza la pantalla "paso" lo hace true void avanza () { PImage b = loadImage(imagen); imageMode(CENTER); image(b,posx,posy,tamano,tamano/2); posx = posx + velocidad; if (posx > width+tamano) { posx = -tamano; paso = true; } } //Avanza a la siguiente posicion de derecha a izquierda, pero si cruza la pantalla "paso" lo hace true void retrocede (){ PImage b = loadImage(imagen); imageMode(CENTER); //Que solo afecte a este carro no a los demas pushMatrix(); scale(-1,1); image(b,-posx,posy,tamano,tamano/2); popMatrix(); posx = posx + velocidad; if (posx < 0-tamano) { posx = width+tamano; paso = true; } } //Cambia la posicion x, la velocidad y la imagen void cambio(int x, int v, String i){ posx = x; velocidad = v; imagen = i; } } class Sapo{ private int posx; private int posy; private int tamano; private String imagen; boolean murio = false; Sapo(int px, int py, int ta, String im) { posx = px; posy = py; tamano = ta; imagen = im; } //Carga la imagen void cargar(){ PImage b = loadImage(imagen); imageMode(CENTER); image(b,posx,posy,tamano,tamano/2); } void setPosx(int x){posx=x;} void setPosy(int y){posy=y;} int getPosx(){return posx;} int getPosy(){return posy;} void setImagen(String im){imagen = im;} //Simple Deteccion de colisiones boolean atropellado(Carro auto){ int CmaxX = auto.getPosx()+(auto.getTam()/2); int CmaxY = auto.getPosy()+(auto.getTam()/2); int CminX = auto.getPosx()-(auto.getTam()/2); int CminY = auto.getPosy()-(auto.getTam()/2); int SmaxX = posx+(tamano/2); int SmaxY = posy+(tamano/2); int SminX = posx-(tamano/2); int SminY = posy-(tamano/2); if(SmaxX<CmaxX && SmaxX >CminX){ if(SmaxY<CmaxY && SmaxY >CminY){ murio = true; } } if(SminX < CmaxX && SminX >CminX){ if(SminY < CmaxY && SminY > CminY){ murio = true; } } return murio; } }
Jajaja yo me acuerdo de ese juego, te quedo muy bien, gracias por compartir.
Y por la fisica ponlo a saltar 😉
jajaja no seas malo, el salto se hace solo con animaciones, no necesito un engine de fisica para hacer eso, es como cazar atun con arpon XD