Minilop Retroware

MPAGD Principiantes · Parte 17 de 29

Vamos a crear un juego con MPAGD, Parte 17: Introducción a los OBJECTs

17 de octubre de 2021

Ya en la Parte 11 introdujimos objetos coleccionables en nuestro juego, en nuestro ejemplo, huesos que Stinky Dog necesita recoger para avanzar. Pero hay otro tipo de elemento que puedes usar en tu juego, y ofrece mucha más flexibilidad que los coleccionables.

El problema de los COLLECTABLE BLOCKS es que todos se tratan igual: los recoges colocando una sentencia GETBLOCKS en tu evento del jugador, que comprueba si el jugador está tocando en ese momento un bloque coleccionable y, si es así, lo quita de la pantalla y ejecuta el evento COLLECT BLOCKS.

Y ahí está el problema.

MPAGD no sabe qué BLOCK concreto has recogido, así que si tienes distintos tipos de coleccionables, quizá quieras que tengan puntuaciones distintas, bonificaciones o que den mejoras al jugador, y eso no se consigue fácilmente con los COLLECTABLE BLOCKS.

Los OBJECTs, en cambio, son un poco distintos. Son elementos que puedes diseñar como imágenes de 16 x 16 px (los bloques son de 8 x 8 en el Speccy). Cada objeto tiene un estado de 'posesión', es decir, ¿dónde está el OBJECT ahora mismo? Puede ser:

Además, cada OBJECT tiene un número identificador que podemos usar en nuestro código para:

Como ves, los OBJECTs son bastante útiles. Tanto los OBJECTS como los COLLECTIBLE BLOCKS tienen sus pros y sus contras, y tendrás que tenerlos en cuenta al decidir cuándo usar OBJECTS y cuándo COLLECTIBLE BLOCKS.

Algunas de las ventajas de los OBJECTs son:

Algunos de los inconvenientes de los OBJECTs son:

En cuanto a los COLLECTABLE BLOCKS, algunas de las ventajas son:

Los inconvenientes de los COLLECTABLE BLOCKS

En general, el único uso que realmente le veo a los COLLECTABLE BLOCKS es en juegos tipo Manic Miner, donde necesitas recoger todos los objetos para pasar a la siguiente pantalla. Si estás escribiendo un juego de aventura arcade, lo mejor probablemente sean los OBJECTS.

En mis juegos, los objetos me resultan útiles para cosas como:

También pueden usarse como banderas (flags) cuando te has quedado sin variables en ciertas circunstancias, según el tipo de juego, pero eso es un tema algo más avanzado que trataré otro día1.

Por ahora, vamos a crear un objeto para nuestro juego. En el menú Editor selecciona OBJECTS:

Captura de pantalla del tutorial

He creado un cuenco de comida para perros. Notarás que el editor es muy parecido al SPRITE EDITOR, pero hay algunas diferencias:

Primero, podemos establecer el color del objeto (en el Speccy, solo el color de primer plano) haciendo clic en el cuadro de color de arriba a la derecha... lo he cambiado a rojo

Segundo, fíjate en el cuadro blanco de la derecha, que nos indica:

Pulsa el cursor arriba o abajo para elegir la opción que quieras; la predeterminada es CARRYING, lo que significa que está en el inventario del jugador.

La siguiente opción es HIDDEN: significa que no está en el inventario del jugador ni en una pantalla concreta

Pulsa el cursor arriba otra vez y cambiará a ROOM 000 (es decir, SCREEN 0 )

Seleccionemos ROOM 000 y, para colocarlo en pantalla, pulsa la tecla P:

Captura de pantalla del tutorial

Esto te llevará a la SCREEN 0 y colocará el OBJECT en la esquina superior derecha

No lo queremos ahí, así que hacemos clic en la pantalla donde queremos colocar el objeto:

Captura de pantalla del tutorial

Hecho esto, volvamos al editor de OBJECTs (Editor > Objects) y creemos algunos más:

Para crear un nuevo Object pulsa la tecla X,

Captura de pantalla del tutorial

He creado un objeto lata de comida para perros, pero esta vez lo he puesto como 'Hidden'; quizá lo use más adelante como bonificación... ya veremos.

Vale, ya con algunos objetos creados, necesitaremos poner código en el PLAYER EVENT que gestione lo que ocurre cuando el jugador toca un OBJECT.

DETECTOBJ           ; is sprite touching an object?
IF OBJ <> 255       ; did we detect an object?
    GET OBJ         ; automatically pick it up.
ENDIF

El comando DETECTOBJ comprueba si el jugador está tocando un OBJECT; si es así, guarda el número del OBJECT en la variable OBJ, y si no toca ninguno, el valor de OBJ se pone a 255.

Por eso comprobamos si el valor de OBJ NO es 255 ( el <> significa NO ES )

y si no es 255, debemos estar tocando un OBJECT, así que hacemos GET OBJ, es decir, cogemos el OBJECT cuyo número está guardado en ese momento en la variable OBJ.

Vamos a probarlo, pero antes escribiremos un poco más de código que ponga un mensaje en pantalla diciéndonos que hemos recogido el DOG BOWL.

DETECTOBJ           ; is sprite touching an object?
IF OBJ <> 255       ; did we detect an object?
    GET OBJ         ; automatically pick it up.
    IF OBJ = 0      ; is it the Dog Bowl
      AT 10 4       ; at line 10 column 4
      COLOUR 13     ; green ink on blue paper
      PRINT "you got the dog food bowl!"   ; display a message
      DELAY 50      ; wait a couple of seconds
      WAITKEY       ; then wait for a key press
      REDRAW        ; redraw the screen & remove the message
    ENDIF
ENDIF

Esto es lo que debería pasar:

¿Viste que, después de poner un mensaje en pantalla diciendo que habíamos recogido el cuenco de comida, tuvimos que usar el comando REDRAW para quitar el mensaje, y al hacerlo todos los huesos COLLECTIBLE que habíamos recogido volvieron a aparecer en pantalla?

Cuando estás empezando es importante entender la diferencia entre los COLLECTIBLE blocks y los OBJECTs, y que no siempre se llevan bien entre ellos.

Volveremos a ver los OBJECTs más adelante en esta serie, a medida que se desarrolle nuestro juego.

SIGUIENTE: PARTE 18: DIG estos FODDERBLOCKS

Todo MPAGD Principiantes