Tutorial de ZX Basic + Fourspriter #18: Cambiando de pantalla

Tenemos un mapa grande con un montón de pantallas. ¿Cómo movernos de una a otra? Hay varios métodos, pero a mí me gusta eso de comprobar que estemos pulsando la tecla adecuada en el lugar adecuado: básicamente, si estamos pulsando O en el borde izquierdo de la pantalla deberemos ir a la pantalla que está justo a la izquierda. Tenemos una rutina que pinta la pantalla n que le pasemos, así que habrá que ver también como modificar esa n para movernos por el mapa.

Lo primero es hacernos una rutina que sea la que se encargue de inicializar una nueva pantalla. Por ahora, simplemente llamará a la función que pinta la pantalla e incializará el sprite del prota, pero en un futuro ahí habría que colocar la incialización de los objetos, enemigos, etc. de la pantalla a la que vamos a entrar.

Escribimos la primera Sub de feoncio.bas en su sección de subrutinas, al final del archivo:

Sub initScreen ()
   ' Pintar pantalla

   pintaMapa (MAPOFFSETX, MAPOFFSETY, nPant)

   ' Configurar sprite

   fsp21MoveSprite (3, pX, pY)
   fsp21DuplicateCoordinatesSprite (3)
   fsp21InitSprites ()
End Sub

Ok – Ahora necesitamos algo que aún no hemos especificado: las dimensiones del mapa en pantallas que, como veremos, nos serán utiles para movernos por el mismo. Nos vamos a engine.bas y añadimos dos constantes a las que ya hay, en la zona de constantes:

Const MAPWIDTH As uByte = 6
Const MAPHEIGHT As uByte = 5

Esto define el tamaño de nuestro mapa en pantallas. Vamos a usar la primera de ellas para desplazarnos por el mapa. Aunque nuestro mapa sea un rectángulo, nosotros estamos almacenando todas las pantallas seguidas en una ristra: una fila de pantallas detrás de la otra, en un continuo. El rectángulo es, por tanto, una ilusión. Necesitamos saber el ancho de nuestro mapa en pantallas para poder movernos a la pantalla de arriba (restando el ancho a la pantalla actual) o a la pantalla de abajo (sumando el alto a la pantalla actual). Esto lo vemos fácil con un diagramilla. Imaginate un mapa de 3×3 = 9 pantallas. Estas estarán numeradas de 0 a 8:

0 1 2
3 4 5
6 7 8

Imagínate que estamos en la pantalla 4, la del centro. Para movernos a la pantalla de la izquierda, restamos 1: así nos movemos a la pantalla 3. Para ir a la pantalla de la derecha, sumamos 1: así nos movemos a la pantalla 5. Para ir a la pantalla de arriba, tenemos que restar el ancho del mapa, o sea, 3: 4 – 3 = 1. Para ir a la pantalla de abajo, tenemos que sumar el ancho del mapa: 4 + 3 = 7. ¿Véis como funciona?

Recordemos, además, otro concepto: las comprobaciones hay que hacerlas si el muñeco llega al borde de la pantalla y pulsa la dirección correcta (por ejemplo, si pulsa abajo en el borde inferior de la pantalla). ¿Cuándo está el jugador en los bordes de la pantalla? Los bordes de la izquierda y de arriba son fáciles: cuando, respectivamente, pX = 0 y pY = 0. ¿Cuándo estará en el borde de la derecha? Pues cuando pX = MAPSCREENWIDTH + MAPSCREENWIDTH – TILESIZE. ¿Y en el de abajo? Cuando pY = MAPSCREENHEIGHT + MAPSCREENHEIGHT – TILESIZE. Ya lo vimos en el capítulo anterior.

Recordad que multiplicamos por dos (sumamos las dimensiones con ellas mismas, que es lo mismo, pero más rapido) porque MAPSCREENWIDTH y MAPSCREENHEIGHT están en tiles, y nosotros nos movemos de caracter en caracter. El – TILESIZE del final es porque es lo que ocupa un tile (y lo que ocupa el sprite) y estaremos mirando el borde desde dentro. Como siempre, ante la duda te pillas una hoja de cuadritos y te lo pintas todo (un cuadrito por caracter). Contando cuadritos se aprende una barbaridad.

Por tanto, añadiremos 4 IFs al final del bucle principal, en feoncio.bas, justo después de la llamada a fsp21UpdateSprites ():

   ' Cambiar de pantalla

   ' O en el borde izquierdo:
   If (In (57342) bAnd 2) = 0 And pX = 0 Then
      nPant = nPant - 1
      pX = MAPSCREENWIDTH + MAPSCREENWIDTH - TILESIZE
      initScreen ()
   End If

   ' P en el borde derecho:
   If (In (57342) bAnd 1) = 0 And pX = MAPSCREENWIDTH + MAPSCREENWIDTH - TILESIZE Then
      nPant = nPant + 1
      pX = 0
      initScreen ()
   End If

   ' Q en el borde superior
   If (In (64510) bAnd 1) = 0 And pY = 0 Then
      nPant = nPant - MAPWIDTH
      pY = MAPSCREENHEIGHT + MAPSCREENHEIGHT - TILESIZE
      initScreen ()
   End If

   ' A en el borde inferior
   If (In (65022) bAnd 1) = 0 And pY = MAPSCREENHEIGHT + MAPSCREENHEIGHT - TILESIZE Then
      nPant = nPant + MAPWIDTH
      pY = 0
      initScreen ()
   End If

Como véis, en cada caso, actualizamos nPant, que es el número de pantalla actual, y además actualizamos una de las coordenadas. Por ejemplo: si vas a salir por la derecha (pX = MAPSCREENWIDTH + MAPSCREENWIDTH – TILESIZE), tendremos que entrar por la izquierda en la siguiente pantalla (pX = 0). Finalmente, llamamos a nuestra nueva rutina initScreen, que pintará la pantalla especificada por nPant e inicializará correctamente nuestro sprite.

¡Ya podemos explorar el mapa! Por cierto: no hacemos comprobaciones, así que si te sales del mapa pasarán cosas divertidas. Procura que tu mapa esté cerrado (no puedas salirte).

Descárgate el paquetillo y date una vuelta.

3 Responses to Tutorial de ZX Basic + Fourspriter #18: Cambiando de pantalla

  1. josepzin dice:

    Seguro que toda la lógica para esto de los mapas me servirá, nunca hice un juego con mapa, siempre ha sido pasapantalla.

  2. na_th_an dice:

    Si necesitas un conversor pero que exporte código C, dímelo y te paso el de la Churrera (del que está sacado este de Basic)😉

  3. josepzin dice:

    Buf, hasta que yo me ponga a hacer algo!!😛 (pero gracias por el ofrecimiento!)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: