jueves, 5 de agosto de 2010

Picaladrillos

Bueno, hoy os presento el Picaladrillos. Es el típico Arcanoir de toda la vida pero echo por mi.

http://pensarescompartir.com/lahsoft/lahsoftcorp/?direc=fenix/&id=2010-08-05_Picaladrillos.rar

Instrucciones de uso:
Lo descomprimís todo en la misma carpeta. Y le dais a "ejecutar.bat".

Controles:
--> : Mueve la pala a la derecha.
<-- : Mueve la para a la izquierda. Ctrl: Crea una nueva bola.
Crear una nueva bola cuesta 1 punto.
Romper un ladrillo da 2 puntos (creo recordar).

Para cerrar del juego hay dos formas:
  • Acabar con todos los ladrillos.
  • Alt + tabulador, y cuando cambie de pantalla, cerrar la consola que veais.
Aunque en ese ".rar" viene el código os lo pongo aquí. Siento que no esté tabulado, pero esque es mucho código como para ponerme a hacer ñoñerías. Buscaré un sistema mejor para subirlo:

import "mod_map";
import "mod_key";
import "mod_text";
import "mod_grproc";
import "mod_proc";
import "mod_math";
import "mod_screen";
import "mod_video";
import "mod_rand";

global
int blocksleft;//Contará la cantidad de ladrillos que hay aún
int aux=4;
int punt=0;
end

process main()
private
int i,j;//Variables para los bucles
int tes;
int aux2=1;
end
begin
set_mode(640,480,32, mode_fullscreen);
load_fpg("breakout.fpg");
paddle(320,460); //Raqueta

/*Los dos for siguientes sirven para dibujar en pantalla los ladrillos que tendremos que
destruir. La estructura es sencilla: el primer bucle sirve para darle 10 posiciones
horizontales diferentes a los ladrillos, y el segundo sirve para dar 3 posiciones
verticales. Así que cada vez que lleguemos a la llamada al proceso block, dibujaremos un
ladrillo en una de las 10 posiciones horizontales posibles y en una de las 3 posiciones
verticales posibles, con lo que al final tendremos 30 ladrillos distribuidos en 3 filas y
10 columnas*/
for(i=0;i<20;i++)
for(j=0;j<5;j++)

//Como creamos un ladrillo,tenemos que añadirlo al contador
blocksleft++;

/*Dibujamos el ladrillo propiamente dicho.Los números están para ajustar la posición a
las medidas de la pantalla.Recuerda que para que cuadre el gráfico del ladrillo ha de
tener unas dimensiones de 28x138*/
block(i*32+16,j*16+8);
end
end
write(0,180,230,5,"Ladrillos que faltan: ");
write_var(0,180,230,3,blocksleft);
write(0,180,430,5,"Tu puntuación: ");
write_var(0,180,430,3,punt);
tes=write(0,180,245,5,"Pulse CTRL para empezar");
loop

//Puedes crear una bola cuando quieras
if(key(_control))
if(aux2==1)
delete_text(tes);
aux2=0;
end

//Esperar hasta que la tecla se suelte
while(key(_control))
frame;
end
aux+=1;
if (aux==8)
aux=4;
end
ball(320,180,aux);
punt-=1;
end

if(blocksleft==0)//Fin de la partida
delete_text(0);
write(0,420,235,5,"¡Has ganado! (Pulsa ENTER para salir)");
while(not key(_enter))
aux+=1;
if (aux==8)
aux=4;
end
ball(rand(20,620),rand(240,460),aux);
frame;
end
exit();
end
frame;
end
end

process block(x,y)
begin;
graph=2;
loop
frame;
end
end

process paddle(x,y)
begin
graph=3;
loop
if(key(_left))x=x-25;end
if(key(_right))x=x+25;end
if(x<15)x=15;end
if(x>625)x=625;end
frame;
end
end

process ball(x,y,int grap)
private
int vx=0;//Su velocidad inicial (cambiará) en la dirección X e Y
int vy=5;
int paddle;
int block;
int ball;
end
begin
vx+= rand(-10,10);
graph=grap;
loop

//Para no tener que escribir tanto después en los ifs
paddle=COLLISION(type paddle);
block=COLLISION(type block); //Lo mismo
ball=collision(type ball);

//Si la bola choca contra un ladrillo
if(block!=0)

//Comprobamos que hemos chocado contra la parte inferior o superior de un ladrillo...
if(abs(block.y-y+vy)>8)
vy=-vy;//...e invertimos la velocidad vertical
end

//Comprobamos que hemos chocado contra la parte izquierda o derecha de un ladrillo...
if(abs(block.x-x+vx)>16)
vx=-vx;//...e invertimos la velocidad horizontal
end

/*La bola no nesariamente choca sólo contra un ladrillo a la vez, sobretodo cuando incide
de forma horizontal sobre ladrillos superpuestos, donde choca con todos ellos a la vez.*/
while(block!=0)
blocksleft--;
signal(block,s_kill);
punt+=2;

/*Vemos si hay otro ladrillo con el que haya colisionado.(Recordad que cada vez que se
llama a "collision", se da el siguiente item con el que se ha colisionado, hasta que se
haga un frame, momento en el que se "resetea" la lista de objetos colisionantes y se
empieza otra vez*/
block=COLLISION(type block);
end
end
//Si la bola choca contra la raqueta...
if(paddle!=0)
vy=-vy;//...invertimos la velocidad vertical...

/*...y alteramos la velocidad horizontal dependiendo de en qué punto de la raqueta se
haya colisionado..*/
vx=vx+(x-paddle.x)/2;
end

if(ball!=0)//Si choca contra otra bola
vx=-(vx+10);
vy=-(vy+10);
END

//Si la bola choca contra los límites de la pantalla (excepto el inferior)
if(x<=2 or x>=638)vx=-vx;end
if(y<=2)vy=-vy;end //Limitamos la velocidad horizontal un poco (para que no se embale mucho)... if(vx>20)vx=20;end
x=x+vx;//y la bola se mueve
y=y+vy;
if(y>480 or y<0)return;end //Si perdemos la bola, matamos el proceso
frame;
end
end

No hay comentarios:

Publicar un comentario