Imprimir
Categoría: Gráficos en Pascal
Visitas: 4130

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