CURSO DE PROGRAMACION DE VIDEO JUEGOS:  TEXTO #7.
          ---------------------------------------------------

    Hola, aqui estamos empezando ya con el septimo capitulo de nuestro
    curso. En el capitulo anterior aprendimos como fabricar nuestros
    propios procedimientos, ahora, usando esto como base, vamos a
    aprender a fabricar funciones.

1.- Fabricacion de funciones.

    Como recordaran, una funcion es un tipo de procedimiento que devuelve
    un valor despues de hacer sus calculos, comprobaciones, etc...

    La palabra reservada que nos permite crear una funcion es FUNCTION
    y se usa en forma similar a PROCEDURE.

    FUNCTION nombre( parametros ): valor;

    el nombre y los parametros se usan igual que en los procedimientos,
    y valor corresponde al tipo de valor que devuelve. Este tipo de
    valor es el mismo que ocupamos para definir las variables, es decir,
    INTEGER, CHAR, BOOLEAN, etc...

    Veamos un ejemplo: supongamos que queremos hacer una funcion que
    devuelva la distancia que hay entre dos objetos que tenemos en la
    pantalla:

    FUNCTION Dist( x1, y1, x2, y2: integer ): real;
    begin
      Dist := sqrt( (x2-x1) + (y2-y1) );      
    end;

    A la funcion le pusimos el nombre Dist, los parametros que devemos
    pasarle son la ubicacion del primer objeto (x1, y1) y la ubicacion
    del segundo objeto (x2, y2) todos de tipo entero, y el valor que
    devuelve la funcion es de tipo real.

    Luego para indicarle a la funcion el valor que debe devolver, este
    valor es asignado al nombre de la funcion. En el ejemplo, la funcion
    va a devolver la distancia entre los 2 puntos que no es mas que una
    formula matematica.

    Tal ves deba destacar que en la funcion se llama a otra funcion llamada
    SQRT, cuya tarea es devolver la raiz cuadrada de un valor.

    Veamos otro ejemplo para quedar aun mas claros. Supongamos que queremos
    verificar si dos objetos chocan:

    FUNCTION Hit( x1, y1, x2, y2 ): boolean;
    begin
      if (x1=x2) and (y1=y2) then Hit:=true
      else Hit:=false;
    end;

    En este caso el nombre de la funcion es Hit, los parametros son los
    mismos que en el ejemplo anterior, y el valor que devuelve la funcion
    es de tipo boolean, es decir, verdadero o falso.

    Lo que hace la funcion es chequear por medio de la instruccion if si
    es que las cordenadas x e y de los objetos son las mismas, es decir, si
    esta uno sobre otro, de ser asi la funcion devolvera el valor verdadero,
    sino devuelve falso.

                                 -- o --
    
2.- Un programa completo.    

    ¨Se entiende como se fabrican las funciones?.

    Ahora, hay muchas propiedades de las funciones similares a las de
    los procedimientos: como el hecho de poder declarar variables y
    constantes en su interior, el sistema para declarar los parametros
    es el mismo, etc...

    Veamos como ejemplo un programa completo.

------------------------------------------------------------------------------
uses crt;

var x1, y1, x2, y2: integer;
    dx1, dy1, dx2, dy2: integer;
    salir: boolean;

function Hit( x1, y1, x2, y2: integer ): boolean;
begin
  if (x1=x2) and (y1=y2) then Hit:=true
  else Hit:=false;
end;

procedure mover1( var dx, dy: integer );
begin
  dx:=random( 3 );
  dy:=random( 3 );
  dec( dx, 1 );
  dec( dy, 1 );
end;

procedure mover2( var dx, dy: integer );
var k: integer;
begin
  if keypressed then
  begin
    k:=ord(readkey);
    if k=ord('u') then dy:=-1
    else
    if k=ord('h') then dx:=-1
    else
    if k=ord('k') then dx:=1
    else
    if k=ord('j') then dy:=1
    else
    if k=27 then salir:=true;
  end;
end;

procedure SetX( var x: integer );
begin
  if x>78 then x:=78
  else
  if x<2 then x:=2;
end;

procedure SetY( var y: integer );
begin
  if y>23 then y:=23
  else
  if y<2 then y:=2;
end;

procedure Dibujar;
begin
  clrscr;
  textcolor( 10 );
  gotoxy( x1, y1 );
  write( 'o' );
  textcolor( 12 );
  gotoxy( x2, y2 );
  write( 'x' );
end;

begin
  randomize;
  salir:=false;
  x1:=10; y1:=10;
  x2:=60; y2:=15;
  dx1:=0; dy1:=0;
  dx2:=0; dy2:=0;
  while not(salir) do
  begin
    dibujar;
    delay( 50 );
    mover1( dx1, dy1 );
    mover2( dx2, dy2 );
    inc( x1, dx1 ); inc( y1, dy1 );
    SetX( x1 ); SetY( y1 );
    inc( x2, dx2 ); inc( y2, dy2 );
    SetX( x2 ); SetY( y2 );
    if Hit( x1, y1, x2, y2 ) then
    begin
      sound( 100 );
      delay( 100 );
      nosound;
    end;
  end;
  clrscr;
end.
------------------------------------------------------------------------------

                                 -- o --
    
    Bien, que les parece, ¨no son mas elegantes nuestros programas 
    cuando utilizados procedimientos y funciones en lugar de escribir
    un largo programa hacia abajo?, ¨no es mas facil corregir los
    errores?.

    Ahora tenemos que nuestro programa se divide en 5 secciones:

      - Declaracion de unidades.
      - Declaracion de constantes.
      - Declaracion de variables.
      - Creacion de procedimientos y funciones.
      - Programa principal.

    Creo que es mejor dejar hasta aqui este capitulo para que practiquen
    un poco, de manera de no saturarlos con tanto conocimiento y que
    vayan investigando por ustedes mismo el uso de lo que llevamos
    visto.

    Espero que en el proximo capitulo empecemos ya con la programacion 
    en modo grafico, asi que sean pancientes y sigan programando.
    Escribanme un lote de mails con todas sus dudas para que no queden 
    colgados.

    Nos vemos.

    
    JPLL
    pc-jlopez@entelchile.net
    www.geocities.com/SiliconValley/Bridge/1910

                                 -- o --

    Source: geocities.com/siliconvalley/bridge/1910

               ( geocities.com/siliconvalley/bridge)                   ( geocities.com/siliconvalley)