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.Crear una nueva bola cuesta 1 punto.
<-- : Mueve la para a la izquierda. Ctrl: Crea una nueva bola.
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.
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