&CODIGOS
&AUTOR Tony Stuvo Aky / Odr.
&TITULO El laberinto del Puntotauro
&FIN
T02                       El Laberinto del Puntotauro.

T12                      Por ¡Tony Stuvo Aky! / Ødrusba

T09 ¡Hola amiguetes! Bienvenidos a 'cómo hacer un laberinto con un puntito'.

 La  idea está basada en el laberinto que aparece en el LLFB MUSIC DISK #1,
que  no  me  molaba eso de poder pasear el puntero por cualquier sitio para
llegar  al final.  Así que voy a explicar cómo hacer un laberinto como ese,
pero sin posibilidad de hacer trampas atravesando los muros.

 Lo primero que necesitaréis es un laberinto pintado con cualquier programa
de  dibujo.   Para este ejemplo es mejor que sea a dos colores.  Lo pintáis
dejando el color 0 para los pasillos y el 1 para las paredes.

 Lo  segundo, el AMOS (¡oh no!- dirán algunos).  Lo que haremos será cargar
el  dibujillo en el Amos, y programar unas rutinas de control,de movimiento
del puntito, y otra de detección de colisión contra las paredes.

 Pero  vamos a empezar por inicializar la pantalla, poner las variables que
vamos a usar, y todo eso...

 Aquí va el listadoide:
 
T12                * Abrimos la pantalla *

              Screen Open 0,320,256,2,lowres
              Curs off: Hide: Paper 0 : Cls
 
                * Cargamos el dibujito *

              Load Iff "Laberinto.Iff" 

      * Declaramos las posiciones X e Y originales *
          * Dependen del diseño del laberinto *
          
              X=4 : Y=4
     
                * El centro de la META *

              METAX=300 : METAY=230

T09 Ahora haremos la rutina de control, usaremos el Joystick en el Port 2 para
el movimiento:

      * Usamos la variable dirección para saber hacia donde nos movemos *

T12              MUEVE=Joy(1)
              
              If (MUEVE and 1) and (Y > 0)        <--- SUBIMOS
                 Dec Y
              End If

              If (MUEVE and 2) and (Y < 255)      <--- BAJAMOS
                 Inc Y
              End If

              If (MUEVE and 8) and (X < 319)      <--- DERECHA
                 Inc X
              End If
 
              If (MUEVE and 4) and (X > 0)        <--- IZQUIERDA
                 Dec X
              End If

T09 Con  eso  ya  sabremos  hacia  dónde  movernos,  pero no sabremos si hemos
chocado o no con un muro.  Así que habremos de controlar que el lugar hacia
el  que  nos  movemos está libre.  Lo haremos con el comando POINT, que nos
devuelve  el  número  de pixel indicado en las coordenadas X e Y. Si nos dá
0,  estará  libre,  sino  habrá  una pared y no realizaremos el movimiento.
Quedaría así:

T12              If (MUEVE and 1) and (Y > 0) and (Point (X,Y-1)=0)  
                Dec Y
              End If

              If (MUEVE and 2) and (Y < 255) and (Point (X,Y+1)=0)
                 Inc Y
              End If

              If (MUEVE and 8) and (X < 319) and (Point (X+1,Y)=0)
                 Inc X
              End If
 
              If (MUEVE and 4) and (X > 0) and (Point (X-1,Y)=0)
                 Dec X
              End If

T09 Bueeeno, ya nos chocamos con las paredes.  ¿Qué diver, no?  Pero nos sigue
faltando  algo...   EL  PUNTO.   Sí,  no  se nos vé por ningún sitio.  Para
lograr  un  movimiento  decente  sin hacer un double buffer, lo que haremos
será  comprobar si hemos movido el joystick.  Si no lo hemos hecho, pues no
pasa  nada,  y  si lo movimos, borramos la posición anterior.  Traducido al
Amos, queda así:

T12              (( asignar a MUEVE Joy(1) ))

              If MUEVE
                Ink 0
                Plot X,Y
              End If

              (( rutina de control ))

              Ink 1
              Plot X,Y

T09 Y  para acabar, comprobaremos si se ha llegado a la meta final.  Para ello
comprobaremos  que  las coordenadas X e Y están dentro de un rectángulo que
corresponderá  a  la posición del final en el dibujo.  O lo hacéis a ojo, o
con el programa de dibujo miráis sobre que pixels cae. Así queda:

T12              If (X > METAX-10) and (X < METAX+10) and (Y > METAY-10) and
 misma línea> (Y < METAY+10)
                 Exit
              End if

T09 Los  dieces  son  las  dimensiones  del  lugar.  En este caso es de veinte
pixels   de   ancho   por   veinte   de   alto.    El   cuadrado  iría  de
(METAX-10,METAY-10) hasta (METAX+10,METAY+10).
         
 Pues  ya  está.  Creo que eso es todo.  El listado final quedaría una cosa
así:

T12              Screen Open 0,320,256,2,lowres
              Curs off: Hide: Paper 0 : Cls
              Load Iff "Laberinto.iff"
              X=4 : Y=4
              METAX=300 : METAY=230
              Do
T12                 MUEVE = Joy(1)
                 If MUEVE
                  Ink 0
                  Plot X,Y
                 End If
                 If (MUEVE and 1) and (Y > 0) and (Point (X,Y-1)=0)  
                  Dec Y
                 End If
                 If (MUEVE and 2) and (Y < 255) and (Point (X,Y+1)=0)
                  Inc Y
                 End If
                 If (MUEVE and 8) and (X < 319) and (Point (X+1,Y)=0)
                  Inc X
                 End If
                 If (MUEVE and 4) and (X > 0) and (Point (X-1,Y)=0)
                  Dec X
                 End If
                 Ink 1
                 Plot X,Y
                 If (X > METAX-10) and (X < METAX+10) and (Y > METAY-10) and
 misma línea>    (Y < METAY+10)
                  Exit
                 End if
                 Wait Vbl
                 Loop
T12                 Cls
                 Print "¡LO CONSEGUITE! ¡TE HAS GANADO UN POLLIFANTE!"
                 End

T09 ¿Fácil,  no?  Pues ya sabéis, a hacer montones de juegos de laberintos con
puntitos.   Y si tenéis ganas, les ponéis monstruos zampapuntos para que no
sea tan fácil...

T07 ¡Hala! ¡A programar!


T05¡Tony Stuvo Aky! / Ødrusbæ
