Capitulo 6: Programando las pelota
INTRODUCCION
============
Bueno, pues llega la £ltima entrega de este curso de UGO, ya tenemos programadas las paletas de juego y ahora viene la parte m s complicada, tenemos que hacer que la bola se mueva, aumente su velocidad, tome la trayectoria correcta, etc... vamos a ver el c¢digo que incluiremos a nuestro fichero para concluir nuestro juego y dar por acabado este curso.
PROGRAMANDO LA PELOTA
=====================
Os acompa¤o el c¢digo que se ha a¤adido para que lo veas y comento lo m s principal o detalles a destacar.
TYPE
Pelota = RECORD
X,Y : INTEGER; (* Coordenadas *)
Imagen: BYTE; (* N£mero de imagen dentro del BSF *)
IX,IY : REAL; (* Incrementos de coordenadas en X e Y *)
END;
VAR
Bola : Pelota;
PROCEDURE IniciaPelota;
BEGIN
Bola.X:=160;
Bola.Y:=90;
Bola.Imagen:=3;
Bola.IX:=1;
Bola.IY:=1;
END;
PROCEDURE ControlaPelota;
BEGIN
(* Lo primero que hacemos es comprobar si choca con alguna paleta, si es
as¡ cambiamos el IX de signo para que cambie de direcci¢n y incrementa-
mos la velocidad de la bola *)
IF (ColisionSpritesBSF (RaquetaRoja.X,RaquetaRoja.Y,Bola.X,Bola.Y,
Sprites,Sprites,RaquetaRoja.Imagen,Bola.Imagen)) THEN
BEGIN
(* Compruebo en que sitio de la raqueta roja ha golpeado, si de la
mitad para arriba o para abajo para variar el incremento en Y,
la raqueta son 30 pixeles luego compruebo sobre 15 *)
IF (ABS(RaquetaRoja.Y-Bola.Y)<15) THEN
Bola.IY:=Bola.IY-0.2
ELSE
Bola.IY:=Bola.IY+0.2;
(* Como el IX era negativo lo decremento m s y le cambio el signo,
es decir, de direcci¢n *)
Bola.IX:=Bola.IX-0.1;
Bola.IX:=-Bola.IX;
END;
IF (ColisionSpritesBSF (RaquetaAzul.X,RaquetaAzul.Y,Bola.X,Bola.Y,
Sprites,Sprites,RaquetaAzul.Imagen,Bola.Imagen)) THEN
BEGIN
(* Compruebo en que sitio de la raqueta azul ha golpeado, si de la
mitad para arriba o para abajo para variar el incremento en Y,
la raqueta son 30 pixeles luego compruebo sobre 15 *)
IF (ABS(RaquetaAzul.Y-Bola.Y)<15) THEN
Bola.IY:=Bola.IY-0.2
ELSE
Bola.IY:=Bola.IY+0.2;
(* Como el IX era positivo lo incremento m s y le cambio el signo,
es decir, de direcci¢n *)
Bola.IX:=Bola.IX+0.1;
Bola.IX:=-Bola.IX;
END;
(* Compruebo ahora si choca con alguna pared en funci¢n de las coordenadas
si es as¡ cambio de signo al Incremento en Y para que cambie de
direcci¢n *)
IF ((Bola.Y<10) OR (Bola.Y>165)) THEN Bola.IY:=-Bola.IY;
(* Muevo la bola *)
INC (Bola.X,ROUND(Bola.IX));
INC (Bola.Y,ROUND(Bola.IY));
(* La vuelco a la pantalla virtual de mezcla *)
PonSpriteBSF (Bola.X,Bola.Y,Bola.Imagen,Sprites,PV3);
(* Compruebo si se ha metido gol con la coordenada X *)
IF (Bola.X<0) THEN BEGIN INC (RaquetaAzul.Puntos); IniciaPelota; END;
IF (Bola.X>320) THEN BEGIN INC (RaquetaRoja.Puntos); IniciaPelota; END;
END;
Como se observa y ya se coment¢ se ha creado un nuevo tipo de variable llamado pelota que almacenar las coordenadas, el n£mero de imagen dentro del BSF y los incrementos en X e Y que sufrir n las coordenadas. Tambi‚n l¢gicamente se ha declarado una variable (BOLA) de ese tipo. Se ha creado nuevamente un procedimiento para la inicializaci¢n de la bola que ser invocado cuando: SE META UN GOL o cada vez que se inicie una partida por lo que ser necesario incluir la l¡nea de iniciar la bola justo antes de empezar la partida, es decir, antes o despu‚s de inicializar las raquetas (justo antes de que acceda al bucle de partida) En el bucle de partida habr que llamar al procedimiento de controlar la bola que comento a continuaci¢n. Las coordenadas de la bola variar n en funci¢n de los incrementos que tenga asignados por lo que al chocar con una raqueta bastar con cambiar de signo al incremento para que vaya en la otra direcci¢n. Lo primero que se hace es comprobar si la pelota colisiona con la raqueta de color rojo, sabemos que si lo hace es porque la pelota va hacia la izquierda con lo que el incremento en x ser negativo, lo que hacemos en caso de que choque es decrementarlo a£n m s, cambiarle el signo y comprobar si choca de la mitad para arriba de la raqueta o de la mitad para abajo, para ello conocemos la longitud en pixeles de la raqueta (30), entonces restando las coordenadas Y de la raqueta y de la pelota y tomando el valor absoluto de esa resta vemos si es mayor o menor de la mitad (15), en cada caso variamos el incremento en Y en consecuencia. Para la raqueta azul operamos de la misma manera pero ahora sabemos que si choca es porque la bola iba hacia la derecha con lo cual habr que incrementar el incremento en X para hacer que acelere y cambiarle el signo. Luego comprobamos si choca con alguna pared, lo hacemos mediante la coordenada Y y sabiendo a que distancia dibujamos las paredes. Tambien comprobamos si se mete gol, lo hacemos con la coordenada X, si es menor que 0 es porque se le ha metido gol a la roja por lo que incre- mentamos los puntos de la azul e iniciamos una bola nueva. Si fuese mayor que 320 es porque se le ha metido gol a la azul por lo que incrementamos los puntos de la roja e iniciamos una bola nueva. Para mover la bola simplemente incrementamos la coordenada X en el incre- mento de X redondeado ya que es una variable de tipo REAL para que la aceleraci¢n que sufre no sea tan brusca, hacemos lo mismo para la coordenada Y. Mostramos el sprite en la pantalla virtual de mezcla para que en el bucle de partida se vuelque ya con todos los elementos dibujados en la pantalla real. Tambien se ha utilizado el tipo de letra que incluimos en el fichero de datos (PINPON.BTF), lo que hacemos es declarar una variable de tipo fuente llamada en nuestro ejemplo F y en ella cargamos con la funci¢n BTFCargaFuente del archivo de datos el tipo de letra y es la que utilizamos en el bucle de partidas para escribir los marcadores mediante las funciones EscribeXY y EscribeINT. Tambi‚n se ha a¤adido como condiciones de salida del bucle de partidas que cuando una de las dos raquetas tenga 3 puntos. Hasta aqu¡ el desarrollo de nuestro juego, ya se puede dar por conluido aunque se le pueden hacer muchas modificaciones, por ejemplo que pueda jugar un solo jugador poniendole inteligencia artificial a la otra raqueta, como idea para hacer esto se puede hacer que la raqueta azul sea controlada en funci¢n de la coordenada Y de la bola, si es mayor la de la raqueta azul, deber subir la raqueta y si es menor deber bajar pero esto ya es trabajo tuyo. Tambien se puede hacer que en pantalla aparezca alg£n sprite m s (previa- mente dibujado) que proporcione por ejemplo a la raqueta que lo coja (permitiendo que se muevan en horizontal) m s velocidad de movimiento. Todas las ideas que se te ocurran puedes incluirselas a este ejemplo y nos puedes mandar tus modificaciones o el juego que t£ has hecho con tus gr ficos por correo electr¢nico a la direcci¢n que aparece en la p gina. Si tienes alguna duda tambi‚n puedes escribirnos que te la solucionaremos.
DESPEDIDA
=========
Hasta aqu¡ el cursillo de desarrollo de este sencill¡simo ping-pong, como ves el c¢digo fuente completo no ocupa m s de 200 l¡neas con comentarios, sin ellos puede quedarse en 150, un buen resultado obtenido con UGO. Espero que te haya servido todo esto de gu¡a para tus futuros desarrollos, si algo te ha quedado poco aclarado o no has entendido algo escribenos un e-mail indicandonos tu problema. Por: Ismael Fernandez Bustos