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:
CARRYING : El jugador tiene el objeto en su inventario
En una pantalla concreta, en una posición X Y concreta
HIDDEN : Ni en una pantalla ni en poder del jugador
Además, cada OBJECT tiene un número identificador que podemos usar en nuestro código para:
PUT: colocar el objeto en una posición concreta de la pantalla actual
GET: coger el objeto para que pase a formar parte del inventario del jugador
Comprobar IF GOT o WHILE GOT para ver si el jugador tiene el objeto concreto y, si es así, ejecutar algo de código.
REMOVEOBJ: quitar un objeto
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:
Imágenes de 16x16 px que permiten gráficos más interesantes
Más flexibilidad al programar
Permiten usar el inventario del jugador (INV)
Cuando el jugador recoge un OBJECT, permanece en su inventario hasta que hacemos REMOVEOBJ
Algunos de los inconvenientes de los OBJECTs son:
Cada objeto usa más memoria que un COLLECTABLE BLOCK
Si quieres varios del mismo OBJECT, tendrás que crear varias versiones del OBJECT
En cuanto a los COLLECTABLE BLOCKS, algunas de las ventajas son:
Son ligeros y usan poca memoria
Puedes tener varios coleccionables en cada pantalla usando solo 1 bloque
Los inconvenientes de los COLLECTABLE BLOCKS
Se vuelven a dibujar en pantalla después de haberlos recogido si vuelves a entrar en una pantalla o si usas el comando REDRAW, o MENU
No puedes (fácilmente) saber qué bloque se ha recogido.
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:
Recompensas
Power ups
Bonificaciones
Cajas de botín
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:

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:
El número del OBJECT (0)
La ubicación actual del OBJECT
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:

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:

Hecho esto, volvamos al editor de OBJECTs (Editor > Objects) y creemos algunos más:
Para crear un nuevo Object pulsa la tecla X,

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.
ENDIFEl 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.
